2011-06-03 74 views
3

是否可以显示精灵的另一个实例?我想要做的是反映一个动画精灵。
到目前为止,我的Sprite被称为“画布”,其内部的动画使用AS3进行动画处理。我想要做的就是展示它的翻转副本,在它下面看起来像一个反射。我尝试下面的代码,但没有运气,它只是隐藏一切吗?..显示精灵的另一个实例

addChild(canvas); 
var reflection:Sprite = new Sprite(); 
addChild(reflection); 
reflection.addChild(canvas); 

任何想法,为什么这个代码不工作?或者你有更好的方法来解决这个问题。
感谢

+2

的addChild(画布)增加了帆布,然后reflection.addChild(画布)去除画布和从它的前一个父母,并将其添加到反射。你需要一个画布的副本。最简单的解决方案是使用BitmapData将画布的内容绘制到其中,如果您愿意,可以应用变换矩阵将其翻转并遮罩。幸运的是,您可以使用[Adobe Devnet上的Reflection类](http://www.adobe.com/devnet/flash/articles/reflect_class_as3.html)。 – 2011-06-03 10:34:17

+0

@George,你在我发布我的答案之前写了那条评论!应该把它放到一个答案我woulda upvoted :)。 – 2011-06-03 10:36:00

+0

@Ascension完成。这就是我已经在努力的。 :) – Matthias 2011-06-03 10:42:18

回答

3

您可以使用BitmapData

类成员:

// flip vertically and shift by 100 (insert your canvas size) 
private var reflect:Matrix = new Matrix(1, 0, 0, -1, 0, 100); 
// instanciate BitmapData with 100x100 size (insert your canvas size), 
// filled with black but with 100% transparancy, it's an 
// ARGB value (0 == 0x00000000) 
private var reflectionData:BitmapData = new BitmapData(100, 100, true, 0); 
private var reflection:Bitmap = new Bitmap(reflectionData); 

INIT:

// you might want to draw canvas already on startup 
reflectionData.draw(canvas, reflect); 
reflection.x = canvas.x; 
reflection.y = canvas.y + canvas.height; 
addChild(reflection); 

上动画/重绘

// clear to transparency 
reflectionData.fillRect(reflectionData.rect, 0); 
// draw the current canvas with matrix applied 
reflectionData.draw(canvas, reflect); 
+0

这很好!只有一个问题,当它第一次加载时,它会非常快速地闪烁,而我该如何解决这个问题? – Owen 2011-06-03 12:51:05

+1

@Owen默认情况下,'BitmapData'在初始化时被填充为白色。我会改变这个答案,使它充满黑色但100%透明,并且画布已经被绘制在'init'中。 – Matthias 2011-06-03 20:42:26

1

你有几乎相同的问题在这样的回答:

Adding multiple instances of a Sprite?

会告诉你为什么你现有的代码无法正常工作。至于如何完成你想要做的事情,我只是使用一个位图对象来绘制原始的精灵反转。您可以使用传递到Bitmap.draw函数中的Matrix对象作为参数来执行此操作。创建矩阵时,只需将垂直维度的比例值1倒置并将其设置为-1。这里是如何做到这一点的教程:

http://www.adobe.com/devnet/flash/articles/reflect_class_as3.html

他们可能没有使用矩阵变换,并可能只是反转包含的BitmapData精灵的规模,我不知道我没有带读完整的教程。我所知道的是这个教程会给你准确的你想要做的事(有一个例子)。