as3对象数组 - 以恒定速度运动

时间:2015-06-02 23:39:19

标签: arrays actionscript-3 flash

好的,所以我对as3和一些基础知识有一些经验。但这个问题一直困扰着我。我试图根据我目前所知的as3做一个解决方法。但不知何故,我得到一条错误信息,或者根本没有做任何事情。这是我想要解决的代码。

    var zombieCount:Array = new Array();

    var helltime:Timer = new Timer(1500);
    helltime.addEventListener(TimerEvent.TIMER, spawnzombies)



    helltime.start();
    function spawnzombies(happened:TimerEvent){
        var zombie1:Zombie = new Zombie();
        zombieCount.push(zombie1);
        stage.addChild(zombieCount[zombieCount.length - 1]);
        zombie1.x = 135 + (330*Math.random())
        zombie1.y = -29


        stage.addEventListener(Event.ENTER_FRAME, move_zombie)

        function move_zombie(happened:Event){
            for(var i:int; i < zombieCount.length; i++){
                zombieCount[i].y = zombieCount[i].y + 1;
                if(zombieCount[i].hitTestObject(border)){
                    stage.removeChild(zombieCount[i]);
                    zombieCount.shift();
                    trace(zombieCount.length);
                }

            }



        }
    }

1 个答案:

答案 0 :(得分:1)

虽然这可能不包含所有错误,但至少有一些我看到的问题。

  1. 内联函数问题:

    在计时器刻度处理程序(spawnZombies)中,创建一个名为move_zombie的内联函数,然后添加一个调用该函数的输入框处理程序。

    这里的问题是,计时器的每个刻度,然后将创建该函数的全新副本,并添加另一个输入帧处理程序。经过一些计时器滴答后,这将产生巨大的问题。

    move_zombie函数打开spawn函数:

    例如:

    helltime.addEventListener(TimerEvent.TIMER, spawnzombies)
    helltime.start();
    
    stage.addEventListener(Event.ENTER_FRAME, move_zombie);
    
    function move_zombie(......
    
    function spawnzombies(.....
    
  2. 迭代问题:

    在你的for循环中:

        for(var i:int; i < zombieCount.length; i++){
            zombieCount[i].y = zombieCount[i].y + 1;
            if(zombieCount[i].hitTestObject(border)){
                stage.removeChild(zombieCount[i]);
                zombieCount.shift();
                trace(zombieCount.length);
            }
        }
    

    您没有初始化i值。虽然这会将其默认为0,但对于初始化它的可读性仍然是一个好主意。

    所以你从0向前迭代到数组的末尾。但是,如果命中测试成功,则使用数组的shift方法。这将删除数组的第一个项(无论当时的值i如何)。这将删除错误的项目,加上zombieCount[i]引用的内容(因为在转移后项目的数量现在已经改变,因此下一次迭代zombieCount[i]将是对前一个项目的引用迭代)。

    而不是您当前正在执行的操作,请使用splice方法删除,然后向后迭代,以便您的索引不会出现问题。

    for(var i:int=zombieCount.length-1;i >=0;i--){
        zombieCount[i].y += 1; //move it down 1 pixel
        if(zombieCount[i].hitTestObject(border)){
            stage.removeChild(zombieCount[i]);
            zombieCount.splice(i,1); //remove the item at the current index (do this instead of shift)
            trace(zombieCount.length);
        }
    }