进一步编辑:添加了第二个参数,以阐明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的其他实例(或副本),这样当我将它们存储在不同的变量中时,我可以独立操作它们?
答案 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>
的三角形类,并确保它只包含表示三角形的数据。如何做到这一点超出了这个问题的范围。