如何删除同一数组的新计时器?
How to remove a new timer of the same array?
大家好,我有一个数组 private var aFishArray:Array;
,它在我的构造函数中设置了计时器。
tFishTimer = new Timer(800);
//Listen for timer intervals/ticks
tFishTimer.addEventListener(TimerEvent.TIMER, addMainFish,false,0,true);
//Start timer object
tFishTimer.start();
然后在结束游戏条件中我删除了计时器 tFishTimer.removeEventListener(TimerEvent.TIMER, addMainFish);
tFishTimer.stop();
现在这很完美,但问题是当我在一个单独的函数中为同一实例创建一个新计时器时,就像这样
private function checkFishPowerHitBucket():void
{
for (var j:int = 0; j < aFishPowerUpArray.length; j++)
{
//get current fish in j loop
var currentfPower:mcMoreFishPowerUp = aFishPowerUpArray[j];
//test if current fish is hitting bucket
if (currentfPower.hitTestObject(bucket))
{
//If we want timer to only run a certain amount of times then new Timer(1000, ??)
tFishTimer = new Timer(100, 30);
//Listen for timer intervals/ticks
tFishTimer.addEventListener(TimerEvent.TIMER, addMainFish, false, 0, true);
//Start timer object
tFishTimer.start();
}
}
}
然后在我的游戏结束条件下尝试删除计时器和电影剪辑,使其不再进入屏幕。鱼只是不断出现在屏幕上。当游戏结束时,我能做些什么来删除这些计时器的所有实例。我在想,通过创建一个具有相同数组的新计时器,它会在启动新计时器时取消删除它的命令吗?任何帮助将不胜感激谢谢。
这里还有 addMainFish();函数
private function addMainFish(e:Event):void
{
//Create new fish object
var newFish = new mcMainFish();
//Add fish object to stage
stage.addChild(newFish);
//Add fish to fish Array
aFishArray.push(newFish);
//trace(aFishArray.length);
}
它并不是真正的 'delete' 旧计时器,但实际情况是,当您创建新计时器并将其存储在同一个变量中时,您丢失了对旧计时器的引用,所以它只是驻留在内存中的某个地方,永远运行(或者直到它达到它的极限,如果它有一个)。
解决这个特殊问题的一种方法是保留对旧计时器的引用,例如在一个数组中,然后当你创建一个新计时器时,先将旧计时器移动到一个计时器数组中,这样你仍然可以访问它。
我不推荐这个。
拥有多个像这样的计时器会降低性能并可能导致相当大的不可预测性。此外,它可能会导致一些困难的调试,因为您可能无法跟踪哪个计时器导致哪个事情失败,对象试图访问相同数据的奇怪实例,必须处理这么多对象本身,等等
您可以做的只是拥有一个专用计时器,并在该计时器内对需要它的每个对象执行所有处理。您也可以完全避免使用计时器,而只使用您的游戏循环来执行此逻辑。
This post 说明了类似的问题,那里的答案与我在此处提到的类似。
大家好,我有一个数组 private var aFishArray:Array;
,它在我的构造函数中设置了计时器。
tFishTimer = new Timer(800);
//Listen for timer intervals/ticks
tFishTimer.addEventListener(TimerEvent.TIMER, addMainFish,false,0,true);
//Start timer object
tFishTimer.start();
然后在结束游戏条件中我删除了计时器 tFishTimer.removeEventListener(TimerEvent.TIMER, addMainFish);
tFishTimer.stop();
现在这很完美,但问题是当我在一个单独的函数中为同一实例创建一个新计时器时,就像这样
private function checkFishPowerHitBucket():void
{
for (var j:int = 0; j < aFishPowerUpArray.length; j++)
{
//get current fish in j loop
var currentfPower:mcMoreFishPowerUp = aFishPowerUpArray[j];
//test if current fish is hitting bucket
if (currentfPower.hitTestObject(bucket))
{
//If we want timer to only run a certain amount of times then new Timer(1000, ??)
tFishTimer = new Timer(100, 30);
//Listen for timer intervals/ticks
tFishTimer.addEventListener(TimerEvent.TIMER, addMainFish, false, 0, true);
//Start timer object
tFishTimer.start();
}
}
}
然后在我的游戏结束条件下尝试删除计时器和电影剪辑,使其不再进入屏幕。鱼只是不断出现在屏幕上。当游戏结束时,我能做些什么来删除这些计时器的所有实例。我在想,通过创建一个具有相同数组的新计时器,它会在启动新计时器时取消删除它的命令吗?任何帮助将不胜感激谢谢。
这里还有 addMainFish();函数
private function addMainFish(e:Event):void
{
//Create new fish object
var newFish = new mcMainFish();
//Add fish object to stage
stage.addChild(newFish);
//Add fish to fish Array
aFishArray.push(newFish);
//trace(aFishArray.length);
}
它并不是真正的 'delete' 旧计时器,但实际情况是,当您创建新计时器并将其存储在同一个变量中时,您丢失了对旧计时器的引用,所以它只是驻留在内存中的某个地方,永远运行(或者直到它达到它的极限,如果它有一个)。
解决这个特殊问题的一种方法是保留对旧计时器的引用,例如在一个数组中,然后当你创建一个新计时器时,先将旧计时器移动到一个计时器数组中,这样你仍然可以访问它。
我不推荐这个。
拥有多个像这样的计时器会降低性能并可能导致相当大的不可预测性。此外,它可能会导致一些困难的调试,因为您可能无法跟踪哪个计时器导致哪个事情失败,对象试图访问相同数据的奇怪实例,必须处理这么多对象本身,等等
您可以做的只是拥有一个专用计时器,并在该计时器内对需要它的每个对象执行所有处理。您也可以完全避免使用计时器,而只使用您的游戏循环来执行此逻辑。
This post 说明了类似的问题,那里的答案与我在此处提到的类似。