通过合成

时间:2016-04-18 19:49:19

标签: actionscript-3

进一步编辑:添加了第二个参数,以阐明TreeGenerator正在使用通过参数传递的精灵中预先创建的部分,而不是生成它们。

编辑:我试图将代码改为使用“形状”和“MovieClips”,因为这会让我感到困惑和模糊。

我正在尝试使用其他Sprite的部分创建一个Sprite。我发布了一些代码,说明我正在尝试做什么:

public class TreeGenerator extends Sprite 
{
    private var _leaf:Sprite
    private var _branch:Sprite
    private var _trunk:Sprite
    //these are separately drawn and instantiated in other sprites,
    //one of which will be passed through in the parameters

    public var thumbnail:Sprite

    public function TreeGenerator($preCreatedTreeOne:Sprite, $preCreatedTreeTwo:Sprite) 
    {
        _leaf = $preCreatedTreeOne.leaf;
        _branch = $preCreatedTreeTwo.branch;
        _trunk = $preCreatedTreeOne.trunk;

        thumbnail = $preCreatedTreeOne.leaf;
        //just uses the leaf for this example

        this.addchild(_leaf);
        _leaf.y = 30;
        this.addchild(_branch);
        _branch.y = 20;
        this.addchild(_trunk);
        _trunk.y = 10;
        //this "puts together" the tree image (though very
        //simply with just y for example purposes)

        this.addchild(thumbnail);
        thumbnail.y = 40;
        //this thumbnail is supposed to be a separate object that can also
        //be interacted with but this example neglects the event listeners.
        //the important thing here is the setting of the y to 40, which 
        //overwrites the y of 30 for _leaf.
    }
}

我正在通过两个已经实例化为$ preCreatedTreeOne和$ preCreatedTreeTwo的Sprite,它们是通过各种树形部件创建的(大绿叶,小红叶,细枝,粗枝等)。那些精灵是绘制的图像,而不是代码生成的图像(比如来自.swc库)。当用户在点击舞台上的两棵树后点击一个按钮时,TreeGenerator将创建一个树的另一个图像,包括树叶,树枝和树干,但这次使用两个预先创建的树中的部分(它将是动态,一次单击将生成一棵树,树上有绿叶,第二棵树上有粗枝,第一棵树上有一根细树干,两棵树的组合被选为“一”或“两”。还有一个单独的缩略图可以独立交互(虽然在示例中省略了该代码)。

然而,当我运行代码时,我看到_leaf的y坐标值被缩略图覆盖,因为我现在意识到两者现在都是$ preCreatedTreeOne.leaf。

如何从$ preCreatedTreeOne“获取”$ preCreatedTreeOne.leaf的其他实例(或副本),这样当我将它们存储在不同的变量中时,我可以独立操作它们?

1 个答案:

答案 0 :(得分:0)

drawGraphicsData()

您可以创建与绘图API方法调用相对应的对象。它们都实现了上面的接口。然后,您可以将它们分组到Vector.<IGraphicsData>并将它们推入readGraphicsData(),以便在Graphics对象中绘制您的内容。

你不是在吃饭,而是它的食谱。然后,您可以根据自己喜欢的食谱烹制多餐。

自FP 11.6起,您还可以通过{{3}}

Vector.<IGraphicsData>对象中查询Graphics
  

免责声明:我在wonder.fl中修改了示例代码的修改版本,因为我没有安装编译器,请使用单独的类文件而不是内部类正确实现

     

我的Flash播放器是在当天还很酷的时候拥有它,因此有点旧(11.2),这意味着我无法用readGraphicsData()实际测试代码,这是为什么我将三角形列表传递给所有3个参数。

package 
{
    import flash.display.Shape;
    import flash.display.Sprite;
    import flash.display.IGraphicsData;
    import flash.display.GraphicsPath;
    import flash.display.GraphicsSolidFill;

    import flash.display.GraphicsEndFill;

    public class Main extends Sprite 
    {
        public function Main() 
        {

            // assemble Vector.<IGraphicsData> manually for triangle
            var triangle:GraphicsPath = new GraphicsPath();
            var triangleHeight:uint = 30; 
            triangle.moveTo(triangleHeight / 2, 0); 
            triangle.lineTo(triangleHeight, triangleHeight); 
            triangle.lineTo(0, triangleHeight); 
            triangle.lineTo(triangleHeight / 2, 0);

            var commands:Vector.<IGraphicsData> = new <IGraphicsData>[new GraphicsSolidFill(0xff0000), triangle, new GraphicsEndFill()];

            addChild(new ShapeSet(commands, commands, commands));

            // since FP 11.6 the following is also possible

            // assemble Vector.<IGraphicsData> from existing Graphics object in Shape
            var square:Shape = new Shape();
            square.graphics.beginFill(0xff00);
            square.graphics.drawRect(0, 0, 30, 30);
            square.graphics.endFill();

             addChild(new ShapeSet(square.graphics.readGraphicsData(), commands, commands));
        }
    }
}
import flash.display.Sprite;
import flash.display.Shape;
import flash.display.IGraphicsData;

internal class ShapeSet extends Sprite
{
    private var _square:Shape;
    private var _triangle:Shape;    
    private var _thumbnail:Shape;

    public function ShapeSet(square:Vector.<IGraphicsData>, triangle:Vector.<IGraphicsData>,  thumbnail:Vector.<IGraphicsData>) 
    {
        _square = new Shape();
        _triangle = new Shape();
        _thumbnail = new Shape();

        addChild(_square);
        _square.x = 10;
        addChild(_triangle);
        _triangle.x = 60;
        addChild(_thumbnail);
        _thumbnail.x = 90;

        _square.graphics.drawGraphicsData(square);
        _triangle.graphics.drawGraphicsData(triangle);
        _thumbnail.graphics.drawGraphicsData(thumbnail);
    }
}

如果只想将三角形​​传递给三角形,则应编写一个封装Vector.<IGraphicsData>的三角形类,并确保它只包含表示三角形的数据。如何做到这一点超出了这个问题的范围。