在actionscript 3中每帧移动所有数组对象的x,y位置?

时间:2012-12-03 03:45:51

标签: arrays actionscript-3 loops duplicates

我有我的代码设置,因此我的库中有一个movieclip,其中一个名为“block”的类被多次复制并添加到这样的数组中:

function makeblock(e:Event){
newblock=new block;
newblock.x=10;
newblock.y=10;
addChild(newblock);
myarray[counter] = newblock; //adds a newblock object into array
counter += 1;
}

然后我有一个循环,用一种当前原始的方式处理我的问题:

    stage.addEventListener(Event.ENTER_FRAME, gameloop);
    function gameloop(evt:Event):void {
        if (moveright==true){
            myarray[0].x += 5;
            myarray[1].x += 5;
            myarray[2].x += 5
              -(and so on)-

我的问题是如何为复制到数组中的新对象以及之前添加的对象更改每帧的x,y值。当然用比我自己写的更优雅的方式... array [0] .x + = 5,array [1],array [2],array [3]等。

理想情况下,我希望这可以为一个阵列提供500个或更多的数组对象,所以很明显我不想单独写出来哈哈,我还需要它与性能保持一致所以使用for循环或者循环遍历整个数组并移动每个x + = 5的东西不起作用吗?无论如何,如果有人有任何想法会很棒!

2 个答案:

答案 0 :(得分:3)

如果必须移动100个物体,则必须移动它们。没有其他选择。

但是,您真正可以做的是保存性能,优化解决方案本身。我的几美分:

  • 当然必须在你的情况下应用循环,逐行管理100多个任务绝对不是正确的方法。虽然只使用一个循环就没有任何表现。

  • 尝试对对象进行分组。如上所述,您似乎正在以相似的增量移动所有这些对象。将它们分组为更大的动画片段(或Sprites)&转而去。

  • 学习Blitting & caching方法可以节省大量的性能,或者您迟早会遇到逻辑无法扭曲的问题。表现会很痛苦。

  • 此外,在上一步的范围内,如果您有多个同一对象的状态,请考虑使用Sprite Sheets

最后,我还要提醒您不要浪费时间进行微观优化。想着他们。

答案 1 :(得分:0)

您可以使用一些容器精灵并在创建时添加块:

// Some init place
var blockContainer:Sprite = new Sprite();
addChild(blockContainer);

制作块:

function makeblock(e:Event){
    newblock=new block;
    newblock.x=10;
    newblock.y=10;
    // Add the block to the container
    blockContainer.addChild(newblock);
    myarray[counter] = newblock; //adds a newblock object into array
    counter += 1;
}

游戏循环:

stage.addEventListener(Event.ENTER_FRAME, gameloop);

function gameloop(evt:Event):void {
    if (moveright==true){
         blockContainer.x += 5;
    }
    // etc...
}

这样你只需移动一个物体。当然,只要所有块都需要沿同一方向移动,该方法才有效。顺便说一句,for循环也可以正常工作 - 500次迭代都不算什么。唯一的性能问题可能只是渲染,无论你选择什么方法都会发生,因为你必须以某种方式移动块(换句话说,这里的性能不是真正的问题,因为你必须渲染运动变化,唯一的问题是你如何选择为自己的编码方便实现运动。)