単なるEFFECT

by hankuro
matrix3Dを使ったEFFECTを作ってみました。
 flashは最初からActionscript3.0から始めたのでflash-CSなんて使ったことないし、また、使えないと思います。
ですから、プログラムの書き方が少し変ですので、ご注意願います。
 今回のEFFECTはごく一般的なものですが、matrix3Dを勉強がてら使いました。
(汗)1ピクセル分列が欠損しています。現在解析中←ステージを大きくしたら目立たなくなりました。
♥2 | Line 159 | Modified 2009-09-18 08:17:24 | MIT License
play

Related images

ActionScript3 source code

/**
 * Copyright hankuro ( http://wonderfl.net/user/hankuro )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/m7Wy
 */

package
{
	import flash.display.*;
	import flash.events.*;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.net.URLRequest;
	import flash.system.LoaderContext;
	import flash.utils.Timer;
	import flash.geom.*;
	
	
	[SWF(width=500, height=400, backgroundColor=0xFFFFFF)]
	
	/**
	 * 
	 *  matrix3Dを使ったEFFECTを作ってみました。
	 *  flashは最初からActionscript3.0から始めたのでflash-CSなんて使ったことないし、また、使えないと思います。
	 * 	ですから、プログラムの書き方が少し変ですので、ご注意願います。
	 *  今回のEFFECTはごく一般的なものですが、matrix3Dを勉強がてら使いました。
	 *  (汗)1ピクセル分列が欠損しています。現在解析中←ステージを大きくしたら目立たなくなりました。
	 */
	public class Main extends Sprite 
	{

		public var cut_image1:Array
		public var cut_image2:Array
		public var timer1:Timer;
		public var crent_num:Number = 0;
		public var crent_rotation:Number = 0;
		public var image1:Array;
		public var image2:Array;
		public var load_cnt:Number = 0;
		public var cat:Loader = new Loader();
		public var dog:Loader = new Loader();
		public var i_width:Number = 270;
		public var i_height:Number = 200;
		public var w:Number = 30;
		public var dsp1:Sprite;
		public var cat_url:URLRequest = new URLRequest("http://farm4.static.flickr.com/3532/3927209027_9553d9d33c.jpg");
		public var dog_url:URLRequest = new URLRequest("http://farm3.static.flickr.com/2615/3927761699_2603592842.jpg");		
		
		
		public function Main() {
			//
			// 画像ロード
			//  私はさくらサーバーを使用していますが、crossdomain.xmlを入れてもflashが認識してくれません。さくらサーバーをご使用の方で、何か対処法
			//  をご存じであれば教えていただけないでしょうか?
			//
			var context : LoaderContext = new LoaderContext(true);
			cat.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
			cat.load(cat_url, context);
			dog.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);
			dog.load(dog_url,context);
		}
		public function onImageLoaded(event:Event):void {
			load_cnt++;
			if (load_cnt == 2) effct_start();
		}
		public function effct_start():void 
		{
			// 裏面画像初期化
			var bmp:Bitmap = Tools.Cut_image(cat, 43,95,i_width, i_height);
			var bmp_data:BitmapData = new BitmapData(i_width, i_height);
			bmp_data.draw(bmp);
			cut_image1 = Tools.Image_width_cut(bmp_data, 0, 0 , w, bmp.height);
			// 表面画像初期化
			bmp = Tools.Cut_image(dog,105,80,i_width,i_height);
			bmp_data = new BitmapData(i_width, i_height);
			bmp_data.draw(bmp);
			cut_image2 = Tools.Image_width_cut(bmp_data, 0, 0, w, bmp.height);
			// ステージ上に画面設定
			image1 = new Array(cut_image1.length);
			image2 = new Array(cut_image2.length);
			var image1_x:Number = 0;
			var image2_x:Number = 0;
			for (var i:Number = 0; i < cut_image1.length; i++) {
				//
				// 画像が二枚一組で半回転しますので、裏側の画像は反転しておく必要があります。
				//  参考サイト http://www.adobe.com/jp/devnet/flash/articles/reflect_class_as3.html
				//
				cut_image1[i].scaleY = -1;
				cut_image1[i].y += i_height / 2;
				cut_image1[i].x = -i_width / 2 ;
				cut_image1[i].visible = false;
				image1[i] = new Sprite();

				image1[i].x = ((i * w) + i_width / 2) + 100;
				image1[i].y = (i_height / 2) + 100;
				image1[i].addChild(cut_image1[i]);
							
				cut_image2[i].y = -i_height / 2 ;
				cut_image2[i].x = -i_width / 2 ;			
				image2[i] = new Sprite();
				image2[i].addChild(cut_image2[i]);
				image2[i].y = (i_height / 2) + 100;
				image2[i].x = ((i * w) + i_width / 2) + 100;
				this.addChildAt(image2[i], 0);
				this.addChildAt(image1[i], 0);				
			}
			dsp1 = new Sprite();
			dsp1.graphics.beginFill(0xFFFFFF, 0);
			dsp1.graphics.drawRect(0, 0, 500, 400);
			dsp1.graphics.endFill();
			dsp1.buttonMode = true;
			this.addChild(dsp1);			
			dsp1.addEventListener(MouseEvent.CLICK, onClick);
		}
		public function onClick(evt:Event):void {
			removeEventListener(MouseEvent.CLICK, onClick);
			addEventListener(Event.ENTER_FRAME, onLoop);
		}
		public function onLoop(evt:Event):void {
			//
			// matrix3Dを使用して画像を回転させています。
			//
			if (crent_num < image1.length) {
				if (crent_rotation < 90) {					
					cut_image1[crent_num].visible = false;
					cut_image2[crent_num].visible = true;
				}else {
					cut_image1[crent_num].visible = true;
					cut_image2[crent_num].visible = false;					
				}
				if (crent_num < image2.length / 2) {
					this.setChildIndex(image2[crent_num], 2);
					this.setChildIndex(image1[crent_num], 2);
				}
				image1[crent_num].z = 0; 
				image2[crent_num].z = 0; 
				image2[crent_num].transform.matrix3D.prependRotation(3, Vector3D.X_AXIS);
				image1[crent_num].transform.matrix3D.prependRotation(3,Vector3D.X_AXIS);
				crent_rotation += 3;
				if (crent_rotation > 180) {
					if (crent_num < image2.length / 2) {
						this.setChildIndex(image1[crent_num], 0);
					}
					crent_num++;
					crent_rotation = 0;
				}
			}else {
				//
				// restart処理
				//
				removeEventListener(Event.ENTER_FRAME, onLoop);
				for (var i:Number = 0; i < image1.length; i++) {
					removeChild(image1[i]);
					removeChild(image2[i]);
				}
				crent_num = 0;
				removeChild(dsp1);
				effct_start();
			}
		}
	}
	
}
	import flash.display.*;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.geom.Matrix;
	
	/**
	 * 
	 *  画像カットツール
	 * 
	 */
	class Tools
	{
		public static function Image_width_cut(b_map:BitmapData,xx:Number, yy:Number, w:Number, h:Number):Array {
			var rect:Rectangle;
			var m_bitmap:Bitmap;
			var cut_image:Array = new Array(int((b_map.width + (w - 1)) /w));
			var copy_w:Number = w;
			var copy_h:Number = b_map.height;
			for (var n:Number = 0; n < cut_image.length; n++) {
				if (n + 1 != cut_image.length) copy_w = w;
				else if(int( b_map.width % w) == 0) copy_w = w;
					 else copy_w = int(b_map.width % w);
				var penguinCopyBmd:BitmapData = new BitmapData(copy_w,copy_h);
				rect = new Rectangle(n * w, 0, copy_w, copy_h);
				//
				// 画像カットはcopyPixelsを使用しています。
				// 詳細は、「初めてのActionScript3.0(O'REILLY)9章 ピクセルによる描画」を参照願います。
				//
				penguinCopyBmd.copyPixels(b_map, rect, new Point());
				var bmp:Bitmap = new Bitmap(penguinCopyBmd);
				cut_image[n] = new Bitmap(bmp.bitmapData.clone());
			}
			return cut_image;
		}		
		public static function Cut_image(l:Loader,xx:Number,yy:Number,w:Number,h:Number):Bitmap {
			var bit_data:BitmapData = new BitmapData(l.width,l.height);
			var bmp:Bitmap = Bitmap(l.content); 
			bit_data.draw(bmp);
			var rect:Rectangle = new Rectangle(xx, yy, w, h);
			var penguinCopyBmd:BitmapData = new BitmapData(w,h);
			penguinCopyBmd.copyPixels(bit_data, rect, new Point());
			var c_bmp:Bitmap = new Bitmap(penguinCopyBmd);
			bmp = new Bitmap(c_bmp.bitmapData.clone());
			return bmp;
		}
	}