2013-08-19 2 views
0

Так что я пытаюсь сделать hitTestObject для пулемета, но я не знаю, почему переменная, представляющая изменение bullets.length, изменяется.TypeError: Ошибка # 2007: параметр hitTestObject должен быть не нулевым. Почему

поэтому ошибка происходит от этой функции

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 изменяется, когда я говорю это, чтобы сделать это в for (var bcount= _bulletsArray.length-1; bcount >= 0; bcount--) { еще хуже - когда я тип данные в «bcount к числу„bcount: Number“это дает мне NaN

ответ

0

Поскольку вы перебор от длины-1 до 0, значения bcount будет 0, когда петля будет выходить так, чтобы это значение показывало трассировку.

Ошибка нулевого параметра заключается в том, что вы удаляете встречный корабль и пулю, а затем в следующем цикле оператора while вы проверяете объекты в массивах с теми же индексами, что и в первый раз. Если какой-либо из объектов оказался в конце массива, эта позиция теперь будет нулевой. Чтобы исправить это, замените цикл while на инструкцию if.

В общем, вы должны быть осторожны, когда вы меняете массивы во время итерации по их элементам, потому что положение объектов меняется, и вы должны (как вы делали) итерации от последнего элемента до первого.

+0

Кроме того, общее правило: если вы собираетесь перебирать массив и потенциально удалять некоторые из элементов массива, вы всегда должны перебирать массив позади: 'for (var i: int = length - 1; i> = 0; i -) ' –

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

Попробуйте.

+0

попробуйте мой код выше, и вы увидите, что значения bcount изменяются все время. через вашу петлю. –

+0

Вы находитесь внутри объекта WhileLoop, который находится в ForLoop, который вложен в другой родительский ForLoop. Поэтому, когда вы проверяете свой 'hitTestObject' в whileLoop, вы удаляете элементы из Display List и соответствующих массивов. Итак, элементы в массивах: 'shipArray' и' _bulletsArray' удалены. И когда цикл For запускается снова, он не может найти объекты для проверки по этому индексу. Итак, вы получаете параметр hitTestObject должен быть непустым для 'shipArray [i] .hitTestObject (_bulletsArray [bcount])'. –

Смежные вопросы