package { import flash.events.Event; import flash.display.DisplayObjectContainer; import flash.display.MovieClip; import flash.events.MouseEvent; import flash.net.NetStream; import flash.media.Video; import flash.events.NetStatusEvent; import flash.display.Bitmap; import flash.display.BitmapData; import flash.text.TextField; import flash.utils.Timer; import flash.events.TimerEvent; public class TilingVideo{ var container:DisplayObjectContainer; var netStream:NetStream; var netst:NetStream; var video:Video; var timer:Timer; var endTimer:Timer; var yokoNum:int; var tateNum:int; var totalNum:int; var yokoNumMax:int; var tateNumMax:int; var totalNumMax:int; var timerNum:int; var mcX:int; var mcY:int; //////////////////////////////////////////////////////////////////////////////////////// function TilingVideo(_container:DisplayObjectContainer, _netStream:NetStream){ container = _container; netStream = _netStream; netStream.addEventListener(NetStatusEvent.NET_STATUS, statusHandler); timerNum = 30; //Timerの秒数 init(); } //////////////////////////////////////////////////////////////////////////////////////// function init():void { /*video Setting*/ netStream.seek(0); netStream.resume(); video = new Video(); video.attachNetStream(netStream); video.x = 0; video.width = 240; video.height = 180; /*tile Setting*/ tateNum = 0; yokoNum = 0; mcX = 0; mcY = 0; totalNum = 0; var stageW:Number = container.stage.stageWidth; var stageH:Number = container.stage.stageHeight; yokoNumMax = Math.ceil(stageW / video.width); tateNumMax = Math.ceil(stageH / video.height); totalNumMax = yokoNumMax * tateNumMax; //すべてのタイル枚数 trace("yokoNumMax=",yokoNumMax, "tateNumMax=",tateNumMax); trace("totalNumMax=",totalNumMax); timer = new Timer(timerNum, totalNumMax); timer.addEventListener(TimerEvent.TIMER, addVideo); timer.addEventListener(TimerEvent.TIMER_COMPLETE, addEnd); timer.start(); } /*タイルのadd作業*/ function addVideo(e:TimerEvent):void { /*bpdata*/ var clone:Bitmap = new Bitmap(null); clone.addEventListener(Event.ENTER_FRAME, bdEnterFrame); //bitmapをエンターフレームする clone.name = "clone" + totalNum; container.addChild(clone); //cloneをステージに加える totalNum ++; trace("totalNum =",totalNum); /*縦と横の計算*/ if(yokoNum != yokoNumMax) { clone.x = mcX; clone.y = mcY; mcX += video.width; yokoNum ++; }else if(yokoNum == yokoNumMax) { mcY += video.height; mcX = 0; yokoNum = 0; clone.x = mcX; clone.y = mcY; mcX += video.width; yokoNum ++; } } /*bitmapの映像をエンターフレームする*/ function bdEnterFrame(e:Event):void { var cloneBD:BitmapData = new BitmapData(video.width, video.height, false, 0x65C5C5); cloneBD.draw(video); //videoを描写する var bp:Bitmap = e.target as Bitmap; bp.bitmapData = cloneBD; //描写したものをbitmapDataとして読み込む bp.smoothing = true; } /*タイルのadd作業終了*/ function addEnd(e:TimerEvent):void { trace("add end"); endTimer = new Timer(timerNum, totalNumMax); endTimer.addEventListener(TimerEvent.TIMER_COMPLETE, removeEnd); endTimer.addEventListener(TimerEvent.TIMER, removeVideo); endTimer.start(); } /*タイルのremove作業*/ function removeVideo(e:TimerEvent):void { trace("totalNum =",totalNum); var instance:String = "clone" + (totalNumMax - totalNum); var target = container.getChildByName(instance); target.removeEventListener(Event.ENTER_FRAME, bdEnterFrame); //bitmapをエンターフレームする container.removeChildAt(0); totalNum --; } /*タイルのremove作業終了*/ function removeEnd(e:TimerEvent):void { trace("remove end"); trace("containerNumChild =",container.numChildren); container.stage.addEventListener(MouseEvent.CLICK, restart); //クリックでrestart } function restart(e:MouseEvent):void { timer.removeEventListener(TimerEvent.TIMER, addVideo); timer.removeEventListener(TimerEvent.TIMER_COMPLETE, addEnd); endTimer.removeEventListener(TimerEvent.TIMER, removeVideo); endTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, removeEnd); /*エンターフレームを消す*/ for (var i:int= 0; i <= totalNumMax; i++) { var instance:String = "clone" + i; var target = container.getChildByName(instance); if (target != null){ target.removeEventListener(Event.ENTER_FRAME, bdEnterFrame); container.removeChildAt(0); } } init(); } ////////////////////////////////////////////////////////////////////////videoの終わり判定 function statusHandler(event:NetStatusEvent):void { switch (event.info.code) { case "NetStream.Play.Start": trace("Start [" + netStream.time.toFixed(3) + " seconds]"); break; case "NetStream.Play.Stop": netStream.seek(0); break; } } //////////////////////////////////////////////////////////////////////////////////////// } }