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
|
/*
* Code that sets up an HGE application with Guichan using the
* Guichan HGE back end.
*/
#include <guichan.hpp>
#include <guichan/hge.hpp>
#include <string>
namespace hge
{
HGE *hge = NULL;
bool running = false;
// All back ends contain objects to make Guichan work on a
// specific target - in this case HGE - and they are a Graphics
// object to make Guichan able to draw itself using HGE, an
// input objec to make Guichan able to get user input using HGE
// and an ImageLoader object to make Guichan able to load images
// using SDL.
gcn::HGEGraphics* graphics;
gcn::HGEInput* input;
gcn::HGEImageLoader* imageLoader;
/**
* The frame function for the HGE application.
*/
bool frameFunc()
{
if (hge->Input_GetKeyState(HGEK_ESCAPE) || running)
{
return true;
}
// Now we let the Gui object perform its logic.
globals::gui->logic();
// Next we begin a scene.
hge->Gfx_BeginScene();
hge->Gfx_Clear(0);
// Now we let the Gui object draw itself.
globals::gui->draw();
// Finally we end the scene causing the screen to be updated.
hge->Gfx_EndScene();
return false;
}
/**
* Initialises the HGE application. This function creates the global
* Gui object that can be populated by various examples.
*/
void init()
{
// We simply initialise HGE as we would do with any HGE application.
hge = hgeCreate(HGE_VERSION);
hge->System_SetState(HGE_FRAMEFUNC, frameFunc);
hge->System_SetState(HGE_SCREENWIDTH, 640);
hge->System_SetState(HGE_SCREENHEIGHT, 480);
hge->System_SetState(HGE_WINDOWED, true);
hge->System_SetState(HGE_HIDEMOUSE, false);
hge->System_SetState(HGE_USESOUND, false);
hge->System_SetState(HGE_SHOWSPLASH, false);
hge->System_SetState(HGE_LOGFILE, "hgelog.txt");
if (!hge->System_Initiate())
{
throw GCN_EXCEPTION("Unable to initialse HGE: " + std::string(hge->System_GetErrorMessage()));
}
// Now it's time to initialise the Guichan HGE back end.
imageLoader = new gcn::HGEImageLoader();
// The ImageLoader Guichan should use needs to be passed to the Image object
// using a static function.
gcn::Image::setImageLoader(imageLoader);
graphics = new gcn::HGEGraphics();
input = new gcn::HGEInput();
// Now we create the Gui object to be used with this HGE 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 HGE implementations of these objects hence making Guichan
// able to utilise HGE.
globals::gui->setGraphics(graphics);
globals::gui->setInput(input);
}
/**
* Halts the HGE application.
*/
void halt()
{
delete globals::gui;
delete imageLoader;
delete input;
delete graphics;
hge->System_Shutdown();
hge->Release();
}
/**
* Runs the HGE application.
*/
void run()
{
hge->System_Start();
}
}
|