【问题标题】:as3 animation with multiple images具有多个图像的 as3 动画
【发布时间】:2023-11-18 16:23:01
【问题描述】:

我只有 3 张图片用于制作奔跑动物的动画: 1:动物站立 2:动物大步/跳跃 3:背上的动物死了

目前,我将它们作为精灵嵌入到主类中,并在我想要一个而不是另一个时更改它们的 .alpha 属性 2. 有没有更好的方法来做我正在做的事情?令人讨厌的事情之一是单独更新每个精灵的属性。拥有一个对象并能够更改对象上的图像将是理想的,因此我只需要更改一个对象的属性。

【问题讨论】:

  • 我认为您正在寻找的技术称为blitting
  • 更改 alpha 是最糟糕的方法,因为更改 alpha 的成本很高。此外,当您更改 alpha 时,Flash Player 仍会呈现该对象,即使它对用户不可见。可见性更改是一种更好的方法,更好的是根据需要在舞台上添加和删除您的 MovieClips

标签: actionscript-3 animation flashdevelop


【解决方案1】:

为此,最好在自己的类中处理您的动画! 像这样的东西,假设你的动物是一匹马,所以这就是我所说的类

package  {

    import flash.display.Sprite;

    public class Horse extends Sprite{

        private var holder:Sprite = new Sprite();

        public function Horse() {

            var img1:Image1 = new Image1();// ur images from library
            var img2:Image2 = new Image2();
            var img3:Image2 = new Image3();

            holder.addChild(img1);
            holder.addChild(img2);
            holder.addChild(img3);

            addChild(holder);
            setImage(0);// set 1st image visible

        }   

        public function setImage(nr:uint):void
        {
            for(var i:int = 0; i < holder.length;i++;)
                holder[i].visible = false;

            holder[nr].visible = true;
        }
    }

}

那么你会像这样使用它!

var horse:Horse = new Horse();
addChild(horse);
horse.x = 25; 
horse.y = 25; // move the whole object(all 3 images)
horse.setImage(2);// or to whatever frame you need

使用可见属性而不是 alpha 值。如果你只是将 alpha 设置为 0,它仍然会被渲染并花费 cpu。如果将 visible 设置为 false 则不会呈现!

编辑:
正如 Amy 指出的那样,虽然最快的方法是 BitmapData 帧分配,但在这里可以使用 blitting! 在这里,您将所有帧作为 BitmapData 保存在 Vector 中,您可以从 SpriteSheet 加载它,并将新的 BitmapData 分配给您的 Bitmap,而不是使用 copyPixels。它比 blitting 更快,并且您仍然可以使用所有内置方法!

【讨论】:

  • +1 这就是我的意思,但是 Amy 指向“blitting”的评论更多的是我的想法......使用精灵表(将单个图像加载到单个对象中) .我只是不知道如何解释它比我在我的问题中所做的更进一步,因为我什至不知道精灵表是什么。
  • 好的.. nP。仅供参考,我最近做了一些测试。显示列表动画(如我的示例)与 Blitting 一样快。但是 FrameAssigment (BitmapData Assigned) 在 cpu 上是最快和最简单的!
  • 更新的答案。顺便说一句“(加载到单个对象中的单个图像)”不太正确,因为你不断地从你的 spriteSheet 复制部分
  • 所以你会证明,不是加载单个精灵表并将它们重绘到位图对象中,而是单独嵌入每个图像,然后将它们加载到自己的类中并通过它们的可见属性渲染它们会更少资源消耗? (CPU、内存、总输出大小)。如果(假设)我有 40 多张图像,这仍然是真的吗?我可以想象导入 40 张图像是一件令人头疼的事情:)
  • 不,你仍然会使用 spriteSheet。在 App init 中,您使用 SpriteSheet 中的 BitmapData 填充向量,并使用它们而不是在每个刻度上使用 copyPixls。我的测试使用了 100 多张图片
最近更新 更多