あるスクリーンセイバーを見ながら 「この部分のロジックは簡単だよ」とか言ってしまったので簡単に作ってみた。
flvを読み込んで、1フレームごとに縦に長い短冊に書き込む。すると、映画のフィルムのような画像ができあがる。さらに短冊を上下に動かしている。
やっぱりこういう時は生っぽい映像のほうが面白い。
▼Wonderfl
▼ActionScript
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105  | 
						/*  * あるスクリーンセイバーを見ながら  * 「この部分のロジックは簡単だよ」とか言ってしまったので  * 簡単に作ってみた。  * flvを読み込んで、1フレームごとに縦に長い短冊に書き込む。  * すると、映画のフィルムのような画像ができあがる。  * さらに短冊を上下に動かしている。  *   *   * */ package  { 	import flash.display.Sprite; 	import net.hires.debug.Stats; 	import flash.events.Event; 	import flash.events.NetStatusEvent; 	import flash.net.NetConnection; 	import flash.net.NetStream; 	import flash.media.Video; 	import flash.display.BitmapData; 	import flash.display.Bitmap; 	import flash.system.Security; 	import flash.geom.Matrix; 	[SWF(backgroundColor="0x000000")] 	/** 	 * ... 	 * @author umhr 	 */ 	public class Main extends Sprite 	{ 		private var baseURL:String = ""; 		private var count:int; 		private var bmp_data : BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight , false , 0); 		private var bmp_data0 : BitmapData = new BitmapData(140, 735 , false , 0); 		private var bmp_data1 : BitmapData = new BitmapData(120, 720 , false , 0); 		private var bmp_data2 : BitmapData = new BitmapData(80, 600 , false , 0); 		private var bmp_data3 : BitmapData = new BitmapData(60, 660 , false , 0); 		private var bmp_data4 : BitmapData = new BitmapData(40, 600 , false , 0); 		private var bmp_data5 : BitmapData = new BitmapData(20, 600 , false , 0); 		private var bmp : Bitmap = new Bitmap(bmp_data); 		private var stageWidth:int = stage.stageWidth; 		private var stageHeight:int = stage.stageHeight; 		function Main() { 			stage.scaleMode = "noScale"; 			addChild(bmp); 			addChild(new Stats()); 			//ビデオファイルを読み込み、再生。最後までいくと、頭に戻る。 			if(isMztmjp()){ 			}else{ 				baseURL = "http://mztm.jp/wonderfl/"; 				Security.loadPolicyFile("http://mztm.jp/crossdomain.xml"); 			} 			var connection:NetConnection = new NetConnection(); 			connection.connect(null); 			var netStream:NetStream = new NetStream(connection); 			netStream.addEventListener (NetStatusEvent.NET_STATUS ,NET_STATUS); 			function NET_STATUS (event : NetStatusEvent):void { 				if(event.info.code == "NetStream.Play.Stop"){ 					netStream.seek(0); 				} 			} 			netStream.client = new Object(); 			netStream.play(baseURL+"medama.flv"); 			var video_obj : Video = new Video(140,105); 			video_obj.attachNetStream(netStream); 			//書き込み処理を行い続ける。 			stage.addEventListener(Event.ENTER_FRAME,ENTER_FRAME); 			function ENTER_FRAME(e:Event):void { 				count++; 				//Macのマウス座標を補正するために。 				var _x:Number = Math.min(Math.max(stage.mouseX,0),stageWidth); 				var _y:Number = Math.min(Math.max(stage.mouseY,0),stageHeight); 				//適当に中央からの距離になるように。 				_y = (_y-stageHeight/2)/200; 				//短冊に画像を書き込む。 				bmp_data0.draw(video_obj,new Matrix(1,0,0,1,0,105*(count%7))); 				bmp_data1.draw(video_obj,new Matrix(0.858,0,0,0.858,0,90*(count%8))); 				bmp_data2.draw(video_obj,new Matrix(0.572,0,0,0.572,0,60*(count%10))); 				bmp_data3.draw(video_obj,new Matrix(0.429,0,0,0.429,0,45*(count%13))); 				bmp_data4.draw(video_obj,new Matrix(0.286,0,0,0.286,0,30*(count%18))); 				bmp_data5.draw(video_obj,new Matrix(0.143,0,0,0.143,0,15*(count%34))); 				//短冊を動かしながら書き込む 				bmp_data.lock(); 				bmp_data.draw(bmp_data0,new Matrix(1,0,0,1,0,-(count*_y*(70-_x)/30)%105-105)); 				bmp_data.draw(bmp_data1,new Matrix(1,0,0,1,141,-(count*_y*(200-_x)/30)%90-90)); 				bmp_data.draw(bmp_data2,new Matrix(1,0,0,1,262,-(count*_y*(300-_x)/30)%60-60)); 				bmp_data.draw(bmp_data3,new Matrix(1,0,0,1,343,-(count*_y*(370-_x)/30)%45-45)); 				bmp_data.draw(bmp_data4,new Matrix(1,0,0,1,404,-(count*_y*(420-_x)/30)%30-30)); 				bmp_data.draw(bmp_data5,new Matrix(1,0,0,1,445,-(count*_y*(450-_x)/30)%15-15)); 				bmp_data.unlock(); 			} 		} 		private function isMztmjp():Boolean{ 			var _str:String = stage.loaderInfo.url; 			return (_str.substr(0,5) == "file:" || _str.indexOf("mztm.jp") > -1); 		} 	} }  | 
					

