HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

Az első lépécső ama magaslathoz...

2013.03.17. 14:46 Travis.CG

Ha jó demót akarunk készíteni, akkor először egy jó motor kell. Motor alatt azt értem, hogy az alacsony szintű kép/hang megjelenítést (OpenGL) el akarom választani a jelenetektől. Eddig ha jeleneteket készítettem, akkor írtam egy függvényt, ami rengeteg OpenGL utasítást tartalmazott, majd azok paramétereit változtattam. Mostantól viszont a paraméterek külső fájlból fognak érkezni, tehát olyan kódhalmaz kell, ami a lekezeli az összes felmerülő képi hatást.

Ez viszont véget nem érő munka lenne, hiszen mindig van mit hozzáadni a kódhoz, hogy szebb legyen a látvány, ezért az "összes felmerülő" képi hatások számát 1-re redukálom. A fájlból beolvasott paramétereket is kihagyom, valamint FreeGLUT-ot használok a Windows API helyett. Ezek a végleges demó motorban természetesen ki lesznek cserélve.

Miért dolgozok kétszer? Miért nem írom meg elsőre a végleges verziót? Ez pusztán pszichológia. Ha elkezdek mindent leprogramozni, sokára fogom meglátni, mi az eredménye a munkának. Ráadásul ismeretlen operációs rendszeren, kvázi ismeretlen programozási nyelvvel dolgozok. Biztos rengeteg hibát és illogikus lépést fogok kódolni, amit egy végleges rendszerben nehezebb kijavítani. Ha már most látom, hogy a munkámnak van eredménye (valami villog a képernyőn), akkor szívesebben ülök le másnap is a gép elé. Tehát tekintsünk úgy ezekre a megkötésekre, mint az építkezésen az állványzatra. Ha kész a ház, az állványokat elbontják.

GLEW

Nem mehetek el szó nélkül amellett, hogy Linux alatt mennyire könnyű OpenGL-t programozni. Gyakorlatilag egy #define segítségével használhatom a legújabb jellemzőket. Windows alatt természetesen kézzel definiálhatom magamnak az összes függvényt, amit használni akarok, vagy használhatom a GLEW-et. Alapvetően nem szeretem a burkoló osztályokat, de a franc fogja begépelni azt a sok ostoba sort. Helyette:

glewInit();

Utána már használhatom a jól ismert OpenGL 4.x utasításokat.

FreeGLUT

Azért C++-ból használni a FreeGLUT-ot nem olyan egyszerű. Van egy demo osztályom, Show() metódussal. A terv az volt, hogy ez a metódus választja ki melyik jelenetet kell lejátszani, ezért naivan a glutWindowFunc-nak át akartam adni ezt a metódust. Sajnos ez nem megy, csak függvényt fogad el. Ez sajnos azt eredményezi, hogy kell egy burkoló függvény. A demo osztályból eltávolítottam mindent, ami az ablak nyitásáért felelős. Röviden így néz ki a main függvény:

glutInit(&argc, argv);
glutCreateWindow("demo");
// More glut related functions

demo = new cybernetic::Demo(width, height);
demo->setMusic("data/music/test.mp3");
// More demo related settings

glutDisplayFunc(show);
glutMainLoop();

Örültem volna, ha ezt a sok glut függvényt berakhatom a demo osztályba, de ez van. A másik probléma, hogy a glutMainLoop után kellene beilleszteni a destruktorokat. A dokumentáció szerint a FreeGLUT-ban van egy glutLeaveMainLoop(), feladata pedig az, hogy a glutMainLoop-ból kilépjen, hogy utána én felszabadíthassam az erőforrásokat. Csakhogy azt sem az internet, sem a dokumentáció nem mondja, hogy ehhez be kell tölteni a freeglut_ext.h fejlécet. Linux alatt persze van grep, másodpercek alatt megtaláltam volna.

