halaszlo.blog.hu

Nagy divat lett ez a blog írás mostanában, hát gondoltam, én is elkezdem...

FlashSandy 02

2009.02.27. 10:30 halaszlo

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();
        }
    }
}

Szólj hozzá!

Címkék: flash tutorial programozás event 3d sandy actionscript flashsandy addeventlistener rotatex rotatey rotatez

A bejegyzés trackback címe:

https://halaszlo.blog.hu/api/trackback/id/tr29969234

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása