Arrays Actionscript冲突不工作

Arrays Actionscript冲突不工作,arrays,actionscript,collision,Arrays,Actionscript,Collision,我正在做一个游戏,遇到了一个我一直无法解决的问题。玩家是一只船,船可以投水雷(通过空格键)。我在init()中创建了一个Mine()数组: 问题出现在我的碰撞检查功能中。我得到一个TypeError:Error#2007:参数hitTestObject必须为非null。我想我创建地雷并将其添加到阵列中的方式存在问题,但我看不出问题出在哪里 function testCollisions():void { var tempEnemy:MovieClip; var tempCrate

我正在做一个游戏,遇到了一个我一直无法解决的问题。玩家是一只船,船可以投水雷(通过空格键)。我在init()中创建了一个Mine()数组:

问题出现在我的碰撞检查功能中。我得到一个TypeError:Error#2007:参数hitTestObject必须为非null。我想我创建地雷并将其添加到阵列中的方式存在问题,但我看不出问题出在哪里

function testCollisions():void
{
    var tempEnemy:MovieClip;
    var tempCrate:MovieClip;
    var tempMine:MovieClip;

    enemy:for (var i:int=enemies.length-1; i>=0; i--)
    {
        tempEnemy = enemies[i]; 
        for (var j:int=crates.length-1; j>=0; j--)
        {
            tempCrate = crates[j];
            if (tempEnemy.hitTestObject(tempCrate))
            {
                if (crates[j].parent)
                {
                    crates[j].parent.removeChild(crates[j]);
                }
                break enemy;
            }
            if (tempEnemy.hitTestObject(player))
            {
                if (player.parent)
                {
                    trace("Hit!!!!!!!!!!!!!!!!!!!!");
                    makeExplosion(player.x, player.y);
                    player.parent.removeChild(player);
                }
                break enemy;
            }
            tempMine=mines[i];
            if (tempEnemy.hitTestObject(tempMine))
            {
                if (tempEnemy.parent)
                {
                    trace("BOOM!!!!!!!!!!!!!!!!!!!!");
                    makeExplosion(tempEnemy.x, tempEnemy.y);
                    player.parent.removeChild(tempEnemy);
                }
                break enemy;
            }
            if (player.hitTestObject(tempCrate))
            {
                if (crates[j].parent)
                {
                    crates[j].parent.removeChild(crates[j]);
                }
            }

        }

    }
}

我只想给你一条建议,当你处理显示对象的时候,你也会在不同的数组中维护它们

我可以看到: -您正在使用自己制作的数组分析对象(板条箱或敌人)。 -您可以将它们从各自的显示列表中删除,但不会将它们从阵列中删除

您应该建立一种机制,将它们从阵列中移除,除非有目的将它们保留在阵列中。例如,函数如下:

function RemoveCrate(index) : void
{
   crates[index].parent.removeChild(crates[index]); /// remove from display list
   crates.splice(index, 1); /// remove reference from the array;
}
我没有像你那样故意检查父级,因为我假设它应该有一个父级,如果没有,我想抛出一个错误,因为这意味着我的其余代码有问题

另外,如果您正在解析数组并删除元素,而没有在删除时中断迭代,则还应按如下方式减少迭代器:

for(var i:int = 0; i < crates.length; i++)
{
   [....]
   RemoveCrate(i);
   i --;  // not doing this after deletion will skip one element in the next iteration
   [....]
}
for(变量i:int=0;i
拼接阵列可能不是最优化的解决方案(链表应该更好),但对于小型阵列(十个,甚至数百个),这并不重要

最后一件事。。。不从数组中删除对象将保留对它们的引用,这将使垃圾收集器跳过它们

希望能有帮助

--
米娜

明白了。我创建了两个阵列,一个用于库存地雷,一个用于板上地雷。这似乎解决了问题。啊,谢谢米娜。这是一个很好的建议,我会记住的。
function RemoveCrate(index) : void
{
   crates[index].parent.removeChild(crates[index]); /// remove from display list
   crates.splice(index, 1); /// remove reference from the array;
}
for(var i:int = 0; i < crates.length; i++)
{
   [....]
   RemoveCrate(i);
   i --;  // not doing this after deletion will skip one element in the next iteration
   [....]
}