我在使用显示对象数组时遇到了麻烦。
我要做的是从一些预先制作的块(其宽度与舞台相同)中生成“随机”滚动环境,以一定的速度滚动。所有这些“块”都存储在一个名为“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应用于一个类的每个实例,一个已知问题?有人知道如何解决这个问题吗?我非常感谢任何帮助。
谢谢。
答案 0 :(得分:0)
您尚未发布完整代码,因此我只能对您正在进行的操作进行最佳猜测,但最初看起来您可能会遇到index
的范围问题。 index
和spawn_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;
}