Buli van!
Micsoda??? Uncsi? Szerintem is uncsi ez az egyszínű material. Szóval adjunk neki!
Ugorjunk egy nagyot és keressünk egy flv fájlt (Flash Video). Ha nincs kéznél, akkor itt van egy: Wes - Alena.
Ahhoz, hogy ezt materialként használjuk, meg kell tennünk pár dolgot.
Először is létre kell hoznunk egy Video objektumot.
public var vid:Video = new Video();
Ez az objektum úgynevezett netstream-eket tud lejátszani (én úgy fordítanám, hogy hálózati adatfolyam), ami annyit takar, hogy a hálózaton keresztül darabokban (folyamként) érkezik az adat az applikációnkhoz, nem kell letölteni az egészet ahhoz, hogy elkezdje játszani.
Hozzunk létre egy NetStreamet a deklarációk között, de ne rendeljünk hozzá new objektumot. Azt majd később tehetjük csak meg.
public var stream:NetStream;
Azért tudjuk ezt csak később létrehozni, mert a NetStream konstruktorának át kell adnunk egy NetConnection objektumot, amit előtte be kell majd állítanunk. De először is hozzunk létre egy NetConnection-t is.
public var con:NetConnection = new NetConnection();
Ok. Most akkor fordított sorrendben adjunk nekik értéket a Main függvényben:
con.connect(null);
stream = new NetStream(con);
vid.attachNetStream(stream);
stream.play("http://halaszlo.extra.hu/Wes - Alena.flv");
A connection-t null-ra állítjuk, ezzel azt mondjuk, hogy nem médiaszerverről szedjük az adatot, hanem lokális kapcsolatról van szó. Ez fontos lépés, mert különben nem működik.
A NetStream-nek átadjuk a connection-t, de csak azután, hogy null-ra állítottuk. Ezért nem tudjuk létrehozni a deklarációs részben a stream-et.
Ezután Video objektumhoz hozzárendeljük a streamet és a stream.play függvényével elindítjuk az flv-t.
Ha eddig eljutottunk, akkor akár már meg is nézhetjük a videot.
addChild(vid);
Ezután már csak hozzá kell rendelni a kockánk material-jához.
Ügyeljünk arra, hogy a deklarációs részben egyrészt a material VideoMaterial típusú legyen és ne hozzuk létre new-val az objektumot csak a Main függvényben, mivel a VideoMaterial konstruktorának meg kell adnunk a Video objektumunkat.
boxMat = new VideoMaterial(vid);
Ugyanígy az appearance-t is csak ezután hozzuk létre:
boxApp = new Appearance (boxMat);
box.appearance = boxApp;
Beleraktam még egy függvényt és ennek aktiválását arra az esetre, ha valakit zavarna a video, egy klikkel meg lehet állítani és ugyanígy újraindítani. Az esemény (klikk) figyelésére a MouseEvent.CLICK esemény "lehallgatását" használom.
addEventListener(MouseEvent.CLICK, onClick);
Ne felejtsük el az import részbe berakni előtte a MouseEvent beimportálását. A klikk esemény kezelésére pedig az onClick függvény fog meghívódni:
public function onClick(e:Event):void
{
if (streamStat == 1)
{
stream.pause();
streamStat = 0;
}
else
{
stream.resume();
streamStat = 1;
}
}
A függvényben van egy elégazás (if), ami vizsgálja, hogy a video áll, vagy megy, és ennek megfelelően a klikk hatására elindítja, vagy megállítja azt. Ennek az állapotnak a vizsgálatára felvettem egy stramStat nevű numerikus változót, amit 1-re állítok, ha megy a video és 0-ra ha megállt.
A teljes program így alakult:
(kiszedtem a material attributumokat és a forgást is egy kicsit megváltoztattam)
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import caurina.transitions.Tweener;
import flash.media.Video;
import flash.net.NetStream;
import flash.net.NetConnection;
import sandy.core.Scene3D;
import sandy.core.scenegraph.*;
import sandy.primitive.*;
import sandy.materials.*;
import sandy.materials.attributes.*;
public class Main extends Sprite
{
public var vid:Video = new Video();
public var stream:NetStream;
public var con:NetConnection = new NetConnection();
public var box:Box = new Box("box",100,100,100);
public var camera3D:Camera3D = new Camera3D(800, 600);
public var g:Group = new Group("g");
public var scene:Scene3D;
public var boxMat:VideoMaterial;
public var boxApp:Appearance;
public var streamStat:Number = 1;
public function Main():void
{
addEventListener(Event.ENTER_FRAME,onEnterFrame);
addEventListener(MouseEvent.CLICK, onClick);
con.connect(null);
stream = new NetStream(con);
vid.attachNetStream(stream);
stream.play("http://halaszlo.extra.hu/Wes - Alena.flv");
addChild(vid);
scene = new Scene3D("scene", this, camera3D, g);
g.addChild(box);
boxMat = new VideoMaterial(vid);
boxApp = new Appearance (boxMat);
box.appearance = boxApp;
}
public function onEnterFrame(e:Event):void
{
box.rotateX = box.rotateX + 1;
box.rotateY = box.rotateY + 2;
scene.render();
}
public function onClick(e:Event):void
{
if (streamStat == 1)
{
stream.pause();
streamStat = 0;
}
else
{
stream.resume();
streamStat = 1;
}
}
}
}
Megállításhoz kattints a kockára.