所以我试图制作一个子弹击中的测试对象,但我不知道为什么表示bullets.length doest的变量会发生变化。
所以错误来自这个函数
function doShips() {
trace("bcount :" + bcount)
trace("_bulletsArray length:" + _bulletsArray.length)
for (var i:int = shipArray.length - 1; i >= 0; i--) {
shipArray[i].moveDown() //what the code in the Ship and Ship2 class does -> only: this.y += 3
for (var bcount= _bulletsArray.length-1; bcount >= 0; bcount--) {
//if the bullet is touching the ship
while (shipArray[i].hitTestObject(_bulletsArray[bcount])) {
//if we get here it means there`s is a collision
removeChild(_bulletsArray[bcount]);
_bulletsArray.splice(bcount,1);
removeChild(shipArray[i]);
shipArray.splice(i,1);
}
}
}
}
在此之前,我还有射击功能,射击子弹并将它们放入_bulletsArray。当痕迹出现时,它显示: 当我不拍子弹时,它给了我这个
_bulletsArray length: 0
bcount: 0
当我拍摄时它给了我这个:
bcount: 0
_bulletsArray length: 1
或
bcount: 0
_bulletsArray length: 2
那么为什么当_bulletsArray改变时bcount没有改变,当我告诉它在for (var bcount= _bulletsArray.length-1; bcount >= 0; bcount--) {
中这样做时
更糟糕的是 - 当我将'bcount转换为数字'bcount:Number'数据类型时,它给了我NaN
答案 0 :(得分:0)
由于您从length-1向下迭代到0,因此当循环退出时bcount的值将为0,这是跟踪将显示的值。
null参数错误是因为您删除了碰撞的船只和子弹,然后在while语句的下一个循环中,您在第一次使用相同索引处测试数组中的对象。如果任何对象恰好位于数组的末尾,那么该位置现在将为null。 要解决此问题,请使用if语句替换while循环。
一般情况下,在迭代元素时更改数组时要小心,因为对象的位置发生变化,你必须(就像你一样)从最后一个元素迭代到第一个元素。
答案 1 :(得分:0)
尝试在循环内跟踪bcount
。你在Loop之前跟踪它。
function doShips() {
trace("bcount :" + bcount)
trace("_bulletsArray length:" + _bulletsArray.length)
for (var i:int = shipArray.length - 1; i >= 0; i--) {
shipArray[i].moveDown() //what the code in the Ship and Ship2 class does -> only: this.y += 3
for (var bcount= _bulletsArray.length-1; bcount >= 0; bcount--) {
//if the bullet is touching the ship
while(shipArray[i].hitTestObject(_bulletsArray[bcount])) {
//if we get here it means there`s is a collision
removeChild(_bulletsArray[bcount]);
_bulletsArray.splice(bcount,1);
removeChild(shipArray[i]);
shipArray.splice(i,1);
trace("bcount: " + bcount);
}
}
}}
试试吧。