我仍然是as3的初学者,但这只是疯了。当我生成3个动画片段并让它们移动时,它也会移动背景,地板和得分方向并重复它。
我认为它是一个getChildAt错误我不知道该怎么做。
//Spawn Pipes
private function eSpawn()
{
for(var i:int = 0; i < ePipeMax; i++)
{
var _Pipe:EPipe = new EPipe;
_Pipe.x = (i * 350) + 500;
_Pipe.y = Math.random() * 250;
stage.addChild(_Pipe);
}
}
private function _MoveStage():void
{
//Pipes Move
for (var i:int; i < vPipeMax; i++)
{
var _Pipe = stage.getChildAt(i);
if(_Pipe.x <= 238)
{
Score++;
Scores.text = Score.toString();
}
if(_Pipe.x <= 0)
{
_Pipe.x = 640 + 100;
_Pipe.y = Math.random()*100;
}
_Pipe.x -= xSpeed;
trace("PIPES");
}
}
这只是完整代码的剪辑,但我发现的错误位于“var _Pipe = stage.getChildAt(i);”因为当我关闭它时它会修复它但是会移动我想要移动的东西。
一切都在一层......我应该改变吗?
答案 0 :(得分:0)
你的背景,地板,分数和你的管道都是DisplayObject,它被添加到舞台上。它不是由代码添加或者在IDE中将精灵粘贴到舞台上并不重要。
var _Pipe = stage.getChildAt(i); //this line gets the child object of the stage, based on an index
所以它会获取子对象,具体取决于它们添加的顺序,最多可达到一些vPipeMax。
您可以:添加一个专用于管道的图层,称为pipeLayer,并迭代
var pipeLayer:MovieClip = new MovieClip(); //AS3 does not recognizes layer, here's a way to do that.
stage.add(pipeLayer);
stage.getChildByName("pipeLayer").getChildAt(i)
或
在声明为数组时将管道存储在全局变量中并迭代它们。
//Spawn Pipes
var Pipes:Array = {};
private function eSpawn()
{
for(var i:int = 0; i < ePipeMax; i++)
{
var _Pipe:EPipe = new EPipe;
_Pipes.push(_Pipe);
_Pipe.x = (i * 350) + 500;
_Pipe.y = Math.random() * 250;
stage.addChild(_Pipe);
}
}
private function _MoveStage():void
{
//Pipes Move
for (var i:int; i < Pipes.length; i++)//iterate through _Pipes
{
var _Pipe = Pipes[i];
if(_Pipe.x <= 238)
{
Score++;
Scores.text = Score.toString();
}
if(_Pipe.x <= 0)
{
_Pipe.x = 640 + 100;
_Pipe.y = Math.random()*100;
}
_Pipe.x -= xSpeed;
trace("PIPES");
}
}
此外,将精灵分成不同的层次总是一个好习惯。
答案 1 :(得分:0)
Mc Kevin的回答涵盖了我对这个问题的初步想法,正如他所指出的,数组或向量解决了这个问题。我也认为,通过层次,Mc Kevin意味着新的DisplayObjects(如果我错了Mc Kevin,请纠正我)。它会像这样工作。
// Inside of your main class or stage builder where you are currently creating pipes put...
// Sprite that will hold all of your pipe instances.
var pipes_layer:Sprite = new Sprite();
// Add your pipe instances.
for(var i:uint = 0; i < ePipeMax; i++){
var _Pipe:EPipe = new EPipe;
_Pipe.x = (i * 350) + 500;
_Pipe.y = Math.random() * 250;
// Instead of adding directly to the stage,
// add pipes to the pipes_layer.
pipes_layer.addChild(_Pipe);
}
// Finally add the pipes_layer to the stage.
stage.addChild(pipes_layer);
然后访问和移动管道实例使用类似这样的东西:
for (var i:uint = 0; i < pipes_layer.numChildren; i++) {
// Move pipes. Access each pipe instance with
// pipes_layer.childAt(i) (ex. pipes_layer.childAt(i).x = 5;)
}