好的,所以我对as3和一些基础知识有一些经验。但这个问题一直困扰着我。我试图根据我目前所知的as3做一个解决方法。但不知何故,我得到一条错误信息,或者根本没有做任何事情。这是我想要解决的代码。
var zombieCount:Array = new Array();
var helltime:Timer = new Timer(1500);
helltime.addEventListener(TimerEvent.TIMER, spawnzombies)
helltime.start();
function spawnzombies(happened:TimerEvent){
var zombie1:Zombie = new Zombie();
zombieCount.push(zombie1);
stage.addChild(zombieCount[zombieCount.length - 1]);
zombie1.x = 135 + (330*Math.random())
zombie1.y = -29
stage.addEventListener(Event.ENTER_FRAME, move_zombie)
function move_zombie(happened:Event){
for(var i:int; i < zombieCount.length; i++){
zombieCount[i].y = zombieCount[i].y + 1;
if(zombieCount[i].hitTestObject(border)){
stage.removeChild(zombieCount[i]);
zombieCount.shift();
trace(zombieCount.length);
}
}
}
}
答案 0 :(得分:1)
虽然这可能不包含所有错误,但至少有一些我看到的问题。
内联函数问题:
在计时器刻度处理程序(spawnZombies
)中,创建一个名为move_zombie
的内联函数,然后添加一个调用该函数的输入框处理程序。
这里的问题是,计时器的每个刻度,然后将创建该函数的全新副本,并添加另一个输入帧处理程序。经过一些计时器滴答后,这将产生巨大的问题。
将move_zombie
函数打开spawn
函数:
例如:
helltime.addEventListener(TimerEvent.TIMER, spawnzombies)
helltime.start();
stage.addEventListener(Event.ENTER_FRAME, move_zombie);
function move_zombie(......
function spawnzombies(.....
迭代问题:
在你的for循环中:
for(var i:int; i < zombieCount.length; i++){
zombieCount[i].y = zombieCount[i].y + 1;
if(zombieCount[i].hitTestObject(border)){
stage.removeChild(zombieCount[i]);
zombieCount.shift();
trace(zombieCount.length);
}
}
您没有初始化i
值。虽然这会将其默认为0
,但对于初始化它的可读性仍然是一个好主意。
所以你从0向前迭代到数组的末尾。但是,如果命中测试成功,则使用数组的shift
方法。这将删除数组的第一个项(无论当时的值i
如何)。这将删除错误的项目,加上zombieCount[i]
引用的内容(因为在转移后项目的数量现在已经改变,因此下一次迭代zombieCount[i]
将是对前一个项目的引用迭代)。
而不是您当前正在执行的操作,请使用splice
方法删除,然后向后迭代,以便您的索引不会出现问题。
for(var i:int=zombieCount.length-1;i >=0;i--){
zombieCount[i].y += 1; //move it down 1 pixel
if(zombieCount[i].hitTestObject(border)){
stage.removeChild(zombieCount[i]);
zombieCount.splice(i,1); //remove the item at the current index (do this instead of shift)
trace(zombieCount.length);
}
}