Mercurial > fife-parpg
diff ext/guichan-0.8.1/examples/sdl.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/sdl.hpp Sat Jul 19 11:38:52 2008 +0000 @@ -0,0 +1,120 @@ +/* + * Code that sets up an SDL application with Guichan using the + * Guichan SDL back end. + */ + +#include <guichan.hpp> +#include <guichan/sdl.hpp> + +namespace sdl +{ + bool running = true; + SDL_Surface* screen; + + // All back ends contain objects to make Guichan work on a + // specific target - in this case SDL - and they are a Graphics + // object to make Guichan able to draw itself using SDL, 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 SDL. + gcn::SDLGraphics* graphics; + gcn::SDLInput* input; + gcn::SDLImageLoader* imageLoader; + + /** + * Initialises the SDL application. This function creates the global + * Gui object that can be populated by various examples. + */ + void init() + { + // We simply initialise SDL as we would do with any SDL application. + SDL_Init(SDL_INIT_VIDEO); + screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE); + // 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 SDL back end. + + imageLoader = new gcn::SDLImageLoader(); + // The ImageLoader Guichan should use needs to be passed to the Image object + // using a static function. + gcn::Image::setImageLoader(imageLoader); + graphics = new gcn::SDLGraphics(); + // The Graphics object needs a target to draw to, in this case it's the + // screen surface, but any surface will do, it doesn't have to be the screen. + graphics->setTarget(screen); + input = new gcn::SDLInput(); + + // Now we create the Gui object to be used with this 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 SDL implementations of these objects hence making Guichan + // able to utilise SDL. + globals::gui->setGraphics(graphics); + globals::gui->setInput(input); + } + + /** + * Halts the SDL application. + */ + void halt() + { + delete globals::gui; + + delete imageLoader; + delete input; + delete graphics; + + SDL_Quit(); + } + + /** + * Runs the 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_Flip(screen); + } + } +}