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;
	}
	
}