4

假设我有一个由 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);

不使用纹理,仅使用矢量绘图!

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


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

4

2 回答 2

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);

查看有关 copyFrom() 的文档

于 2013-08-03T23:31:30.987 回答
1

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

这有很多口味:

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

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();
        }
于 2013-08-05T00:00:43.403 回答