AS3出错:TypeError:错误#1010:术语未定义且没有属性

时间:2015-06-03 23:17:48

标签: arrays actionscript-3 exception runtime-error

我试图创建一个涉及子弹数组和僵尸数组的碰撞代码。但是当它尝试这段代码时:

    for(var bu:int = 0;bu < bullets.length; bu++){
        for(var zo:int = 0;zo < zombieCount.length; zo++){
            if(bullets[bu].hitTestObject(zombieCount[zo])){
                stage.removeChild(zombieCount[zo]);
                zombieCount.splice(zo, 1);
                stage.removeChild(bullets[bu]);
                bullets.splice(bu, 1);

                trace("hot hit")
            }
        }
    }

我有时会收到错误消息。我试过这段代码:

    for(var bu:int = 0;bu < bullets.length; bu++){
        for(var zo:int = 0;zo < zombieCount.length; zo++){
            if(bullets[bu].hitTestObject(zombieCount[zo])){
                stage.removeChild(zombieCount[zo]);
                if(zombieCount.splice(zo,1)!=null){
                    zombieCount.splice(zo, 1)
                }
                stage.removeChild(bullets[bu]);
                bullets.splice(bu, 1)
                if(bullets.splice(bu,1)!=null){
                    bullets.splice(bu, 1)
                }               
                trace("hot hit")
            }
        }
    }

然而,即使信息没有出现,对象(或者更确切地说是它的遗骸?)就会停在那里。如果我回到原始代码,我将继续收到错误消息。请帮忙。

1 个答案:

答案 0 :(得分:1)

问题很可能是因为两件事:

  1. 您将数组拼接在一个循环中,该循环遍历所述数组。

    如果您要这样做,您应该向后迭代,这样就不会搞砸索引。

  2.   

    例如,让我们说zombieCount有3个元素。第一次迭代zo = 0,让我们说你的命中测试成功,你拼接数组,现在zombieCount有2个元素。下一次迭代zo=1,但以前由zombieCount[1]引用的项实际上是zombieCount[0]。所以你最终跳过了一件物品。

    1. 你移除子弹,但不要突破内循环(循环遍历所有僵尸) - 这里的问题是如果不止一个僵尸触及子弹,你最终会试图多次移除子弹并无意中将不同的子弹拼接出阵列。该错误可能是因为在某些时候您的索引bu因此问题而变得超出范围。
    2.   

      例如,让我们说bullets数组有2个元素,而你的僵尸数组有3个元素。第一次迭代bu0,让我们说命中测试成功在阵列中的第一个僵尸上。所以你拼接bullets,现在有1个元素。让我们说数组中的第二个僵尸也通过了最热门的测试。现在再次拼接bullets,除了它是第二个最终拼接的项目。让我们说数组中的第三个僵尸也传递了hitest,现在bullets数组中没有任何东西,但你还是试图拼接它并从舞台上删除不存在的对象。 / p>

      请改为尝试:

      //iterate backwards, so if you remove an item from the array, it's always the last item and won't throw off order of the array
      for(var bu:int = bullets.length-1;bu >= 0; bu--){
          for(var zo:int = zombieCount.length-1;zo >= 0; zo--){
              if (bullets[bu].hitTestObject(zombieCount[zo])) {
                  //remove the zombie
                  stage.removeChild(zombieCount[zo]);
                  zombieCount.splice(zo, 1);
      
                  //remove the bullet
                  stage.removeChild(bullets[bu]);
                  bullets.splice(bu, 1);
      
                  trace("hot hit");
      
                  break; //break out of this inner loop (through all zombies), since the bullet has been destroyed
              }
          }
      }