Mercurial > fife-parpg
diff ext/guichan-0.8.1/examples/openglsdl.hpp @ 89:fa33cda75471
* Reverting back to 2543 as requested by sleek
author | mvbarracuda@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Sat, 19 Jul 2008 11:38:52 +0000 |
parents | 4a0efb7baf70 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ext/guichan-0.8.1/examples/openglsdl.hpp Sat Jul 19 11:38:52 2008 +0000 @@ -0,0 +1,133 @@ +/* + * Code that sets up an OpenGL application with Guichan using the + * Guichan OpenGL back end and the SDL back end (as OpenGL cannot + * load images nor check for user input an additional back end needs + * to be used). + */ + +#include <guichan.hpp> +#include <guichan/opengl.hpp> +// The openglsdlimageloader.hpp header file needs to be included +// in order to get the image loader that uses OpenGL and SDL. +#include <guichan/opengl/openglsdlimageloader.hpp> +#include <guichan/sdl.hpp> + +namespace openglsdl +{ + bool running = true; + SDL_Surface* screen; + + // All back ends contain objects to make Guichan work on a + // specific target. They are a Graphics object to make Guichan + // able to draw itself using OpenGL, an input objec to make + // Guichan able to get user input using SDL and an ImageLoader + // object to make Guichan able to load images using OpenGL and SDL. + gcn::OpenGLGraphics* graphics; + gcn::SDLInput* input; + gcn::OpenGLSDLImageLoader* imageLoader; + + /** + * Initialises the OpenGL and SDL application. This function creates the global + * Gui object that can be populated by various examples. + */ + void init() + { + // We simply initialise OpenGL and SDL as we would do with any OpenGL + // and SDL application. + SDL_Init(SDL_INIT_VIDEO); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + + screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_OPENGL | SDL_HWACCEL); + + glViewport(0, 0, 640, 480); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + + // We want unicode for the SDLInput object to function properly. + SDL_EnableUNICODE(1); + // We also want to enable key repeat. + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + + // Now it's time to initialise the Guichan OpenGL back end + // and the Guichan SDL back end. + + imageLoader = new gcn::OpenGLSDLImageLoader(); + // The ImageLoader Guichan should use needs to be passed to the Image object + // using a static function. + gcn::Image::setImageLoader(imageLoader); + graphics = new gcn::OpenGLGraphics(); + // We need to tell the OpenGL Graphics object how big the screen is. + graphics->setTargetPlane(640, 480); + input = new gcn::SDLInput(); + + // Now we create the Gui object to be used with this OpenGL + // and SDL application. + globals::gui = new gcn::Gui(); + // The Gui object needs a Graphics to be able to draw itself and an Input + // object to be able to check for user input. In this case we provide the + // Gui object with OpenGL and SDL implementations of these objects hence + // making Guichan able to utilise OpenGL and SDL. + globals::gui->setGraphics(graphics); + globals::gui->setInput(input); + } + + /** + * Halts the OpenGL and SDL application. + */ + void halt() + { + delete globals::gui; + + delete imageLoader; + delete input; + delete graphics; + + SDL_Quit(); + } + + /** + * Runs the OpenGL and SDL application. + */ + void run() + { + // The main loop + while(running) + { + // Check user input + SDL_Event event; + while(SDL_PollEvent(&event)) + { + if (event.type == SDL_KEYDOWN) + { + if (event.key.keysym.sym == SDLK_ESCAPE) + { + running = false; + } + if (event.key.keysym.sym == SDLK_f) + { + if (event.key.keysym.mod & KMOD_CTRL) + { + // Works with X11 only + SDL_WM_ToggleFullScreen(screen); + } + } + } + else if(event.type == SDL_QUIT) + { + running = false; + } + + // After we have manually checked user input with SDL for + // any attempt by the user to halt the application we feed + // the input to Guichan by pushing the input to the Input + // object. + input->pushInput(event); + } + // Now we let the Gui object perform its logic. + globals::gui->logic(); + // Now we let the Gui object draw itself. + globals::gui->draw(); + // Finally we update the screen. + SDL_GL_SwapBuffers(); + } + } +}