AS3 Использование нескольких таймеров, чтобы показать / скрыть врагов - PullRequest
0 голосов
/ 14 июля 2011

У меня есть игра-стрелялка, которая работает с какими-то раундами, например, этот раунд покажет 4 врагов на экране, которых должен стрелять пользователь. Я показываю 4 врагов с интервалом в полсекунды, чтобы они не появлялись одновременно. Используя что-то вроде:

enemiesShowTimer = new Timer(0.5 * 1000, 1);
enemiesShowTimer.addEventListener(TimerEvent.TIMER, showEnemyAtTime);
enemiesShowTimer.start();

У игрока есть 2 секунды, чтобы убить каждого врага после его появления, поэтому я также использую это:

enemiesCleanTimer = new Timer(roundConfig.getSecondsPerEnemy() * 1000, 1);
enemiesCleanTimer.addEventListener(TimerEvent.TIMER, cleanEnemies);
enemiesCleanTimer.start();

Проблема в том, что после того, как игрок умирает, я меняю сцену, и если у меня осталось 3 живых врага, потоки попытаются запустить методы, и он рухнет. Я всегда использую одну и ту же переменную для запуска таймера, когда мне это нужно. Как я могу решить это? Должен ли я хранить каждую «ветку» (таймер) в списке, а затем останавливать каждую по отдельности? Потому что так оно и есть, остальные потоки находятся в каком-то «подвешенном состоянии», и я не могу остановиться, только последний.

Любая помощь?

Спасибо!

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Как правило, в игровой ситуации, чтобы избежать нескольких таймеров (и издержек при запуске их), был бы один таймер, который работает непрерывно (пока игра активна), называемый чем-то вроде GameLoop и объектов. будет регистрироваться / отменять регистрацию с этим по мере необходимости.

Кстати, это также предоставляет простой способ приостановить игру.

Я уверен, что для этого есть веская причина, но если вы перезаписываете экземпляр Timer в AS3, предыдущий таймер будет продолжать работать бесконечно без возможности остановить его (так как его указатель будет перезаписан). Поэтому вы захотите остановить любые таймеры, прежде чем перезаписывать их, как упоминал Тайлер.

1 голос
/ 14 июля 2011

Во-первых, очень быстро, я просто скажу, что здесь нет потоков, AS3 не имеет многопоточности. Поэтому давайте избегать использования этого слова, поскольку оно имеет очень конкретное значение. Это не так, и его использование приведет к путанице.

Теперь для вашей проблемы, да, вам нужно будет остановить каждый таймер, когда вы закончите с ними. Таким образом, вам нужно будет сохранить ссылку на каждый из них, а затем вызвать стоп или сброс при переключении сцен. Простой способ - сохранить их все в массиве и просто зациклить его, когда вам нужно их остановить.

Надеюсь, это поможет, дайте мне знать, если у вас есть дополнительные вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...