Mozgás, mozgás, mozgás!
Folytassuk a 3D-ben való kalandozásunkat. A kockánk jelenleg nem túl látványos. Nincs anyaga és miután csak az egyik oldalát mutatja felénk, egy négyzetet látunk. Éppen ezért forgassuk meg.
A forgatás többféleképpen történhet. Az egyik és legegyszerűbb megoldás az objektumok rotateX, rotateY, rotateZ tulajdonsága és értelemszerűen az X, Y és Z tengelyek körüli forgatás mértékét jelentik. Ezt fokokban kell megadni.
Próbáljuk ki. Tegyük be a következő sort a scene.render() elé. Előbb elforgatjuk a kockát és utána renderelünk. Ha fordítva tennénk, akkor nem látnánk változást.
box.rotateX = 30;
Nagyon pici ez a kocka. Kicsit nagyítsunk rajta. A létrehozásakor használt konstruktor paramétereket bővítsük a következőképpen:
public var box:Box = new Box("box",50,50,50);
Ezzel az x,y,z irányú hosszúságait adhatjuk meg. (gyakorlatilag az a, b, c oldaléleket).
Így már egy kicsit jobb a kép.
Viszont még mindig nem mozog ez a kocka. Ahhoz, hogy "realtime" mozgást tudjunk csinálni, szükségünk lesz egy függvényre, ami egymás után sokszor meghívódik. Ezek az úgynevezett Frame-ek. Egy másodperc alatt alapesetben 30 Frame fut le, de ezt lehet változtatni a FlashDevelop Project - Properties - Output fül alatt. El kell készítenünk egy függvényt, ami minden frame lefutásakor meghívódik, és aktiválni is kell azt.
A függvényt a Main függvény után helyezzük el. (Vigyázat Ne az osztály után...)
public function onEnterFrame(e:Event):void
{
}
Az e:Event azt jelenti, hogy ennek a függvénynek egy paramétere van, ami Event típusú. Ezt a paramétert meghíváskor fogja megkapni a függvény, de mivel ezt a függvényt nem mi hívjuk meg, hanem a rendszer, ezért egyelőre nem kell vele foglalkoznunk. Később viszont sok hasznos infót tudhatunk meg belőle, főleg arra vonatkozóan, hogy milyen "esemény" váltotta ki az eljárásunk meghívását.
Tehát ez a függvény egy esemény bekövetkeztekor fog lefutni, mégpedig akkor, amikor a program belép a következő frame-be.
Azt szeretnénk, ha a frame-ek váltásakor a kocka fordulna egy picit. Ezért az onEnterFram eljárásban fordítunk rajta egy picit. És minden egyes pici elmozdulás után újrarendereljük a scene-t.
public function onEnterFrame(e:Event):void
{
box.rotateX = box.rotateX + 1;
scene.render();
}
Ha most lefuttatjuk a programunkat, akkor nem történik semmi, mivel hiányzik egy fontos lépés. aktiválnunk kell az eseménykezelő eljárást. Valahol a Main függményben el kell helyezni a következő sort:
addEventListener(Event.ENTER_FRAME,onEnterFrame);
Ezt báhova tehetjük a Main függvényen belül de érdemes vag az elesére vagy a végére rakni, hogy könnyem megtaláljuk. Ugyanis később lehet belőle több is.
Szóval ezzell a sorral mondjuk meg, hogy az ENTER_FRAME esemény bekövetkeztekor melyik függvény fusson le. Az ENTER_FRAME esemény pedig másodpercenként 30-szor lefut (és most már a függvényünk is...)
Ateljes programunk pedig így alakult:
package
{
import flash.display.Sprite;
import flash.events.Event;
import caurina.transitions.Tweener;
import sandy.core.Scene3D;
import sandy.core.scenegraph.*;
import sandy.primitive.*;
public class Main extends Sprite
{
public var box:Box = new Box("box",50,50,50);
public var camera3D:Camera3D = new Camera3D(800, 600);
public var g:Group = new Group("g");
public var scene:Scene3D;
public function Main():void
{
addEventListener(Event.ENTER_FRAME,onEnterFrame);
scene = new Scene3D("scene", this, camera3D, g);
g.addChild(box);
box.rotateX = 30;
scene.render();
}
public function onEnterFrame(e:Event):void
{
box.rotateX = box.rotateX + 1;
scene.render();
}
}
}