Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3-如何复制精灵/精灵图形?_Actionscript 3_Flash_Graphics_Clone_Sprite - Fatal编程技术网

Actionscript 3 AS3-如何复制精灵/精灵图形?

Actionscript 3 AS3-如何复制精灵/精灵图形?,actionscript-3,flash,graphics,clone,sprite,Actionscript 3,Flash,Graphics,Clone,Sprite,假设我有一个由二维块构建的二维标高。有些是盒子 这些盒子看起来一模一样。没有区别!如何将一个框的图形“复制”或克隆到另一个框?这些框唯一的区别是sprite.x和sprite.y具有不同的值。我可能会这样做: public static function drawBox(graphics:Graphics):void { graphics.clear(); // draw box } drawBox(box1.graphics); drawBox(box2.graphics);

假设我有一个由二维块构建的二维标高。有些是盒子

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

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

drawBox(box1.graphics);
drawBox(box2.graphics);
drawBox(box3.graphics);
没有纹理将被使用,只有矢量绘图

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

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

您可以使用函数
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);

看看.

如果你把它当作游戏中的一个对象,你可能应该考虑OOP方法@ Pror建议。< /P> 这有很多种口味:

您可以从Sprite扩展一个类,并在其父级将长方体
添加到\u 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()函数

在本例中,您将按如下方式构造长方体-它需要对已添加到舞台的精灵(或其任何扩展)的引用:

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

不要从复制的角度思考,而要从类的角度思考。将该代码放入一个类中,并创建该类的新实例。如果绘图是在运行时动态完成的,您可以使用@putvande.Neat的答案中所述的
copyFrom
,我不知道这种方法!在了解此方法之前,我会使用BitmapData方法。此方法的第一个参数可以是任何
DisplayObject
。获得位图数据后,可以使用
beginBitmapFill()
方法绘制
graphics
对象。但是如果要复制的对象是通过
graphics
属性绘制的,那么这是一个简洁的快捷方式。我也不知道
copyFrom()
这是一个很好的提示!
public function set size(val:int):void
        {
            _size = val;
            draw();
        }
        public function set color(val:uint):void
        {
            _color = val;
            draw();
        }