A Útmutató 6. ogre3d

rÖVID BEMUTATKOZÁS

Ebben a leírásban, akkor megtanulják, hogyan kell írni egy egyszerű Ogre alkalmazás a semmiből.

szükséges ismeretek

Ez az útmutató feltételezi, hogy van tudás programozás C ++, és meg tudja-e telepíteni, és összeállítja az alkalmazást a Ogre.
Ez az útmutató azt is feltételezi, hogy már létrehozott egy projektet az Ogre Wiki Tutorial keret, akár kézzel, például CGyõzõdjön vagy Ogre AppWizard.
Ez az útmutató alapján az előző, és azt jelenti, hogy már dolgozott velük.

eredeti kódot

Ebben az útmutatóban az üres keret lesz számunkra a kiindulási pont.

FIGYELEM

A folytatás előtt ellenőrizze, hogy a projekt létre, és hogy két fájlt: a fejléc és a cpp.
Ha használt Ogre bemutatója Wiki Framework, törölni, és BaseApplication.h BaseApplication.cpp.

  1. osztály BasicTutorial6
  2. nyilvános:
  3. BasicTutorial6 (void);
  4. tényleges
  1. #include "BasicTutorial6.h"
  2. #include
  3. // -----------------------------
  4. BasicTutorial6 :: BasicTutorial6 (void)
  5. >
  6. // -----------------------------
  7. BasicTutorial6 ::
