[] 目次 []

Simple DirectMedia Layer API を使う

イベント

  • イベントの待機

SDL_WaitEvent() を使ってイベントが来るのを待ちます。

Tip:
SDL は国際的にキーボードをサポートしています。 キーイベントを翻訳して等価な UNICODE を event.key.keysym.unicode に置きます。 これにはいくらか処理のオーバーヘッドがありますので、 SDL_EnableUNICODE() で有効にする必要があります。
サンプルコード:
{
    SDL_Event event;

    SDL_WaitEvent(&event);

    switch (event.type) {
        case SDL_KEYDOWN:
            printf("The %s key was pressed!\n",
                   SDL_GetKeyName(event.key.keysym.sym));
            break;
        case SDL_QUIT:
            exit(0);
    }
}
  • イベントの取得

SDL_PollEvent() 関数を使ってイベントを取得します。

Tip:
SDL_PEEKEVENT アクションを SDL_PeepEvents() に渡すことで、 イベントキュー内のイベントを消さずに覗くことができます。
サンプルコード:
{
    SDL_Event event;

    while ( SDL_PollEvent(&event) ) {
        switch (event.type) {
            case SDL_MOUSEMOTION:
                printf("Mouse moved by %d,%d to (%d,%d)\n", 
                       event.motion.xrel, event.motion.yrel,
                       event.motion.x, event.motion.y);
                break;
            case SDL_MOUSEBUTTONDOWN:
                printf("Mouse button %d pressed at (%d,%d)\n",
                       event.button.button, event.button.x, event.button.y);
                break;
            case SDL_QUIT:
                exit(0);
        }
    }
}
  • イベント状態の取得

イベントを直接扱うのに加えて、イベントのそれぞれのタイプには アプリケーションのイベント状態のチェックを可能にする関数があります。 これを排他的に使うなら、SDL_EventState() 関数を使って 全てのイベントを無視するように設定し、 定期的に SDL_PumpEvents() を呼んで アプリケーションのイベント状態を更新する必要があります。

Tip:
SDL_ShowCursor() を使ってシステムのマウスカーソルを 隠したり表示したりできます。
サンプルコード:
{
    SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
}

void CheckMouseHover(void)
{
    int mouse_x, mouse_y;

    SDL_PumpEvents();

    SDL_GetMouseState(&mouse_x, &mouse_y);
    if ( (mouse_x < 32) && (mouse_y < 32) ) {
        printf("Mouse in upper left hand corner!\n");
    }
}

[] 目次 []