地震が起きたようなエフェクト

画像にモザイクをかけ、
画像を左右に揺らすというエフェクトです。


モザイクは、簡単にかけることができます。
BitmapDataのfillRectメソッドを使って、
10pixelずつ色データを抜き出し、
塗っていくだけです。


10pixelずつではなく、
もっと大きな値であれば、
モザイクが大きくなり、画像の判別が付けれなくなります。


エフェクトでは、ここら辺の設定ができると面白いかもしれないですね。


ソースを以下に載せておきます。

package {
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	[SWF(width=800, height=600, backgroundColor=0xAADDFF)]

	public class Main08 extends Sprite {
		
		[Embed(source="images/mori.jpg")] private var P1:Class;
		private var image:Bitmap = new P1();
				
		private var effect:EarthquakeEffect;
		
		public function Main08() {
			addChild(image);
			
			stage.addEventListener(MouseEvent.CLICK, onClick);
		}
		
		private function onClick(event:MouseEvent):void {
			effect = new EarthquakeEffect(image.bitmapData.clone());
			addChild(effect);
			
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
		
		private function onEnterFrame(event:Event):void {
			effect.effect();
			
			if (effect.parent == null) {
				removeEventListener(Event.ENTER_FRAME, onEnterFrame);
			}
		}
		
	}
}

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Rectangle;

class EarthquakeEffect extends Bitmap {

	private const MAX_QUAKE_WIDTH:int = 5;
	private const MAX_EARTHQUAKE:int = 5;
	
	private var vx:Number = 4;
	private var earthquakeCount:int = 0;
	
	public function EarthquakeEffect(bmp:BitmapData) {
		super(bmp);
		
		var rect:Rectangle = new Rectangle(0, 0, 10, 10);
		for (var xx:int=0; xx<bitmapData.width; xx+=10) {
			for (var yy:int=0; yy<bitmapData.height; yy+=10) {
				rect.x = xx;
				rect.y = yy;
				bitmapData.fillRect(rect, bitmapData.getPixel32(xx, yy));
			}
		}
	}
	
	public function effect():void {
		x += vx;
		
		if (Math.abs(x) > MAX_QUAKE_WIDTH) {
			x -= vx;
			vx *= -1;
			
			earthquakeCount++;
		}
		
		if (earthquakeCount > MAX_EARTHQUAKE) {
			parent.removeChild(this);
		}
	}
	
}