BasicTutorial6 (void)
  • >
  • bool BasicTutorial6 :: megy (void)
  • return true;
  • >
  • #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
  • #define WIN32_LEAN_AND_MEAN
  • #include "windows.h"
  • #endif
  • #ifdef __cplusplus
  • extern "C"
  • #endif
  • #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
  • INT WinAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
  • #else
  • int main (int argc, char * argv [])
  • #endif
  • // Létrehozunk alkalmazás objektum
  • BasicTutorial6 app;
  • megpróbál
  • app.go ();
  • >
  • catch (Exception Ogre :: e)
  • #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
  • MessageBox (NULL, e.getFullDescription () c_str (), "Egy kivétel történt!" MB_OK | MB_ICONERROR | MB_TASKMODAL ..);
  • #else
  • std :: cerr <<"An exception has occured: " <
  • #endif
  • >
  • vissza 0;
  • >
  • #ifdef __cplusplus
  • >
  • #endif
  • Győződjön meg róla, akkor össze ezt a kódot a folytatás előtt. A kód nem csinálni semmit - a program után azonnal kilép kezdődik.

    Ne aggódj, miután egy sétát tesz az útmutató, akkor eléri a teljes funkcionalitású alkalmazás Ogre.

    Process belül futnak

    Ha megértjük, hogy a folyamatok rejtve a szem, munka Ogre sokkal könnyebb lesz. Példa keret úgy néz ki, meglehetősen komplikált, mivel próbál tenni egy csomó dolog, hogy nem feltétlenül szükséges az alkalmazás, de ez csak első pillantásra. A lecke elvégzése, akkor képes lesz arra, hogy válasszon, amit valóban szükséges az alkalmazás. Mielőtt részletezném mindezt, kezdjük egy rövid áttekintést az indítási folyamatot.

    Base Ogre életciklusa így néz ki:

    1. Hozza létre a gyökér tárgy (root)
    2. Határozza meg a források, hogy Ogre fogja használni
    3. Válassza ki és szabja testre a rendszer-átalakító (DirectX, OpenGL, és így tovább)
    4. Hozzon létre egy renderelő ablak (RenderWindow) (egy ablak, amely Ogre a kijelzőn)
    5. kiindulási helyzetbe az összes erőforrás, amit használni fog
    6. Hozzon létre egy jelenetet ezekből a forrásokból
    7. Állítsa be az összes többi könyvtárak és plug-inek
    8. Készítsen akárhány rakodók keretek
    9. Indítsa el a kijelző ciklus

    Ebben a leckében megy keresztül minden elem a mélységet.

    futó Ogre

    A gyökér objektum

    A gyökér tárgy lényege OGRE motor és létre kell hozni, mielőtt elkezdi csinál semmit a motor.

    Meg kell adni a következő tagok BasicTutorial6 osztály:

    1. private:
    2. Ogre :: Root * mRoot;
    3. Ogre :: string mPluginsCfg;
    1. bool BasicTutorial6 :: megy (void)
    2. #ifdef _DEBUG
    3. mPluginsCfg = "plugins_d.cfg";
    4. #else
    5. mPluginsCfg = "plugins.cfg";
    6. #endif
    7. // Ogre :: Root
    8. mRoot = új Ogre :: Root (mPluginsCfg);
    9. return true;
    10. >

    Constructor osztály Ogre :: Root három paramétert:

    pluginFileName ( „plugins.cfg”) - a teljes fájl elérési útvonalát, ahol az összes beépülő van bejegyezve.
    configFileName ( „ogre.cfg”) - a teljes elérési utat a konfigurációs fájl
    LogFilename ( „Ogre.log”) - a teljes elérési utat a log fájlt a motor OGRE amely rögzíti minden, ami történik benne.

    Tudtuk hagyja meg az alapértelmezett értékeket, de a mi alkalmazás dolgozni előszerelt Ogre SDK, ahol a plug-in konfigurációs fájl neve eltérő attól függően, hogy debug módban (Debug) összeszerelt motor, vagy a végső (Release), akkor át kell adni a mPluginsCfg paraméter a kivitelező, a konfigurációs fájl neve lesz „plugins_d.cfg”, ha fut debug módban.

    Menj előre - lefordítani és futtatni az alkalmazás.
    Úgy néz ki, ha nem történik semmi, de ha kinyitja Ogre.log, látni fogja, mit Ogre kezdődött, megtörtént és kész. Továbbá, meg kell látni, hogy ez elemezte az eredményeket és a telepített plug-inek szerepel a „plugins.cfg”.

    Megjegyzés: ez a rész lesz sokkal több értelme, ha nyitott „resources.cfg”, és nézd meg, mielőtt folytatná. Megtalálható a könyvtárban bin / kiadja az SDK. A következő dolog, amit tennie kell - határozza meg a felhasznált források alkalmazás. Lehet textúrák, minták, scriptek, és így tovább.

    Ebben a leírásban nem fogjuk ásni a témában a források. Egyelőre csak tartsd észben, hogy először meg kell azonosítani az összes erőforrás, hogy fogják használni az alkalmazást, és inicializálja az is, hogy kihasználják az ogre. Ebben a szakaszban határozzuk meg a forrásokat, amelyeket használni fognak az alkalmazás. Ehhez még hozzá minden könyvtár források ResourceGroupManager.

    Add hozzá a következő osztály tagja BasicTutorial6 osztály:

    Most meg kell adni az OIS a beállítást a projekt:

    Tartalmazza Directory $ (OGRE_HOME) / include / OIS
    Input Könyvtár OIS_d.lib / OIS.lib

    A jegyzék a könyvtár legyen a helyén.
    Győződjön meg arról, hogy miután OIS hozzá a projekt, akkor fordítsuk le.

    hozzáadása OIS

    OIS használ InputManager fő modult, ami egy kicsit nehéz létrehozni, de ha ez nincs megfelelően megtervezve, könnyen kezelhető. OIS nem integrálódik Ogre; ez - egy önálló könyvtár, ami azt jelenti, hogy szükség lesz, hogy neki némi információt az elején, hogy ez működjön. A gyakorlatban ez azt követeli csak a kilincset az ablak, amely megjeleníti tárgyak Ogre. Szerencsére sokkal könnyebb lesz, mint szoktuk létrehozása az alapértelmezett ablak.

    Megy a funkció BasicTutorial6 :: menj és add ezt a kódot a kijelzőn ciklus:

    1. Ogre :: LogManager :: getSingletonPtr () -> logMessage ( "*** inicializálása OIS ***");
    2. OIS :: ParamList pl;
    3. size_t windowHnd = 0;
    4. std :: ostringstream windowHndStr;
    5. mWindow-> getCustomAttribute ( "ablak". windowHnd);
    6. windowHndStr <
    7. pl.insert (std :: make_pair (std :: string ( "ablak"), windowHndStr.str ()));
    8. mInputManager = OIS :: InputManager :: createInputSystem (pl);

    Ez határozza InputManager használni, de hogy ténylegesen használni OIS. Az adatok billentyűzet, egér vagy joystick, akkor létre kell hozni ezeket a tárgyakat:

    1. mKeyboard = static_cast (MInputManager-> createInputObject (OIS :: OISKeyboard, false));
    2. mMouse = static_cast (MInputManager-> createInputObject (OIS :: OISMouse, false));

    Elhaladunk hamis createInputObject funkció, mert azt szeretnénk, hogy a mi egér és billentyűzet nem pufferelt.

    Megjegyzés: Ha a használni kívánt pufferelt bemenet (azaz, ha kap egy visszahívás mouseMoved rendezvények, mousePressed, keyReleased, és így tovább), akkor be kell állítanunk a második paraméter createInputObject, milyen igaz.

    letiltása OIS

    OIS kicsit nehéz, hogy kapcsolja ki rendesen. A legbiztonságosabb módja ennek - használja WindowEventListener.

    Először is, hogy ezt a sort a kapcsolatok listájában (magában) BasicTutorial6.h:

    1. osztály BasicTutorial6. nyilvános Ogre :: WindowEventListener
    1. // Ogre :: WindowEventListener
    2. virtuális void windowResized (Ogre :: RenderWindow * rw);
    3. virtuális void windowClosed (Ogre :: RenderWindow * rw);

    Most nyílt BasicTutorial6.cpp és adjuk hozzá a következő neki:

    1. // állítsa egér nyírás nagysága
    2. void BasicTutorial6 :: windowResized (Ogre :: RenderWindow * rw)
    3. unsigned int szélesség, magasság, mélység;
    4. int bal, felső;
    5. rw-> getMetrics (szélesség, magasság, mélység, bal, felső);
    6. const OIS :: MouseState ms = mMouse-> getMouseState ();
    7. ms.width = szélessége;
    8. ms.height = magasság;
    9. >
    10. // Unattach OIS előtt ablakban shutdown (nagyon fontos Linux alatt)
    11. void BasicTutorial6 :: windowClosed (Ogre :: RenderWindow * rw)
    12. // Csak közeli ablak, amely megteremtette OIS (főablakához ezeket a bemutatókat)
    13. if (rw == mWindow)
    14. if (mInputManager)
    15. mInputManager-> destroyInputObject (mMouse);
    16. mInputManager-> destroyInputObject (mKeyboard);
    17. OIS :: InputManager :: destroyInputSystem (mInputManager);
    18. mInputManager = 0;
    19. >
    20. >
    21. >

    windowResized okozhat, ha egy ablak átméretezés, és győződjön meg róla, hogy a helyzet az OIS egér szinkronban van a jelenlegi ablak méretét.
    windowClosed kiküszöböli OIS, amikor az ablak zárva van.

    Ahhoz, hogy a kérelmet, hogy egyfajta WindowEventListener, akkor regisztrálnia kell őket.
    Így add hozzá a következő sorokat BasicTutorial6 :: go funkció:

    1. // beállítása kezdeti egér vágási mérete windowResized (mWindow);
    2. // Regisztráció Window hallgató Ogre :: WindowEventUtilities :: addWindowEventListener (mWindow, e);

    Van még egy dolog, amit meg kell csinálni.
    Keresse BasicTutorial6 destructor és csináld így:

    1. // Távolítsuk magunkat, mint egy ablak hallgató
    2. Ogre :: WindowEventUtilities :: removeWindowEventListener (mWindow, e);
    3. windowClosed (mWindow);
    4. törölni mRoot;

    Beállítás személyzeti rakodók

    Függetlenül attól, hogy az Ön által használt pufferelt vagy nem pufferelt bemenet, minden keret, meg kell hívni a capture módszer minden tárgyat, hogy használja a billentyűzet, egér vagy joystick ...

    A nem pufferelt bemenet is - mindössze annyit kell tennie.
    Minden keret okozhat a különböző billentyűzet és egér funkcióit, hogy kérje a helyzet ezen objektumok.

    Tehát van, hogy egy osztály lesz a karrier BasicTutorial6 kezelő.

    1. osztály BasicTutorial6. nyilvános Ogre :: WindowEventListener, nyilvános Ogre :: FrameListener
    1. // Ogre :: FrameListener
    2. virtuális bool frameRenderingQueued (const Ogre :: FrameEvent EVT);

    És akkor, BasicTutorial6.cpp, adjuk hozzá a függvénydefinícióban

    1. bool BasicTutorial6 :: frameRenderingQueued (const Ogre :: FrameEvent EVT)
    2. ha (mWindow-> isClosed ())
    3. return false;
    4. // kell rögzíteni / frissítése minden eszköz
    5. mKeyboard-> rögzítés ();
    6. mMouse-> rögzítés ();
    7. if (mKeyboard-> isKeyDown (OIS :: KC_ESCAPE))
    8. return false;
    9. return true;
    10. >

    Utolsó simítások

    Ha még nem vagyunk készen összeállításához és az alkalmazás futtatásához, akkor regisztrálnia kell a felvezető személyzetet. És mi is, nem kell rendering ciklust.

    Keresse BasicTutorial6 :: megy, és távolítsa el a while ciklus.
    Ezután add hozzá:

    1. mRoot-> addFrameListener (e);
    2. mRoot-> startRendering ();

    Az első sor kódot hozzáadja BasicTutorial6 a gyökér, mint a rendszeres része a felvezető, az azt jelenti, hogy az osztály kap a keret esemény. Ha nem regisztrálja egy osztályban Ogre :: Root egy káder felvezető, frameRenderingQueued funkció nem nevezhető.

    A második kódsor kezdődik aktuális képi ciklust. Mi tényleg nem kell semmilyen speciális kezelési ciklus, végezzük a dolgunkat frameRenderingQueued funkció „Non-modális”.

    Összeállításához és futtatásához!

    Látnia kell egy vállalkozás vezetője ogre és a kérelmet el kell zárni, ha megnyomja a „Esc” gombot.

    kakaó verzió

    Egy új módja annak, hogy állítsa be a jelenlegi iránymutatások Xcode a Mac OS X sokkal rövidebb és könnyebben érthető.
    Győződjön meg arról, hogy a projekt összeállított kakaót alkalmazást, és változtassa meg a kiterjesztést .cpp a-mm, további másolati .cfg források és a plug-in fájlok Xcode mappát.

    Most az alábbi:

    1. #ifdef _DEBUG
    2. mResourcesCfg = "resources_d.cfg";
    3. mPluginsCfg = "plugins_d.cfg";
    4. #else
    5. mResourcesCfg = "resources.cfg";
    6. mPluginsCfg = "plugins.cfg";
    7. #endif
    1. #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
    2. std :: karakterlánc mResourcePath = [[[NSBundle mainBundle] resourcePath] cStringUsingEncoding: NSUTF8StringEncoding];
    3. #endif
    4. #ifdef _DEBUG
    5. #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
    6. mResourcesCfg = mResourcePath + "/resources_d.cfg";
    7. mPluginsCfg = mResourcePath + "/plugins_d.cfg";
    8. #else
    9. mResourcesCfg = "resources_d.cfg";
    10. mPluginsCfg = "plugins_d.cfg";
    11. #endif
    12. #else
    13. #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
    14. mResourcesCfg = mResourcePath + "/resources.cfg";
    15. mPluginsCfg = mResourcePath + "/plugins.cfg";
    16. #else
    17. mResourcesCfg = "resources.cfg";
    18. mPluginsCfg = "plugins.cfg";
    19. #endif

    Carbon változat

    Mivel a Mac OS X használja az alkalmazást kötegek, a koncepció gyökeresen eltér az egyik, hogy az általunk használt Windows és Linux. A kód fent leírtak szerint (magasabb, mint az előző részben) nem fog futni a Mac OS X

    Adjuk hozzá a következő függvényt:

    A createRoot (), a változás: