[ < ] |
[ > ] |
|
[ << ] |
[ Up ] |
[ >> ] |
|
|
|
|
[Top] |
[Contents] |
[Index] |
[ ? ] |
A Crystal Space -ben létezik egy 'iView' nevű interfész, ami magába foglal egy az 'iCamera' és egy 'iClipper2d' példányt. Elvileg használhatod ezeket osztályokat külön is, de az 'iView' használata egyszerűbb. Most szerkeszük a 'simple.h' -t, hogy használni tudjuk az 'iView'-et:
|
... class Simple { private: ... csRef<iView> view; ... void ProcessFrame (); void FinishFrame (); ... |
Aztán szerkeszd a 'simple.cpp' fájt és tedd meg az alábbi változtatásokat az Application() függvény végén:
|
bool Simple::Application () { ... view.AttachNew(new csView (engine, g3d)); iGraphics2D* g2d = g3d->GetDriver2D (); view->SetRectangle (0, 0, g2d->GetWidth (), g2d->GetHeight ()); ... view->GetCamera ()->SetSector (room); view->GetCamera ()->GetTransform ().SetOrigin (csVector3 (0, 5, -3)); return true; } |
Tehát elsőként létrehozunk egy nézetet a világunkban, és egy különáló 3D renderert. A nézetnek saját szektora van, ami a kamerához tartozik és a SetSector() segítségével állítható be. Emellett a kamerának pozíciója van a szektorban, amit be lehet állítani, ehhez venni kell a kamerát a GetCamera() segítségével és ezután be lehet állítani a pozíciót (ami egy csVector3) a SetPosition() A nézet tárol egy vágási területet, ami a világot kirajzoló ablakba illeszkedik. A Crystal Space támogatja a konvex poligonokat, mint nézőteret, deebben az esetben egy egyszerű téglalapot használunk, aminek a mérete megegyezik az ablak méretével. Ezt a nézeti téglalapot a SetRectangle() függvénnyel állítjuk be.
Egy új nézet létrehozásának a meghívása egy kicsit különleges. Lásd a gyors pointereket részletesebben bemutató részt. Correctly Using Smart Pointers
Ez még mindig nem elég. Van egy kameránk, de még nem használjuk azt. Meg kell írnunk azt a kódot, ami a tulajdonképpeni képernyőre rajzolást végzi. Ezt a ProcessFrame() és FinishFrame() függvényekben végezzük el. Megjegyezzük,hogy a Crystal Space eseményvezérelt, tehát a rajzolás frissítését az eseménykezelő idézi elő. Add a következő kódot a a forrásfájlhoz:
|
void Simple::ProcessFrame () { // Tell 3D driver we're going to display 3D things. if (!g3d->BeginDraw( engine->GetBeginDrawFlags() | CSDRAW_3DGRAPHICS)) return; // Tell the camera to render into the frame buffer. view->Draw (); } void Simple::FinishFrame () { g3d->FinishDraw (); g3d->Print (0); } |
A képernyőre rajzolás két lépésben történik. Az első rész a ProcessFrame() függvényben zajlik l. Itt töltjük ki a megjelenítést. Ebben az esetben az engine-t kérjük meg, hogy végezze ezt el a view->Draw() meghívásával. De elméletileg bármilyen rajz műveletet el tudsz it végezni.
A ProcessFrame() függvényben
ekőször jelezzük a 3D raszterizálónak, hogy
el akarjuk indítani a 3D grafika kirajzolását.
Ez a hívás biztossá teszi, hogy a szükséges
bufferek elő vannak készíve és megtörtént
minden szükséges inicializálás.Az engine
gyakran igényel további beállításokat
ezért meg kell hínod az engine->GetBeginDrawFlags()
függvényt ezeknek a jelzőbitekenek az eléréséhez.
A második rész a FinishFrame(), ahol a képkockát (frame) a képernyőre helyezzük. Ez a megosztás azért van, mert más Crystal Space konponensek (pluginok) válaszhatják azt, hogy lehallgatájk az eseményeket és további dolgkat rajzolnak a 3D nézet tetejére a ProcessFrame() függvényben. Ha egy képkocákt renderelni kell, a Crystal space keretrendszer négy üzenetet fog elküldeni:
`cscmdPreProcess' az elsőnek elküldött.Ez lehetővé teszi a pluginoknak, hogy előfeldolgozzanak, mielőtt rajzolás elkezdődne.
`cscmdProcess' a következő. Itt fog az alkalmazás renderelni.
`cscmdPostProcess' jön ezután. Ezt haszánlhatják a külső komponensek, hogy az alkalmazás által renderelt kép felé rendereljenek.
`cscmdFinalProcess' azutolsó. Itt az alkalmazás megjeleníti a képkockát a képernyőn.
Fordítsd le és futtasd az alkalmazást! Ez az első alkalom hogy látniis fogsz vlaamit, egy szilárd falat. Gratulálunk, megalkottad az első majdnem használható Crystal Space alkalmazásodat.
[ < ] |
[ > ] |
|
[ << ] |
[ Up ] |
[ >> ] |
This document was generated using texi2html 1.76.