Actionscript碰撞无法正常工作

时间:2011-05-10 21:18:44

标签: arrays actionscript collision

我正在制作游戏并遇到了一个我无法弄清楚的问题。玩家是一艘船,船可以放下地雷(通过太空钥匙)。我在init()中创建了一个Mine()数组:

function initGame():void
{
    level = 1;
    player = new Player();
    //Create an enemies array
    enemies = new Array();
    //Create a plane array
    planes = new Array();
    crates = new Array();
    explosions = new Array();
    mines = new Array();
    var tempMine:MovieClip;
    for(var i:Number = 1; i < 4; i++){
        tempMine = new Mine();
        mines.push(tempMine);
        minesTxt.text = String(mines.length);
    }
    gameState = STATE_START_PLAYER;
    rightKeyIsDown = false;
    leftKeyIsDown = false;
    upKeyIsDown = false;
    downKeyIsDown = false;
    trace(gameState);

}

我有一个叫做releaseKey()的函数来处理键盘事件,这里的地雷被添加到屏幕上:

function releaseKey(event:KeyboardEvent):void
{
    var thisKey:uint = event.keyCode;
    if (thisKey == Keyboard.RIGHT)
    {
        rightKeyIsDown = false;
    }
    if (thisKey == Keyboard.LEFT)
    {
        leftKeyIsDown = false;
    }
    if (thisKey == Keyboard.UP)
    {
        upKeyIsDown = false;
    }
    if(thisKey == Keyboard.SPACE){
        var tempMine:MovieClip;
        if(mines.length > 0){
        tempMine = new Mine();
        tempMine.y = player.y;
        tempMine.x = player.x;
        addChild(tempMine);
        mines.length--;
        minesTxt.text = String(mines.length);
        }else if(mines.length == 0){
            minesTxt.text = String(0);

        }
    }
}

我的碰撞检查功能出现问题。我得到一个TypeError:错误#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]);
                }
            }

        }

    }
}

1 个答案:

答案 0 :(得分:1)

只是想在处理显示对象时给出一条建议,这些显示对象也是在单独的数组中维护的。

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

除非有将其保留在那里的目的,否则你应该建立一个同样从数组中删除它们的机制。例如,函数如:

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
   [....]
}

拼接数组可能不是最优化的解决方案(链表应该更好),但对于小数组(数十,甚至数百),它应该没关系。

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

希望它有所帮助。

- 米赫内亚