Цитата:
|
Ну, тут ниже вроде как выясняется, что это тоже зло, и "вообще так нельзя" : )
|
Иметь метод 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();
}
}