1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
/*
* Code that sets up an Allegro application with Guichan using the
* Guichan Allegro back end.
*/
#include <guichan.hpp>
#include <guichan/allegro.hpp>
namespace allegro
{
BITMAP* screenBuffer;
// All back ends contain objects to make Guichan work on a
// specific target - in this case Allegro - and they are a Graphics
// object to make Guichan able to draw itself using Allegro, an
// input objec to make Gopenglsdluichan able to get user input using Allegro
// and an ImageLoader object to make Guichan able to load images
// using Allegro.
gcn::AllegroGraphics* graphics;
gcn::AllegroInput* input;
gcn::AllegroImageLoader* imageLoader;
/**
* Initialises the Allegro application. This function creates the global
* Gui object that can be populated by various examples.
*/
void init()
{
// We simply initialise Allegro as we would do with any Allegro application.
allegro_init();
int bpp = desktop_color_depth();
if (bpp == 0)
{
bpp = 16;
}
set_color_depth(bpp);
if (set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0))
{
if (set_gfx_mode(GFX_AUTODETECT, 640, 480, 0, 0))
{
throw GCN_EXCEPTION("Unable to set graphics mode");
}
}
screenBuffer = create_bitmap(SCREEN_W, SCREEN_H);
if (screenBuffer == NULL)
{
throw GCN_EXCEPTION("Unable to create a screen buffer");
}
install_keyboard();
install_mouse();
install_timer();
// Now it's time to initialise the Guichan Allegro back end.
imageLoader = new gcn::AllegroImageLoader();
// The ImageLoader Guichan should use needs to be passed to the Image object
// using a static function.
gcn::Image::setImageLoader(imageLoader);
graphics = new gcn::AllegroGraphics();
// Set the target for the graphics object to be the doublebuffer
// for the screen. Drawing to the screen directly is not a good
// idea, as it will produce flicker, unless you use page flipping.
graphics->setTarget(screenBuffer);
input = new gcn::AllegroInput();
// Now we create the Gui object to be used with this Allegro 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 Allegro implementations of these objects hence making Guichan
// able to utilise Allegro.
globals::gui->setGraphics(graphics);
globals::gui->setInput(input);
}
/**
* Halts the Allegro application.
*/
void halt()
{
delete globals::gui;
delete imageLoader;
delete input;
delete graphics;
destroy_bitmap(screenBuffer);
}
/**
* Runs the Allegro application.
*/
void run()
{
while(!key[KEY_ESC])
{
// Now we let the Gui object perform its logic.
globals::gui->logic();
// Now we let the Gui object draw itself.
globals::gui->draw();
// We draw the mouse pointer manually, as Allegro's mouse
// drawing code is so wierd.
draw_sprite(screenBuffer, mouse_sprite, mouse_x, mouse_y);
// Finally we update the screen.
blit(screenBuffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
}
}
}
|