Video in PaperVision 3D - PART 3
Play & Pause +
Load new video on the fly
This example continues on the previous examples by adding a play and pause button. This example also adds two buttons that load a new video in to the VideoStreamMaterial texture.
Download Soruce Files
package {
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.text.TextField;
import org.papervision3d.materials.VideoStreamMaterial;
import org.papervision3d.objects.primitives.Plane;
public class VideoPlusControl extends PaperBase {
protected var sceneWidth:Number;
protected var sceneHeight:Number;
private var videoPlane:Plane;
private var netConnection:NetConnection;
private var videoStreamMaterial:VideoStreamMaterial;
private var video:Video;
private var netStream:NetStream;
public function VideoPlusControl(){
sceneWidth = stage.stageWidth
sceneHeight = stage.stageHeight;
init(sceneWidth,sceneHeight);
}
/* Created buttons used to control video.
This 2D layer is on top of the 3D layer - see paper base class */
override protected function init2d() : void {
var video1:Sprite = makeButton('Play Video One');
video1.addEventListener(MouseEvent.CLICK, playVideo1);
addChild(video1);
var video2:Sprite = makeButton('Play Video Two');
video2.addEventListener(MouseEvent.CLICK, playVideo2);
video2.y = 30;
addChild(video2);
var play:Sprite = makeButton('PLAY');
play.addEventListener(MouseEvent.CLICK, playVideo);
play.y = 60;
addChild(play);
var pause:Sprite = new Sprite();
pause.addChild(makeButton('PAUSE'));
pause.addEventListener(MouseEvent.CLICK, pauseVideo);
pause.y = 90;
addChild(pause);
// Create button graphics
function makeButton(title:String) : Sprite {
var label:TextField = new TextField();
label.textColor = 0xFFFFFF;
label.text = title;
label.selectable = false;
var bg:Sprite = new Sprite();
bg.graphics.beginFill(0x000000);
bg.graphics.drawRect(0,0,label.width,20);
bg.alpha = .8;
bg.addChild(label);
bg.addEventListener(MouseEvent.MOUSE_OVER, onState );
bg.addEventListener(MouseEvent.MOUSE_OUT, offState );
function onState(e:Event) : void {
label.textColor = 0x000000;
bg.graphics.clear();
bg.graphics.beginFill(0xFFFFFF);
bg.graphics.drawRect(0,0,label.width,20);
}
function offState(e:Event) : void {
label.textColor = 0xFFFFFF;
bg.graphics.clear();
bg.graphics.beginFill(0x000000);
bg.graphics.drawRect(0,0,label.width,20);
}
return bg;
}
}
override protected function init3d(): void {
videoMaterial(); // Create video material texture
// Match the aspect ratio of the video w480 & h360
videoPlane = new Plane( videoStreamMaterial, 480, 360, 10, 10 );
videoPlane.scale = 1;
default_scene.addChild(videoPlane);
}
public function videoMaterial() : void {
var customClient:Object = new Object();
customClient.onMetaData = metaDataHandler;
netConnection = new NetConnection();
netConnection.connect(null);
netStream = new NetStream(netConnection);
netStream.client = customClient;
netStream.play( "assets/video.f4v" );
// Match the pixel size of the video w480 & h360
video = new Video(480,360);
video.smoothing = true;
video.attachNetStream(netStream);
videoStreamMaterial = new VideoStreamMaterial(video, netStream, true, true);
videoStreamMaterial.doubleSided = true;
}
// Required to catch meta data from
private function metaDataHandler(infoObject:Object) : void {
trace("metaData");
}
private function pauseVideo(e:Event) : void {
// Pauses video from a playing state
netStream.pause();
}
private function playVideo(e:Event) : void {
// Resumes video from a pause() state
netStream.resume();
}
private function playVideo1(e:Event) : void {
// Load up new video and starts from the beginning
netStream.play( 'assets/video_plus_alpha.flv' );
}
private function playVideo2(e:Event) : void {
// Load up new video and starts from the beginning
netStream.play( 'assets/video.f4v' );
}
override protected function processFrame() : void {
// Relates the video planes X & Y location to the MouseX & Mouse Y
videoPlane.z = -((mouseY / sceneHeight) * 800)
videoPlane.rotationY = -((mouseX / sceneWidth) * 360)
}
}
}
|