BitmapDataで残像エフェクト
BitmapDataを使って残像エフェクトを作成しました。
やり方は簡単。
残像エフェクトを適用したいオブジェクトを
BitmapDataにdrawしていくだけ。
それだけだと、
残像が消えないので、1つ処理を加えます。
BitmapDataクラスのcolorTransformメソッドを使って、
現在drawされているものを半透明にする。
afterBitmapData.colorTransform(afterBitmapData.rect, new ColorTransform(1, 1, 1, 1, 0, 0, 0, -16)); var mat:Matrix = new Matrix(); mat.translate(character.x, character.y); afterBitmapData.draw(character, mat);
こんな感じですね^^
次にdrawするものは、半透明にならないので、
残像を作るにはぴったりのメソッドだと思いました。
一応、ソースコード載せておきます。
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.PixelSnapping; import flash.display.Sprite; import flash.events.Event; import flash.geom.ColorTransform; import flash.geom.Matrix; [SWF(width=800, height=600, backgroundColor=0xAADDFF)] public class Main17 extends Sprite { private var afterBitmapData:BitmapData = new BitmapData(800, 600, true, 0x00FFFFFF); private var afterImage:Bitmap = new Bitmap(afterBitmapData, PixelSnapping.AUTO, true); private var character:Character = new Character(); public function Main17() { addChild(afterImage); character.x = 200; character.y = 200; addChild(character); addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event):void { character.move(); afterBitmapData.colorTransform(afterBitmapData.rect, new ColorTransform(1, 1, 1, 1, 0, 0, 0, -16)); var mat:Matrix = new Matrix(); mat.translate(character.x, character.y); afterBitmapData.draw(character, mat); } } } import flash.display.Sprite; import flash.events.Event; class Character extends Sprite { private var isStage:Boolean = false; private var vx:Number = 5; private var vy:Number = 5; public function Character() { graphics.beginFill(0x0000FF); graphics.drawCircle(0, 0, 50); graphics.endFill(); graphics.beginFill(0x00FF00); graphics.drawCircle(0, 0, 20); graphics.endFill(); addEventListener(Event.ADDED_TO_STAGE, onAddedStage); } public function move():void { x += vx; y += vy; if (isStage) { if (x < 0+width/2 || x > stage.stageWidth-width/2) { vx *= -1; } if (y < 0+height/2 || y > stage.stageHeight-height/2) { vy *= -1; } } } private function onAddedStage(event:Event):void { isStage = true; } }