[心得] draw的技巧,说说BitmapData(附源码)
本帖最后由 Ryanliu 于 2009-3-24 09:53 编辑
http://uh.9ria.com/link.php?url=http://bbs.9ria.com/viewthread.php%3Ftid%3D23381
先看看这个例子:
http://www.ryan-liu.com/demo/bitmapdata/fancydraw.html
做上面这个效果,AS的技术点主要有三个,Matrix变形,ColorTransform和BitmapData的draw方法。这三个技术点串起了做BitmapData最基本的逻辑——也是最基本的思路。我先把draw的说明放这里:
draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void
复制代码
先从思路说起。源码里除了被采样的动画是做在MC里,其他的效果只是通过一个draw来搞定的。我之前的例子里也用到了类似的效果,可以叫“残影”,“拖光”,“雾化”……怎么称呼都成的一个效果。完成这种效果的思路非常简单,为了更新采样动画,在每一个enterFrame里我们都会“重绘”,也就是把采样MC要draw在位图上。在BitmapData上draw跟你在纸上画画是一样的。假使你在一张纸上,每秒都沿着同一条直线方向画一个圆,如果你不另换一张纸,或者擦掉之前画的,那么你画的将是一串圆。同样,在BitmapData上不断的draw一个带动画的MC,你会把整个动画的过程都留在BitmapData上。但留整个过程不是我们的目的,所以我们加一个小技巧进去,我们把原来的BitmapData先加暗(或变淡),然后再重绘MC。这样之前的图就会逐渐暗(淡)掉,就形成了如上例中的效果。和以前在Flash里做残影相比,BitmapData实现真是再自然不过了。
怎么实现变暗/变淡呢,给BitmapData施加一个ColorTransform即可,如:
var transformMatrix:Matrix = new Matrix();var incX:int = sw/40;var incY:int = sh/40;transformMatrix.a = (sw + incX)/sw;transformMatrix.d = (sh + incY)/sh;transformMatrix.tx = -incX/2;transformMatrix.ty = -incY/2;