AS3 - 如何复制sprite的sprite / graphics?

时间:2013-08-03 21:46:11

标签: actionscript-3 flash graphics clone sprite

假设我的2D级别是由2D块构建的。其中一些是盒子。

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

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

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

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

这是一个好习惯吗?还有另一种方法可以达到同样的目的吗?

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

2 个答案:

答案 0 :(得分:7)

您可以使用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()

答案 1 :(得分:1)

如果你把它视为游戏中的一个对象,你可能应该考虑@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();
        }