【问题标题】:Moving x,y position of all array objects every frame in actionscript 3?在actionscript 3中每帧移动所有数组对象的x,y位置?
【发布时间】:2012-12-03 03:45:50
【问题描述】:

我已经设置了代码,因此我的库中有一个影片剪辑,其中一个名为“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 的东西不会起作用吗?无论如何,如果有人有任何想法,那就太好了!

【问题讨论】:

  • 您是否尝试过使用循环?是不是进展得太慢了?项目是如何被绘制到屏幕上的?也在循环中?还是 AS3 会为您绘制充满对象的数组?
  • 我还没有完全放入一个 for 循环来测试它,但我在想如果我有多个包含数百个对象的数组要移动它可能会对每个数组的性能造成很大影响循环中的数组。我想知道是否有一种我没有想到的方法,所以我可以为每个创建的对象动态创建一个变量或其他东西。然后让每个人在创建时每帧更新其 x 位置。
  • 啊,项目一被创建就被绘制到屏幕上,所以我会在屏幕外创建它们,然后基本上将它们移动到视图中。

标签: arrays actionscript-3 loops duplicates


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 是的,同意,感谢所有输入!我真的只需要更加熟悉一切,但非常感谢您的建议,我明天将努力解决这个问题。我将研究对对象进行分组,因为我一次将所有对象都朝同一个方向移动。在不久的将来,我还将更多地研究 Blitting 和缓存以及精灵表。
  • 如果对您有帮助,请记得点击答案旁边的绿色勾号。
  • 是的,是的,我想在选择答案之前先尝试一下,但你的答案几乎涵盖了所有内容,所以谢谢你。我很确定我能从您的建议中找到解决方案,如果我需要帮助/找到绝对有效的解决方案,我会回复您。
  • 只是一个快速更新,说我现在一切正常,非常感谢您的帮助。我最终将复制的对象放在一个精灵容器中,并根据需要移动容器。奇迹般有效。我也会记住你所说的一切以备将来使用,谢谢!
【解决方案2】:

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

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

【讨论】:

  • 非常感谢您的回答!我一定会调查你所说的,看看我是否可以在明天的某个时候实施。我正在向同一个方向移动所有对象,所以这对我来说可能是一个不错的选择!
  • 我想重新进入并说我很快测试了添加容器精灵并将所有内容放入其中。它非常适合我需要做的事情,所以谢谢你的建议!
猜你喜欢
  • 2019-04-12
  • 1970-01-01
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多