SDL_pad

SDL の event はとても使いにくい。

こんな感じのものがあったら便利じゃないかと思うんですけどどうでしょう。ご意見いただければ幸い。

/** @@@
 * @@@ が付いてるのは一時的なコメント
 * SDL_pad と名前を付けるのは頑張って作るという気合いのあらわれ
 * デザイン的には愚直に普通にを目指す
 */

/** @@@
 * まずボタンの概念について
 * キーボード、ジョイスティック、マウス左中右、SDL_QUIT を「ほげ」と呼ぶ
 * ボタンは押されているか押されていないかで 0 か 1 の値を持つ
 * ボタンは複数の「ほげ」の論理 OR によって実現される
 * ボタンには ID がありこれらは自動的に割当てられる
 * デフォルトの ID は単一の「ほげ」によっている
 */

/** @@@
 * 初期化
 */
void Pad_Init();

/** @@@
 * 更新
 * Pad_Update の方が良いかな…
 */
void Pad_Pump();

/** @@@
 * 「ほげ」一覧
 * 全て負数を用いる
 */
enum {
    // keyboard, joystick, mouse, quit
}

int Pad_GetButton(int id);

/** @@@
 * 正の ID はユーザが登録することができる
 * よって引数 id は正である必要がある
 * 引数 addid は負である必要があっても良いと思う
 */
void Pad_AddButton(int id, int addid);

enum {
    /** @@@
     * もっと気のきいた名前がいいなあ…
     * あとこれらの値はどうする?
     * 0, 1, 2, 3, 4, 5, 6, 7, 8 ?
     * 0, 1, 5, 4, 6, 2, 10, 8, 9 ?
     */
    AXIS_NONE, AXIS_UP, AXIS_UPRIGHT, AXIS_RIGHT, AXIS_DOWNRIGHT,
    AXIS_DOWN, AXIS_DOWNLEFT, AXIS_LEFT, AXIS_UPLEFT
}
int Pad_GetAxis(int id);

void Pad_AddAxis(int id, int upid, int rightid, int downid, int leftid);

/** @@@
 * いくつかのヘルパ
 */
void Pad_AddAxisKeyboardArrow(int id);
void Pad_AddAxisKeyboardRogue(int id);
void Pad_AddAxisKeyboardWASD(int id);
void Pad_AddAxisJoystickAxis(int id, int joyid);

#if 0
/** @@@
 * 設定読み出し
 */
int Pad_Load(const char* file);

/** @@@
 * 設定書き出し
 */
int Pad_Save(const char* file);
#endif

/** @@@
 * マッピングつき設定読み出し
 */
int Pad_Load(const char* file, const int* ids, const char** names);

/** @@@
 * マッピングつき設定書き出し
 */
int Pad_Save(const char* file, const int* ids, const char** names);

/** @@@
 * 以上の設定をいろんな SDL アプリで共通に行う機構が欲しい
 * 例えば A ボタンは Z 、 B ボタンは X が好みなユーザは
 * 他のゲームでもその配置を使いたい。
 * .sdlpad のクロスプラットホームな位置特定を自動でする必要がある
 * 後 NES なんかは右から A, B と非常識な並びなのですけど、
 * そのへんは問題にならないかな?
 */

/**
 * あとは Pad_GetError とか
 */

/** @@@
 * 以下使用イメージ
 */
#if 0

void default_use() {
    Pad_Pump();
    if (Pad_GetButton(PADE_QUIT) || Pad_GetButton(PADK_ESCAPE)) {
        exit(0);
    }
}

void regist_use() {
    enum {
        A_BUTTON, B_BUTTON
    }
    Pad_AddButton(A_BUTTON, PADK_z);
    Pad_AddButton(A_BUTTON, PADJ1_0);
    Pad_AddButton(B_BUTTON, PADK_x);
    Pad_AddButton(B_BUTTON, PADJ1_1);

    Pad_Pump();
    if (Pad_GetButton(A_BUTTON)) {
        fire();
    }
}

void axis_use() {
    Pad_AddKeyboardArrow(0);

    Pad_Pump();
    if (Pad_GetAxis(0) | AXIS_UP) {
        move_up();
    }
}

void config_use() {
    /**
     * 実にめんどい
     */
    enum {
        A_BUTTON, B_BUTTON, QUIT_BUTTON
    }
    int* ids = {
        0, 1, 2
    }
    char* names = {
        "A_BUTTON", "B_BUTTON", "QUIT_BUTTON"
    }
    Pad_Load("key.conf", ids, names);
    /**
       ファイルの中身は以下のようなもの

       QUIT_BUTTON=PADK_ESCAPE,PADE_QUIT
       A_BUTTON=PADK_z,PADJ1_0
       B_BUTTON=PADK_x,PADJ1_1
    */
}

/**
   .sdlpad は汎用的なものなのでかなり色々できなければマズい

   標準的な名前を予約しておく PAD_A_BUTTON とか?
   Joystick の名前ごとの設定 (AXIS 特性の保持含む)
   設定ツールを作る (gtksdl あたり?)
 */

/**
   実装について

   Joystick はある程度自動判定したいところ
   軸がずれてる位なら自動補正するものは昔書けている

   データは static なグローバル変数で OK ?
 */

#endif
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h