|
[ < ] |
[ > ] |
|
[ << ] |
[ 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.