我有一个可用于某种轮次的射击游戏,例如,这一轮将在屏幕上显示用户必须射击的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个活着的敌人,那么线程会尝试运行这些方法并且会崩溃。每当我需要时,我总是使用相同的变量启动计时器。我怎么解决这个问题?我是否必须将每个“线程”(计时器)存储在列表中,然后分别停止每个“线程”?因为它的方式,其他线程处于某种“边缘”,然后我不能停止,只是最后一个。
有帮助吗?
谢谢!
答案 0 :(得分:1)
首先,非常快,我只是说这里没有线程,AS3没有任何多线程。因此,让我们避免使用该词,因为它具有非常具体的含义。这不是它,使用它会导致混淆。
现在针对您的问题,是的,当您完成它们时,您将需要停止每个计时器。因此,您需要保留对每个参考的引用,然后在切换场景时调用停止或重置。一种简单的方法是将它们全部存储在一个数组中,并在需要停止时循环遍历它。
希望这有帮助,如果您有任何其他问题,请与我联系。
答案 1 :(得分:1)
通常在游戏情况下,为了避免多个计时器(以及运行它们的开销/性能),会有一个连续运行的计时器(只要游戏处于活动状态),称为类似GameLoop和对象将根据需要注册/注销。
顺便提一下,这也提供了暂停游戏的简单方法。
我确信这有一个很好的理由,但是如果你在AS3中覆盖一个Timer实例,那么前一个计时器将无限期地继续运行而无法阻止它(因为它的指针将被覆盖)。所以你要在覆盖它们之前停止任何计时器,正如泰勒所说。