地震が起きたようなエフェクト
画像にモザイクをかけ、
画像を左右に揺らすというエフェクトです。
モザイクは、簡単にかけることができます。
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); } } }