halaszlo.blog.hu

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

FlashSandy 03

2009.02.27. 13:51 halaszlo

Fény, anyag, ilyesmi...

Most, hogy már mozog a kockánk. el kellene látni némi anyaggal. Ez a drótháló elég sivár.
FlashSandy-ben azt két lépésben tudjuk megtenni: szükségünk lesz egy appearance-ra (kinézet) és egy material-ra (anyag).

Először is az import szekciót ki kell egészítenünk 2 sorral:
import sandy.materials.*;
import sandy.materials.attributes.*;

Egy sima, egyszínű anyagot fogunk hozzárendelni a kockához, de ahhoz, hogy valóba 3D hatása legyen meg kell tennünk egy-két lépést. igazság szerint szerintem ezt a részt egy kicsit elbonyolították a 3. verziójában a Sandy-nek, de gondolom a maximális paraméterezhetőség érdekében tették.
A lényeg, hogy létre kell hoznunk egy materialt:

public var boxMat:Material = new ColorMaterial(0xff0000);

A ColorMatieral az egy egyszínű anyag, aminek konstruktorában meg kell adnunk az anyag színét.

A szín flashben 0x -el kezdődik, ami azt jelenti hogy hexadecimális számot adunk meg. Ezután következik a piros, a zöld és a kék színösszetevők megadása 2-2-2 karakterrel. Minden színösszetevő 00-tól ff-ig terjedhet. Segítségül itt egy táblázat a színekre.

Sajnos a materialt nem tudjuk közvetlenül hozzárendelni a tárgyhoz, ezért létre kell hozni egy appearance-t is (kinézet).

public var boxApp:Appearance = new Appearance (boxMat);

Ennek kell paraméterként átadnunk a materialt és ezt már hozzá lehet rendelni a box appearance tulajdonságához. Ezt valahol a Main függvényben megtehetjük a következő sorral:

box.appearance = boxApp;

Ezután már működik is a piros, forgó kockánk, csak mint korábban említettem fényhatás nélkül elég "egysíkú".

Amit most mutatok, azzal jelentősen lerövidíthetjük a programjainkat. Amikor paraméterként egy függvénynek vagy egy változónak nem egy értéket, hanem egy másik objektumot kell átadnunk, mindig előtte létre kell hoznunk az objektumot és utána adhatjuk át. Azonban ezt elvégezhetjük egy lépésben is. Tehát létrehozzuk az objektumot és átadjuk paraméterként. Sőt ezeket egymásba is ágyazhatjuk, így egy sorban sok-sok lépést elvégezhetünk, a programunk áttekinthetőbb lesz és nem hozunk létre felesleges objektumokat. Hátránya, hogy az így létrehozott objektumok csak akkor és ott használhatók, amikor és ahol létrehozzuk és átadjuk őket paraméterként.

Most a materialunknak kellene az attributum paraméterének átadni egy MaterialAttributes objektumot, amit előtte létre kell hoznunk. Viszont a MaterialAttributes-nak paraméterként át kellen adnunk egy LightAttributes objektumot, amit előtte szintén létre kellene hoznunk.
Mi most ezt egy lépésben megoldjuk. Így:

boxMat.attributes = new MaterialAttributes(new LightAttributes(true, 0.1));

A MaterialAttributes egy olyan tömb, aminek az egyes elemei valamilyen attributumot (tulajdonság) írnak le. (pl fény, vonalvastagság stb). Itt mi a "fény" attributumát adtuk cssak meg, aminek első paramétere az, hogy fényes legyen-e az anyag vagy sem, a második paramétere pedig a fény "erősége" a felületen (ambien light). Értéke 0 és 1 között kell, hogy legyen.

Ezen kívül egy feladatunk van, "be kell kapcsolnunk" a materialnak azt a tulajdonságát, hogy "ragáljon" a fényre:

boxMat.lightingEnable = true;

A teljes programunk í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.*;

    import sandy.materials.*;
    import sandy.materials.attributes.*;
   
    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 var boxMat:Material = new ColorMaterial(0xff0000);
        public var boxApp:Appearance = new Appearance (boxMat);

        public function Main():void
        {
            addEventListener(Event.ENTER_FRAME,onEnterFrame);
            scene = new Scene3D("scene", this, camera3D, g);
            g.addChild(box);
            boxMat.attributes = new MaterialAttributes(new LightAttributes(true, 0.1));
            boxMat.lightingEnable = true;
            box.appearance = boxApp;
            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 material sandy actionscript flashsandy addeventlistener rotatex rotatey rotatez appearance colormaterial materialattributes lightattributes

A bejegyzés trackback címe:

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

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