バックエンドをSDLとしてguichanを使用する


Visual C++ 2008 Express Editionでビルドしてみました。 公式サイトに載っている入門プログラムとほぼ同じです。

アルファベットを表示するために、公式サイトのThe basics of Guichan - Guichan(リンク切れになっていたらご容赦)にあるfixedfont.pngをfixedfont.bmpという名前で保存して実行ファイルと同じ場所に置きます。 日本語に関しては多分サポートしてないので私は日本語は自力で表示するつもりです。

#include <iostream>
#include <guichan.hpp>
#include <guichan/sdl.hpp>
#include "SDL.h"

SDL_Surface* screen;
SDL_Event event;
gcn::SDLInput* input;
gcn::SDLGraphics* graphics;
gcn::SDLImageLoader* imageLoader;

gcn::Gui* gui;
gcn::Container* top;
gcn::ImageFont* font;
gcn::Label* label;
gcn::Button* button;
gcn::Window* window;

void init()
{
    SDL_Init(SDL_INIT_VIDEO);
    screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
    SDL_EnableUNICODE(1);
    SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);

    imageLoader = new gcn::SDLImageLoader();
    gcn::Image::setImageLoader(imageLoader);
    graphics = new gcn::SDLGraphics();
    graphics->setTarget(screen);
    input = new gcn::SDLInput();

    font = new gcn::ImageFont("fixedfont.bmp", " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789");
    gcn::Widget::setGlobalFont(font); 

    gui = new gcn::Gui();
    gui->setGraphics(graphics);
    gui->setInput(input);

    top = new gcn::Container();    
    top->setDimension(gcn::Rectangle(0, 0, 640, 480));
    gui->setTop(top);

    window = new gcn::Window("Hello Window");
    window->setPosition(120, 120);
    top->add(window); 

    label = new gcn::Label("Hello World");
    label->setPosition(0, 0);
    window->add(label);

    button = new gcn::Button("Button1");
    button->setPosition(32, 120);
    button->setBaseColor(gcn::Color(255,255,255));
    window->add(button);

    window->resizeToContent();
}

void run()
{
    bool running = true;

    while (running)
    {
        while(SDL_PollEvent(&event))
        {
            if (event.type == SDL_KEYDOWN)
            {
                if (event.key.keysym.sym == SDLK_ESCAPE)
                {  
                    running = false;
                }
       
            }
            else if(event.type == SDL_QUIT)
            {
                running = false;
            }
      
           input->pushInput(event);
        }

       gui->logic();
       gui->draw();
    
       SDL_Flip(screen);
    }
}

void halt()
{
    delete button;
    delete label;
    delete window;
    delete font;
    delete top;
    delete gui;
  
    delete input;
    delete graphics;
    delete imageLoader;
    
    SDL_Quit();
}

int main(int argc, char **argv)
{
    try 
    {
        init();
        run();  
        halt();
    }
    catch (gcn::Exception e)
    {
        std::cout << e.getMessage() << std::endl;
    }
    catch (std::exception e)
    {
        std::cout << "Std exception: " << e.what() << std::endl;  
    }
    catch (...)
    {
        std::cout << "Unknown exception" << std::endl;
    }

    return 0;
}

実行するとこうなります。


戻る