comparison ext/guichan-0.8.2/examples/openglsdl.hpp @ 378:64738befdf3b

bringing in the changes from the build_system_rework branch in preparation for the 0.3.0 release. This commit will require the Jan2010 devkit. Clients will also need to be modified to the new way to import fife.
author vtchill@33b003aa-7bff-0310-803a-e67f0ece8222
date Mon, 11 Jan 2010 23:34:52 +0000
parents
children
comparison
equal deleted inserted replaced
377:fe6fb0e0ed23 378:64738befdf3b
1 /*
2 * Code that sets up an OpenGL application with Guichan using the
3 * Guichan OpenGL back end and the SDL back end (as OpenGL cannot
4 * load images nor check for user input an additional back end needs
5 * to be used).
6 */
7
8 #include <guichan.hpp>
9 #include <guichan/opengl.hpp>
10 // The openglsdlimageloader.hpp header file needs to be included
11 // in order to get the image loader that uses OpenGL and SDL.
12 #include <guichan/opengl/openglsdlimageloader.hpp>
13 #include <guichan/sdl.hpp>
14
15 namespace openglsdl
16 {
17 bool running = true;
18 SDL_Surface* screen;
19
20 // All back ends contain objects to make Guichan work on a
21 // specific target. They are a Graphics object to make Guichan
22 // able to draw itself using OpenGL, an input objec to make
23 // Guichan able to get user input using SDL and an ImageLoader
24 // object to make Guichan able to load images using OpenGL and SDL.
25 gcn::OpenGLGraphics* graphics;
26 gcn::SDLInput* input;
27 gcn::OpenGLSDLImageLoader* imageLoader;
28
29 /**
30 * Initialises the OpenGL and SDL application. This function creates the global
31 * Gui object that can be populated by various examples.
32 */
33 void init()
34 {
35 // We simply initialise OpenGL and SDL as we would do with any OpenGL
36 // and SDL application.
37 SDL_Init(SDL_INIT_VIDEO);
38 SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
39
40 screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_OPENGL | SDL_HWACCEL);
41
42 glViewport(0, 0, 640, 480);
43 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
44
45 // We want unicode for the SDLInput object to function properly.
46 SDL_EnableUNICODE(1);
47 // We also want to enable key repeat.
48 SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
49
50 // Now it's time to initialise the Guichan OpenGL back end
51 // and the Guichan SDL back end.
52
53 imageLoader = new gcn::OpenGLSDLImageLoader();
54 // The ImageLoader Guichan should use needs to be passed to the Image object
55 // using a static function.
56 gcn::Image::setImageLoader(imageLoader);
57 graphics = new gcn::OpenGLGraphics();
58 // We need to tell the OpenGL Graphics object how big the screen is.
59 graphics->setTargetPlane(640, 480);
60 input = new gcn::SDLInput();
61
62 // Now we create the Gui object to be used with this OpenGL
63 // and SDL application.
64 globals::gui = new gcn::Gui();
65 // The Gui object needs a Graphics to be able to draw itself and an Input
66 // object to be able to check for user input. In this case we provide the
67 // Gui object with OpenGL and SDL implementations of these objects hence
68 // making Guichan able to utilise OpenGL and SDL.
69 globals::gui->setGraphics(graphics);
70 globals::gui->setInput(input);
71 }
72
73 /**
74 * Halts the OpenGL and SDL application.
75 */
76 void halt()
77 {
78 delete globals::gui;
79
80 delete imageLoader;
81 delete input;
82 delete graphics;
83
84 SDL_Quit();
85 }
86
87 /**
88 * Runs the OpenGL and SDL application.
89 */
90 void run()
91 {
92 // The main loop
93 while(running)
94 {
95 // Check user input
96 SDL_Event event;
97 while(SDL_PollEvent(&event))
98 {
99 if (event.type == SDL_KEYDOWN)
100 {
101 if (event.key.keysym.sym == SDLK_ESCAPE)
102 {
103 running = false;
104 }
105 if (event.key.keysym.sym == SDLK_f)
106 {
107 if (event.key.keysym.mod & KMOD_CTRL)
108 {
109 // Works with X11 only
110 SDL_WM_ToggleFullScreen(screen);
111 }
112 }
113 }
114 else if(event.type == SDL_QUIT)
115 {
116 running = false;
117 }
118
119 // After we have manually checked user input with SDL for
120 // any attempt by the user to halt the application we feed
121 // the input to Guichan by pushing the input to the Input
122 // object.
123 input->pushInput(event);
124 }
125 // Now we let the Gui object perform its logic.
126 globals::gui->logic();
127 // Now we let the Gui object draw itself.
128 globals::gui->draw();
129 // Finally we update the screen.
130 SDL_GL_SwapBuffers();
131 }
132 }
133 }