错误的AS3:类型错误:错误#1010:一个术语是不确定的,没有属性(Error on AS3: T

2019-10-23 06:40发布

我试图创建涉及子弹阵列和僵尸阵列碰撞代码。 但是,当它试图这样的代码:

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

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

Answer 1:

最有可能的问题是因为两件事情:

  1. 你拼接一个循环遍历所述阵列内转发您的阵列。

    如果你要做到这一点,你应该因此它不会弄乱索引向后遍历。

举例来说,假设zombieCount有3个要素。 第一次迭代zo = 0 ,假设你的命中测试成功,你拼接阵列,现在zombieCount有2个元素。 下一次迭代, zo=1 ,但所用的项目要由引用zombieCount[1]实际上是zombieCount[0]现在。 所以,你已经结束了跳绳项目。

  1. 您删除的子弹,但没有打破从内环路(即通过所有的僵尸环路)的 - 这里的问题是,如果不止一个僵尸被触摸子弹,你最终会试图子弹多次删除和未有意接续不同的子弹从数组中。 该错误可能是因为在某些时候你的索引bu变成超出范围,因为这问题的结果。

对于〔实施例,假设bullets阵列有2种元素和你的僵尸数组有3元素。 第一次迭代bu0 ,我们说的则hitTest成功对数组中的首个僵尸。 所以,你拼接bullets ,现在有1元。 比方说,在数组中的第二个僵尸也传递则hitTest。 现在,您的拼接bullets再次,除了它是最终得到拼接的第二个项目。 比方说,在数组中的第三个僵尸经过hitest过,现在没有什么留下的bullets阵列,但是你想反正拼接,并从舞台中删除不存在的对象。

试试这个:

//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
        }
    }
}


文章来源: Error on AS3: TypeError: Error #1010: A term is undefined and has no properties