1

我有我的代码设置,以便我的库中有一个电影剪辑,其中一个名为“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 行不通吗?无论如何,如果有人有任何想法,那就太好了!

4

2 回答 2

3

如果您必须移动 100 个对象,则必须移动它们。没有其他选择。

但是,您真正可以做的是优化解决方案本身来节省性能。我的几分钱:

  • 当然,必须在您的情况下应用循环,逐行管理 100 多个作业绝对不是正确的方法。尽管仅使用循环就不会获得任何性能。

  • 尝试对对象进行分组。正如我在上面看到的,您似乎正在以相似的增量移动所有这些对象。将它们全部分组到更大的电影剪辑(或Sprites)中,然后将其移动。

  • 学习Blitting 和缓存方法以节省大量性能,否则您迟早会走上无法再扭曲逻辑的道路,而性能将是痛苦的。

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

最后,我还想提醒您不要浪费时间在微优化上并考虑它们。

于 2012-12-03T04:51:39.457 回答
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 次迭代算不了什么。唯一的性能问题可能只是渲染,无论您选择哪种方法都会发生这种情况,因为您必须以某种方式移动块(换句话说,这里的性能并不是真正的问题,因为您必须渲染移动更改,唯一的问题是您如何选择实现运动以方便您自己的编码)。

于 2012-12-03T04:57:47.577 回答