操作显示对象数组时出错#1010(AS3)

时间:2014-01-30 22:22:28

标签: arrays actionscript-3 flash displayobject

我在使用显示对象数组时遇到了麻烦。

我要做的是从一些预先制作的块(其宽度与舞台相同)中生成“随机”滚动环境,以一定的速度滚动。所有这些“块”都存储在一个名为“Walls”的movieClip(和类)中,每个帧上有不同的形状,因此我可以创建一个随机数并转到一个随机帧,它代表一个随机形状。

当最后一个到达(0,0)(动画片段的参考点包含其左上角的块)时,块将生成,而下一个将出现在(stage.stageWidth,0)坐标中

(注意:我已经制作了一张图片来更好地解释自己,但由于缺乏“声誉”(我在这里很新),我无法上传。我会在达到它时。)< / p>

嗯,要做到这一点,我最后的赌注是制作一个名为wallArray的数组,并将该数组的每个元素设置为类Walls,并操纵其元素。代码的相关部分是:

var wallArray:Array = new Array();
var index:int = 0;

//In the constructor
for(index = 0; index < 10; index++){
    var aWall:Walls = new Walls();
    randomize = Math.floor(Math.random()*2) + 1;
    aWall.gotoAndStop(randomize);
    wallArray.push(aWall);
}
//Then I add the first element:
index = 0;
stage.addChild(wallArray[0]);

addEventListener(Event.ENTER_FRAME, update_game);
}//End of the constructor

function update_game(e:Event){
        if(wallArray[index].x < 0){
        spawn_wall_piece();
    }
}

function spawn_wall_piece(){
    index++;
        wallArray[index].x = 800;
        wallArray[index].y = 0;
    stage.addChild(wallArray[index]);
}

嗯,由于我不理解的原因,这不起作用。它编译和所有,但我一直收到这个错误:

错误#1010:术语未定义且没有属性。

我非常感谢任何帮助/评论/想法。提前谢谢!

PD:我知道这不是一个完美的或确定的(因为阵列将继续变得越来越大),但同时,它是我能想到的唯一一个。如果有人有任何其他想法,我会非常感激。


好吧,我回答自己,因为评论堆积在答案上,我没有足够的空间来说明我对错误的描述。

首先,现在没有出现TypeError#1009,但它仍然没有工作。好吧,在仔细观察之后,我发现很可能错误与删除事件监听器有关。这是因为墙壁停止移动,但确实出现在阵列wallArray预期的舞台上。这是我在Walls类上的代码:

package  {

    import flash.display.MovieClip;
    import flash.events.Event;


    public class Walls extends MovieClip {

        public function Walls() {

            addEventListener(Event.ENTER_FRAME, update_wall_pos);
        }
        function update_wall_pos(e:Event){
            this.x -= Game.wall_mov_speed;
            if(this.x <  - 820){
            erase_wall();
            }
        }
        function erase_wall(){
            this.removeEventListener(Event.ENTER_FRAME, update_wall_pos);
            this.parent.removeChild(this);
        }
    }

}

嗯,问题在于removeEventListener。这应该只适用于特定的实例(因此只适用于wallArray的一个元素),但意外地它会阻止整个其他墙壁移动。更重要的是,非常奇怪的是它只会在索引达到三个值时发生,原因不明。由于第四个墙(索引中的那个= = 3)没有达到x = 0,所以其他墙不会出现,一切都停止工作。另一件事是,如果我删除removeEventListener部分,一切正常,但当你到达第四面墙时,它会变得非常迟缓,最后崩溃。

知道为什么会这样吗?是这个问题,removeEventListener应用于一个类的每个实例,一个已知问题?有人知道如何解决这个问题吗?我非常感谢任何帮助。

谢谢。

2 个答案:

答案 0 :(得分:0)

您尚未发布完整代码,因此我只能对您正在进行的操作进行最佳猜测,但最初看起来您可能会遇到index的范围问题。 indexspawn_wall_piece()是否可以访问update_game()类变量?尝试在其中一个函数中进行追踪,看看你是否得到了预期的结果。

您的ENTER_FRAME事件侦听器后面还有一个流氓关闭括号。

如果您使用的是Flash Professional,请尝试使用this guide调试影片并找出未定义的内容。如果您正在使用mtasc / MXML进行编译,请确保将调试值设置为true,以便在发生错误时接收行号。

答案 1 :(得分:0)

嗯,我在2天前解决了这个问题,但是我正忙着解决另一个问题,所以如果最终它不可用,我不确定发布它。

问题是Walls类中的eventListeners在添加子项时是个问题,因此我将该类留空,并将它们移动到文档类中。我还在removeChild函数中添加了spawn_wall_piece。我还创建了一个初始化和充分数组的函数,这样当wallArray.length == 5调用函数时,阶段之前的墙就会被消除,而其他墙也会被创建。至于碰撞,当我遇到问题时,我将CDK方法的addItem放在spawn_wall_piece而不是函数中以使数组充足。嗯,这是功能代码:

//In the constructor
//Calling to the generating/adequating wallArray function
adequate_array_of_walls(true);
myWallCollisionList.addItem(wallArray[0]);
myWallCollisionList.addItem(wallArray[1]);
//...
//The function called by enter_frame
function update_game(e:Event){
    wallArray[(index - 1)].x -= wall_mov_speed;
    wallArray[index].x -= wall_mov_speed;
    if(wallArray[index].x < 0){
        spawn_wall_piece();
    }
    if(index == 5){
        //We call this function for cleaning
        adequate_array_of_walls(false);
    }
 //...
 //The functions called of the wall generation:
 function spawn_wall_piece(){
    index++;
    wallArray[index].x = (wallArray[index - 1].x + wallArray[index - 1].width);
    wallArray[index].y = 0;
    stage.addChild(wallArray[index]);
    myWallCollisionList.addItem(wallArray[index]);
    myWallCollisionList.removeItem(wallArray[index - 2]);
    stage.removeChild(wallArray[index - 2]);
 }
 function adequate_array_of_walls(init:Boolean):void{
 //This only executes if we are initialitizing the array
 if(init == true){
    for(index = 0; index < 10; index++){
         var aWall:Walls = new Walls();
         randomize = Math.floor(Math.random()*4) + 1;
         aWall.gotoAndStop(randomize);
         wallArray.push(aWall);
    }
    wallArray[0].gotoAndStop(1);
    stage.addChild(wallArray[0]);
    wallArray[1].x = 800;
    wallArray[1].y = 0;
    stage.addChild(wallArray[1]);
    //if not, then we are just cleaning it and rearranging it so it doesn't grow bigger and bigger
 }else{
    for(var a:Number = 0; a < index - 1; a++){
         wallArray.splice(0,1);
    }
    for(a = index - 1; a < (10-2); a++){
         var aWall2:Walls = new Walls();
         randomize = Math.floor(Math.random()*4) + 1;
         aWall2.gotoAndStop(randomize);
         wallArray.push(aWall2);
    }
 }
 //Then, either way, we tell index to be 1 since the reference in the function is [index - 1] and [index], so it starts with [0] and [1]
 index = 1;
}