Although the simplest method of creating an OGRE application is to use the wizard in Code::Blocks, OGRE applications can easily be created manually in Code::Blocks or other environments like Visual Studio. Doing this requires some knowledge of the various OGRE functions and classes. Creating an OGRE application in this way is examined throughout the rest of this chapter.
It has been shown how, even in ClanLib applications, each application needs a main function where execution begins and ends. OGRE is no different. Consider the following code:
#include <Ogre.h> #include <ExampleApplication.h> #include "windows.h" int main(int argc, char **argv) { return 0; }
Note | Notice the source files Ogre.h and ExampleApplication.h. These files contain a number of variables, functions, and classes that are part of OGRE. |
Games require classes and functions, one of which is a game loop to keep the game running and call a Paint function to draw the game contents to the display several times per second. In ClanLib this function was created manually using a While loop. A number of objects, such as CL_Setup, needed to be created on application startup. OGRE works differently by offering a class hierarchy where much of this functionality is automated. Programmers create derived classes to extend this functionality or modify behavior as required.
Specifically, applications should create their own class derived from the premade ExampleApplication class. ExampleApplication provides the bare-bones structure for a standard OGRE application such as initializing the OGRE engine, sustaining a game loop, and error handling. It contains a number of virtual functions that descendants can override to redefine behavior when certain events call those functions. For example, the createScene method of Example-Application should be overridden by descendants to define what occurs when the application is created and the scene begins. Consider the following class declaration:
class SampleApp : public ExampleApplication { public: // Basic constructor SampleApp() {} protected: // Just override the mandatory create scene method void createScene(void) { //Setup Scene Here } };
To create a game window, sustain a message, create a scene, and manage error handling, only one step needs to be performed with OGRE: the SampleApp class (which was derived from Example-Application in the previous section) needs to be declared. Consider the following program and attempt to run the application.
Figure 18.10
// ------------------------------------------------------------------------- // Include the main OGRE header files // Ogre.h just expands to include lots of individual OGRE header files // --------------------------------------------------------------------------- #include <Ogre.h> // --------------------------------------------------------------------------- // Include the OGRE example framework // This includes the classes defined to make getting an OGRE application // running a lot easier. It automatically sets up all the main objects and // allows you to just override the bits you want to instead of writing it all // from scratch. // --------------------------------------------------------------------------- #include <ExampleApplication.h> // --------------------------------------------------------------------------- // Define the application object // This is derived from ExampleApplication, which is the class OGRE provides // to make it easier to set up OGRE without rewriting the same code all the // time. You can override extra methods of ExampleApplication if you want to // further customize the setup routine; otherwise, the only mandatory override // is the 'createScene' method, which is where you set up your own personal // scene. // --------------------------------------------------------------------------- class SampleApp : public ExampleApplication { public: // Basic constructor SampleApp() {} protected: // Just override the mandatory create scene method void createScene(void) { //Empty scene; this program will be a blank screen. } }; // --------------------------------------------------------------------------- // Main function, just boots the application object // --------------------------------------------------------------------------- #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 #define WIN32_LEAN_AND_MEAN #include "windows.h" INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT) #else int main(int argc, char **argv) #endif { // Create application object SampleApp app; try { app.go(); } catch(Exception& e) { #if OGRE_PLATFORM == OGRE_PLATFORM_WIN32 MessageBox(NULL, e.getFullDescription().c_str(), "An exception has occurred!", MB_OK | MB_ICONERROR | MB_TASKMODAL); #else std::cerr<<"An exception has occurred: "<<e.getFullDescription(); #endif } return 0; }
The application can now execute using the OGRE engine, but the screen appears blank. This is because the scene is empty. There is no image, model, light, or anything else in the scene. We'll discuss the specifics of creating an OGRE scene in the next chapter; however, to create something right now that can be seen, consider the following code that creates a sky box and some lights. A sky box is analogous to a cube surrounding the camera, with the camera positioned in the center of the cube. The interior faces of the cube are wallpapered (textured) with a seamless image so it appears as though the camera is surrounded by an environment. The lights, of course, give the scene brightness in the same way the sun lights the earth.
Figure 18.11
Consider the following class declaration with a createScene method:
class SampleApp : public ExampleApplication { public: // Basic constructor SampleApp() {} protected: // Just override the mandatory create scene method void createScene(void) { // Create the SkyBox mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox"); // Create a light Light* myLight = mSceneMgr->createLight("Light0"); myLight->setType(Light::LT_POINT); myLight->setPosition(0, 40, 0); myLight->setDiffuseColour(1, 1, 1); myLight->setSpecularColour(1, 1, 1); } };