void keyboard(unsigned char key, int x, int y){
    if(key == 27){
        // Exit in a nice way
        glutLeaveMainLoop();
    }
}

Ha a glutKeyboardFunc megkapja ezen függvény címét, akkor Esc-re kilépünk, felszabadítjuk az erőforrásokat és mindenki boldog.

cybernetic::Demo

Úgy döntöttem, minden demoval kapcsolatos osztályt a cybernetic névtérbe helyezek. Ebből is a legfontosabb a Demo osztály. Ez inicializálja az OpenGL-t, GLEW-et, betölti a zenét, a jeleneteket, majd lejátssza őket. Az implementálást most még nem osztom meg, de a végleges demóval szállítani fogom a forráskódot is, ahogy eddig is tettem. Majd akkor röhöghet rajtam mindenki.

Már a fenti részleten is lehet látni, hogyan kell használni. Ami ott nem látszik, az a jelenetek hozzáadása:

FirstScene scene1 = new FirstScene(0, 1000);
demo->addScene(scene1);

De mi az a FirstScene?

cybernetic::Scene

Ez az ősosztálya minden jelenetnek. Két állandó tagja van, két időpont, ami a lejátszás kezdetét és végét adja meg. Ezek egyébként a konstruktor paraméterezésében is helyet kapnak. Van egy virtuális display() metódus, ami megjeleníti a tartalmat. Most még minden Scene osztály kézzel készül, a jövőben ezt kell kiváltani valami DSL-el. A FirsScene az előző példából nem más, mint egy teszt osztály, amivel azt nézem, a demo osztály jól vált-e a jelenetek között. Természetesen még nem vált, de ennek oka egy másik osztályban keresendő.

cybernetic::Music

Annak ellenére, hogy nem szívlelem a burkoló osztályokat, az nem volt kérdéses számomra, hogy a zene lejátszásához valami külső eszközt fogok használni. Kiválasztani nem volt nehéz. Letöltöttem 5 demót, amit technológiailag előremutatónak tartok és megnéztem, mit használnak. Két választás bontakozott ki előttem: bass.dll vagy fmod.dll. A mennyiség (és a C++-os API) az fmod javára döntött. Ingyenesek ingyenes programokhoz, könnyű használni mindkettőt. Ha kellően tapasztalt leszek az fmod használatában, talán arról is írok egy bejegyzést. Most viszont csak annyit kell tudni róla:

FMOD::System *system;
FMOD::Sound *sound;
FMOD::Channel *channel;

FMOD::System_Create(&system);
system->init(1, FMOD_INIT_NORMAL, 0);
system->createStream(filename, FMOD_DEFAULT, 0, &sound);
system->playSound(FMOD_CHANNEL_FREE, sound, 0, &channel);

Készítettem egy osztályt, ami elindítja a lejátszást, és lekérdezhető a zene aktuális pozíciója. Ez utóbbi valami miatt hibás, ezért nem működik a jelenet választás. Most a hugi04-ből kiszedett zenét játszik le.

cybernetic::Shader

Már csak erről az osztályról nem beszéltem. Alapvetően eddig ugyan az, mint a régi kódom shader betöltője, csak osztályba csomagolva. A hibás shadernél már kiabál, ami jó.

Összegzés

Még sok tennivaló van vissza, míg ez a kódhalmaz valami értelmeset fog produkálni, de már látszik, hogy az eddig befektetett munka kezd megtérülni. Arról nem is beszélve, mennyi új ismeretre tettem szert C++-al kapcsolatban. Búcsúzóul itt egy kép, amit már az új motor generált.

demo1.png

A piros háttérszínnek különleges jelentése van. Így szoktam ellenőrizni, hogy működik-e az OpenGL inicializálás. Ha ugyanis a jelenettel van probléma, akkor piros az egész képernyő, de ha már az OpenGL inicializálása sem megy, akkor fekete.

Szólj hozzá!

Címkék: programozás demoscene

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr105139361

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