0

所以我试图制作一个子弹船 hitTestObject ,但我不知道为什么代表 bullets.length 的变量不会改变。

所以错误来自这个函数

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

4

2 回答 2

0

由于您从长度 1 向下迭代到 0,因此当循环退出时 bcount 的值将为 0,因此这就是跟踪将显示的值。

空参数错误是因为您删除了碰撞的船和子弹,然后在 while 语句的下一个循环中,您在与第一次相同的索引处测试数组中的对象。如果任何对象碰巧位于数组的末尾,则该位置现在将为空。要解决此问题,请用 if 语句替换 while 循环。

通常,在迭代数组元素时更改数组时必须小心,因为对象的位置会发生变化,并且您必须(就像您所做的那样)从最后一个元素迭代到第一个元素。

于 2013-08-19T22:30:54.050 回答
0

尝试bcount在循环内跟踪。你在循环之前跟踪它。

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);
                      }
            }
  }}

试试看。

于 2013-08-19T22:40:40.187 回答