AS3事情随机移动

时间:2014-06-16 02:51:40

标签: actionscript-3 flash

我仍然是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);”因为当我关闭它时它会修复它但是会移动我想要移动的东西。

一切都在一层......我应该改变吗?

2 个答案:

答案 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;)
}