Показать сообщение отдельно
Старый 27.08.2013, 12:02
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 18  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Ну, тут ниже вроде как выясняется, что это тоже зло, и "вообще так нельзя" : )
Иметь метод restart (или dispose/init) не является плохим тоном. Если Вам это потребовалось, делайте. Смысл dispose-части метода (или отдельного метода) в том, чтобы уничтожить все, что было ранее создано, отписаться от событий и обнулить все ссылки-переменные. То есть привести все к точно такому же виду, как при запуске флешки. В ините же должна происходить вся начальная инициализация. Именно она произойдет при вызове этого метода в конструкторе и отдельно. Конечно же, то, что не нужно уничтожать, оставляйте, тогда в ините нужно будет сделать соответствующие проверки, чтобы оно не создавалось заново. И это не отдельные классы, это просто методы у всего, что нужно.

Давайте рассмотрим на примере: у нас есть некая игра, допустим аэрохоккей. В нем участвуют для простоты три различных объекта: это табло с очками, оппонент и свой игрок. Требуется начать игру заново. Пересоздавать игровое поле и табло нам не нужно, поэтому смело их оставляем. Однако, у табло нужно вызвать соответствующий метод, который бы обнулил очки. Далее, оппонент и свой игрок. Их совсем удалять не следует, а вот остановить логику выполнения, чтобы оппонент перестал играть, а свой игрок реагировать на мышь, нужно.
В итоге в init мы имеем проверки: если оппонент создан, то запускаем логику. Если свой игрок создан, то запускаем логику. Если табло создано, то ничего не делаем.

Немножко псевдокода:
Код AS3:
private function restart():void {
    dispose();
    init();
}
 
private function dispose():void {
    _scoreboard.restart();
 
    // останавливаем логику
    _enemyPlayer.stop();
    // очищаем, если что-либо нужно очистить
    _enemyPlayer.dispose();
 
    // останавливаем логику
    _selfPlayer.stop();
    // очищаем, если что-либо нужно очистить
    _selfPlayer.dispose();
}
 
private function init() {
    if (_enemyPlayer === null) {
        _enemyPlayer = new EnemyPlayer();
    }
    else {
        _enemyPlayer.init();
    }
 
    if (_selfPlayer === null) {
        _selfPlayer = new SelfPlayer();
    }
    else {
        _selfPlayer.init();
    }
 
    if (_scoreboard === null) {
        _scoreboard = new Scoreboard();
    }
}
__________________
тут я