From 77903fbd6440bad855b0b2bf0b510a5e757778d0 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Wed, 4 May 2011 17:24:38 -0700 Subject: [PATCH] YouTube support (the stage stops emitting mouse events for some reason when we use youtube videos.) --- src/GamePlayer.as | 6 ++++-- src/Gamedisc.as | 16 +++++++++++++--- src/Main.as | 14 +++++++++++--- src/SketchShape.as | 14 ++++++++++---- src/Videotube.as | 36 ++++++++++++++++++++++++++++++++++- src/VideotubeFlv.as | 30 ++--------------------------- src/VideotubeYt.as | 46 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 121 insertions(+), 41 deletions(-) create mode 100644 src/VideotubeYt.as diff --git a/src/GamePlayer.as b/src/GamePlayer.as index 60b5290..689c7d4 100644 --- a/src/GamePlayer.as +++ b/src/GamePlayer.as @@ -1,5 +1,6 @@ package { + import flash.display.Shape; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; @@ -24,13 +25,14 @@ package { removeEventListener(Event.ADDED_TO_STAGE, init); addEventListener(Event.REMOVED_FROM_STAGE, cleanup); - stage.addEventListener(MouseEvent.CLICK, onClick); + + addEventListener(MouseEvent.CLICK, onClick); videotube.addEventListener(EventQte.QTE, onQte); } private function cleanup(e:Event):void { removeEventListener(Event.REMOVED_FROM_STAGE, cleanup); - stage.removeEventListener(MouseEvent.CLICK, onClick); + removeEventListener(MouseEvent.CLICK, onClick); videotube.removeEventListener(EventQte.QTE, onQte); } private function onQte(e:EventQte):void diff --git a/src/Gamedisc.as b/src/Gamedisc.as index 211c098..39ce9eb 100644 --- a/src/Gamedisc.as +++ b/src/Gamedisc.as @@ -7,11 +7,16 @@ package */ public class Gamedisc { + public static const VIDEOTUBE_FLV:String = "flv"; + public static const VIDEOTUBE_YOUTUBE:String = "yt"; + public var urlVideo:String; + public var typeVideotube:String; public var rgqte:Array; - public function Gamedisc(urlVideo:String) + public function Gamedisc(urlVideo:String, typeVideotube:String) { this.urlVideo = urlVideo; + this.typeVideotube = typeVideotube; this.rgqte = []; } public function AddQte(qte:Qte):void @@ -20,14 +25,18 @@ package } public function CreateVideotube():Videotube { - return new VideotubeFlv(this); + if (typeVideotube == VIDEOTUBE_FLV) + return new VideotubeFlv(this); + if (typeVideotube == VIDEOTUBE_YOUTUBE) + return new VideotubeYt(this); + throw "invalid videotube type"; } public function ToJson():Object { var jsonRgqte:Array = []; for each (var qte:Qte in rgqte) jsonRgqte.push(qte.ToJson()); - return { urlVideo: urlVideo, rgqte: jsonRgqte }; + return { urlVideo: urlVideo, typeVideotube: typeVideotube, rgqte: jsonRgqte }; } public function FromJson(json:Object):void { @@ -39,6 +48,7 @@ package rgqte.push(qte); } urlVideo = json.urlVideo; + typeVideotube = json.typeVideotube; } } diff --git a/src/Main.as b/src/Main.as index bc13597..b885739 100644 --- a/src/Main.as +++ b/src/Main.as @@ -20,7 +20,8 @@ package public function Main():void { - gamedisc = new Gamedisc("The Last Eichhof - Longplay.flv"); + //gamedisc = new Gamedisc("The Last Eichhof - Longplay.flv", Gamedisc.VIDEOTUBE_FLV); + gamedisc = new Gamedisc("EdzLFNELeCI", Gamedisc.VIDEOTUBE_YOUTUBE); videotube = gamedisc.CreateVideotube(); if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); @@ -31,9 +32,11 @@ package removeEventListener(Event.ADDED_TO_STAGE, init); // entry point addChild(videotube); - toggleGame(); stage.addEventListener(KeyboardEvent.KEY_UP, onKey); - videotube.play(); + if (videotube.fready()) + onVideotubeReady(); + else + videotube.addEventListener(Videotube.READY, onVideotubeReady); } private function toggleGame():void { @@ -58,6 +61,11 @@ package } videotube.seek(0); } + private function onVideotubeReady(event:Event = null):void + { + toggleGame(); + videotube.play(); + } private function onKey(key:KeyboardEvent):void { if (key.keyCode == Keyboard.SPACE) diff --git a/src/SketchShape.as b/src/SketchShape.as index a70f2c5..b3ba690 100644 --- a/src/SketchShape.as +++ b/src/SketchShape.as @@ -34,14 +34,20 @@ package { removeEventListener(Event.ADDED_TO_STAGE, init); addEventListener(Event.REMOVED_FROM_STAGE, cleanup); - stage.addEventListener(MouseEvent.CLICK, onClick); - stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove); + + var shapeClick:Shape = new Shape(); + shapeClick.graphics.beginFill(0x0000ff, 0); + shapeClick.graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); + addChildAt(shapeClick, 0); + + addEventListener(MouseEvent.CLICK, onClick); + addEventListener(MouseEvent.MOUSE_MOVE, onMove); } private function cleanup(e: Event):void { removeEventListener(Event.REMOVED_FROM_STAGE, cleanup); - stage.removeEventListener(MouseEvent.CLICK, onClick); - stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove); + removeEventListener(MouseEvent.CLICK, onClick); + removeEventListener(MouseEvent.MOUSE_MOVE, onMove); } public function clear():void { diff --git a/src/Videotube.as b/src/Videotube.as index bded925..5bb8773 100644 --- a/src/Videotube.as +++ b/src/Videotube.as @@ -1,6 +1,7 @@ package { import flash.display.Sprite; + import flash.events.Event; import flash.events.EventDispatcher; /** @@ -9,11 +10,44 @@ package */ public class Videotube extends Sprite { + public static const READY:String = "videotube-ready"; + + public function fready():Boolean { throw "not implemented"; } public function play():void { throw "not implemented"; } public function pause():void { throw "not implemented"; } public function resume():void { throw "not implemented"; } public function time():Number { throw "not implemented"; } public function seek(sec:Number):void { throw "not implemented"; } + + private var secPrev:Number; + private var iqte:int; + protected var gamedisc:Gamedisc; + public function Videotube(gamedisc: Gamedisc) + { + this.gamedisc = gamedisc; + secPrev = 0; + iqte = 0; + } + protected function tick(e: Event):void + { + var secNow:Number = time(); + if (secNow > secPrev && secPrev >= 0) + { + while(iqte < gamedisc.rgqte.length) + { + var qte:Qte = gamedisc.rgqte[iqte]; + if (qte.secTrigger > secNow) + break; + if (qte.secTrigger > secPrev) + dispatchEvent(new EventQte(qte)); + iqte ++; + } + } + else + { + iqte = 0; + } + secPrev = secNow; + } } - } \ No newline at end of file diff --git a/src/VideotubeFlv.as b/src/VideotubeFlv.as index 4fd4933..f2245b0 100644 --- a/src/VideotubeFlv.as +++ b/src/VideotubeFlv.as @@ -12,16 +12,10 @@ package public class VideotubeFlv extends Videotube { private var flv:Video; - private var gamedisc:Gamedisc; private var stream:NetStream; - private var iqte:int; - private var secPrev:Number; public function VideotubeFlv(gamedisc:Gamedisc) { - super(); - this.gamedisc = gamedisc; - iqte = 0; - secPrev = 0; + super(gamedisc); addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e: Event):void @@ -44,27 +38,7 @@ package removeEventListener(Event.REMOVED_FROM_STAGE, cleanup); stage.removeEventListener(Event.ENTER_FRAME, tick); } - private function tick(e: Event):void - { - var secNow:Number = stream.time; - if (secNow > secPrev && secPrev >= 0) - { - while(iqte < gamedisc.rgqte.length) - { - var qte:Qte = gamedisc.rgqte[iqte]; - if (qte.secTrigger > secNow) - break; - if (qte.secTrigger > secPrev) - dispatchEvent(new EventQte(qte)); - iqte ++; - } - } - else - { - iqte = 0; - } - secPrev = secNow; - } + public override function fready():Boolean { return true; } public override function play():void { stream.play(gamedisc.urlVideo); } public override function pause():void { stream.pause(); } public override function resume():void { stream.resume(); } diff --git a/src/VideotubeYt.as b/src/VideotubeYt.as new file mode 100644 index 0000000..20c810f --- /dev/null +++ b/src/VideotubeYt.as @@ -0,0 +1,46 @@ +package +{ + import flash.display.Loader; + import flash.events.Event; + import flash.net.URLRequest; + import flash.system.Security; + /** + * ... + * @author jjp + */ + public class VideotubeYt extends Videotube + { + private var player:Object; + private var loader:Loader; + public function VideotubeYt(gamedisc:Gamedisc) + { + super(gamedisc); + Security.allowDomain("www.youtube.com"); + player = null; + loader = new Loader(); + loader.contentLoaderInfo.addEventListener(Event.INIT, onLoaderInit); + loader.load(new URLRequest("http://www.youtube.com/apiplayer?version=3")); + } + private function onLoaderInit(event:Event):void + { + addChild(loader); + loader.contentLoaderInfo.removeEventListener(Event.INIT, onLoaderInit); + loader.content.addEventListener("onReady", onPlayerReady); + } + private function onPlayerReady(event:Event):void + { + player = loader.content; + player.setSize(stage.stageWidth, stage.stageHeight); + player.cueVideoById(gamedisc.urlVideo); + + stage.addEventListener(Event.ENTER_FRAME, tick); + dispatchEvent(new Event(Videotube.READY)); + } + public override function fready():Boolean { return player !== null; } + public override function play():void { player.playVideo(); } + public override function pause():void { player.pauseVideo(); } + public override function resume():void { player.playVideo(); } + public override function time():Number { return player.getCurrentTime(); } + public override function seek(sec:Number):void { player.seekTo(sec, true); } + } +} \ No newline at end of file