ゲームエンジン Allegro バージョン 5.0 でマウスイベント処理

本記事では、Allegro 5.0を使用してマウスイベント(クリック、移動)を取得し、画面に表示するサンプルプログラムを紹介する。

Allegro サンプルプログラムです。

ソースコード(hoge.cc)を以下のように作成する。

#define ALLEGRO_STATICLINK
#include<stdio.h>
#include<allegro.h>
#include<allegro_ttf.h>
#include<allegro_primitives.h>

static ALLEGRO_FONT *font24;

int doit01(ALLEGRO_EVENT Event)
{
  int b = Event.mouse.button;

  al_clear_to_color(al_map_rgb(0,0,0)); // clears the screen to the selected color
  al_draw_textf(font24, /* color */ al_map_rgb(128, 128, 128), /* x */ 140,  /* y */ 110, ALLEGRO_ALIGN_LEFT, "b : %d", b );

  return 0;
}


int doit02(ALLEGRO_EVENT Event)
{
  int x = Event.mouse.x;
  int y = Event.mouse.y;
  int dx = Event.mouse.dx;
  int dy = Event.mouse.dy;

  al_clear_to_color(al_map_rgb(0,0,0)); // clears the screen to the selected color
  al_draw_textf(font24, /* color */ al_map_rgb(128, 128, 128), /* x */ 10,  /* y */ 10, ALLEGRO_ALIGN_LEFT, "x : %d", x );
  al_draw_textf(font24, /* color */ al_map_rgb(128, 128, 128), /* x */ 140,  /* y */ 10, ALLEGRO_ALIGN_LEFT, "y : %d", y );
  al_draw_textf(font24, /* color */ al_map_rgb(128, 128, 128), /* x */ 10,  /* y */ 60, ALLEGRO_ALIGN_LEFT, "dx : %d", dx );
  al_draw_textf(font24, /* color */ al_map_rgb(128, 128, 128), /* x */ 140,  /* y */ 60, ALLEGRO_ALIGN_LEFT, "dy : %d", dy );

  return 0;
}

int main()
{
  /* you should always do this at the start of Allegro programs */
  if(!al_init()) {
    return -1;
  }

  /* set up the keyboard handler */
  al_install_keyboard();
  /* set up the mouse handler */
  al_install_mouse();
  /* set up fonts */
  al_init_font_addon();
  al_init_ttf_addon();

  /* set a graphics mode sized 800x640 */
  ALLEGRO_DISPLAY *display = NULL;
  display = al_create_display(800, 640);
  if(!display) {
    return -1;
  }

  /* load font */
  font24 = al_load_font("/usr/share/fonts/truetype/freefont/FreeSans.ttf",24,0);
  al_clear_to_color(al_map_rgb(0,0,0)); // clears the screen to the selected color

  ALLEGRO_EVENT_QUEUE *EventQueue;
  ALLEGRO_EVENT Event;
  bool Exit = false;
  EventQueue = al_create_event_queue();
  al_register_event_source(EventQueue, al_get_display_event_source(display));
  al_register_event_source(EventQueue, al_get_keyboard_event_source());
  al_register_event_source(EventQueue, al_get_mouse_event_source());

  while(Exit == false) {
      al_flip_display();
      al_wait_for_event(EventQueue, &Event);

      if(Event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
          Exit = true;
      }
      if(Event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
          doit01(Event);
      }
      if(Event.type == ALLEGRO_EVENT_MOUSE_AXES) {
          doit02(Event);
      }
    }

  al_destroy_display(display);
  return 0;
}

注意:フォントパス(/usr/share/fonts/truetype/freefont/FreeSans.ttf)はLinux環境の例である。他のOS環境では、利用可能なフォントファイルのパスに変更する必要がある。

次の手順でコンパイル

g++ hoge.cc -I/usr/local/include/allegro5 -L/usr/local/lib -lallegro -lallegro_font -lallegro_ttf -lm

上記コマンドでは、-Iオプションでヘッダファイルの検索パス、-Lオプションでライブラリの検索パスを指定し、-lオプションでAllegro関連ライブラリをリンクしている。

次の手順で実行

./a.out