TypeError:错误#2007:参数hitTestObject必须为非null。为什么

时间:2013-08-19 22:12:05

标签: actionscript-3 flash

所以我试图制作一个子弹击中的测试对象,但我不知道为什么表示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

2 个答案:

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

试试吧。