【问题标题】:AS3 - How to copy sprites / graphics of sprites?AS3 - 如何复制精灵/精灵图形?
【发布时间】:2013-08-04 22:44:04
【问题描述】:

假设我有一个由 2D 块构建的 2D 关卡。其中一些是盒子。

这些盒子看起来一模一样。没有不同!如何将一个盒子的图形“复制”或克隆到另一个盒子?这些框的唯一区别在于sprite.x 和sprite.y 具有不同的值。我可能会这样:

public static function drawBox(graphics:Graphics):void
{
    graphics.clear();
    // draw box
}

drawBox(box1.graphics);
drawBox(box2.graphics);
drawBox(box3.graphics);

不会使用纹理,只使用矢量绘图!

这是一个好习惯吗?有没有其他方法可以达到同样的效果?


更新: 有时我会随机绘制精灵(如果我需要一个精灵及其所有属性的多个实例,则很难重新绘制它们)。

【问题讨论】:

  • 不要从复制的角度思考,而是从类的角度思考。将该代码放入一个类中,并创建该类的一个新实例。如果绘图是在运行时动态完成的,您可以使用@putvande 的答案中所述的copyFrom。

标签: actionscript-3 flash graphics clone sprite


【解决方案1】:

您可以使用函数copyFrom。

类似这样的:

var s:Sprite = new Sprite();
s.graphics.beginFill(0);
s.graphics.drawRect(0, 0, 100, 100);
s.graphics.endFill();
addChild(s);

var s2:Sprite = new Sprite();
// Copyfrom accepts a `Graphics` object.
s2.graphics.copyFrom(s.graphics);
s2.x = 100;
s2.y = 100;
addChild(s2);

看看the documentation about copyFrom()。

【讨论】:

  • 很好,我不知道这种方法!在知道这个方法之前,我会使用 BitmapData 的draw() 方法。这个方法的第一个参数可以是任何DisplayObject。获得 BitmapData 后,您可以使用 beginBitmapFill() 方法绘制到 graphics 对象。但是,如果您要复制的对象是通过 graphics 属性绘制的,那么这是一个简洁的快捷方式。
  • 我也不知道copyFrom() - 不错的提示!
【解决方案2】:

如果您将其视为游戏中的对象,您可能更应该考虑 @Pier 建议的 OOP 方法。

这有很多口味:

您可以从 Sprite 扩展一个类,并在其父级为 ADDED_TO_STAGE 时立即绘制该框。

public class box extends Sprite
    {
        protected var _color:uint;
        protected var _size:int;
        public function box(size:int=100, color:uint=0x000000)
        {
            super();
            _size = size;
            _color = color;
            this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        }

        protected function onAddedToStage(event:Event):void
        {
            this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
            draw();
        }

        protected function draw():void
        {
            this.graphics.beginFill(_color);
            this.graphics.drawRect(0,0,_size,_size);
            this.graphics.endFill();
        }
}

这个盒子可以通过调用来构造/创建:

var b:box = new box();
this.addChild(b); 

或者您可以让盒子包含自己 - 如果您处理大量对象,这可能更可行。该框只需要引用其父级 - 当然它应该提供一个 dispose() 函数

    public class box
    {
        private var _parent:Sprite;
        protected var s:Sprite;
        public function box(parent:Sprite)
        {
            _parent = parent;
            s = new Sprite();
            s.graphics.beginFill(0x00000);
            s.graphics.drawRect(0,0,100,100);
            s.graphics.endFill();

            _parent.addChild(s);
        }
        public function dispose():void
        {
            _parent.removeChild(s);
        }

    }
}

在这种情况下,您将按如下方式构建框 - 它需要对已添加到舞台的 Sprite(或任何扩展)的引用:

var b:box = new box(this);

在这两种情况下,您都可以动态更改属性并使对象更加通用:

public function set size(val:int):void
        {
            _size = val;
            draw();
        }
        public function set color(val:uint):void
        {
            _color = val;
            draw();
        }

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多