DXライブラリ:キー/パッド入力の処理
ここで老舗フリーゲーム作者が創業以来、継ぎ足し継ぎ足しで使っている秘伝のルーチンを公開する。
*使い方 1.毎フレーム get_inputs() を呼ぶ 2.if (inputs[INPUT_TRIG1].press) なら、キーが現在押されている。 〜.pushed なら、キーが一個前のフレームでは押されていなくて、 そのフレームに押されたことになる。 つまりキーが押された瞬間のみの処理にはコレを使う。 たとえば、ボタン2を一回押すごとに一発だけ弾を撃つ場合、 if (inputs[INPUT_TRIG2].pushed) { tamahassha(); } など。 同様にキーが離された瞬間はupedに入る(しかし私はまったく使っていない)。
/*inputs.h*/ #ifndef INPUTS_H_INCLUDED #define INPUTS_H_INCLUDED #include "DxLib.h" typedef struct tag_input_type { unsigned char press; unsigned char pushed; unsigned char uped; unsigned char osareteta; } input_type; enum eINPUTS_ENUM { INPUT_LEFT, INPUT_RIGHT, INPUT_UP, INPUT_DOWN, INPUT_TRIG1, INPUT_TRIG2, INPUT_TRIG3, INPUT_TRIG4, INPUT_TRIG5, INPUT_TRIG6, INPUT_TRIG7, INPUTMAX, }; extern input_type inputs[INPUTMAX]; extern void get_inputs(); #endif /*INPUTS_H_INCLUDED*/
/*inputs.cpp*/ #include "inputs.h" input_type inputs[INPUTMAX]; #define KEYBMAX 11 static int keyb_key[KEYBMAX] = { KEY_INPUT_LEFT, KEY_INPUT_RIGHT, KEY_INPUT_UP, KEY_INPUT_DOWN, KEY_INPUT_Z, KEY_INPUT_X, KEY_INPUT_C, KEY_INPUT_A, KEY_INPUT_S, KEY_INPUT_D, KEY_INPUT_F12, }; void get_inputs() { int padstat; //int keybstat[INPUTMAX]; int i; for (i = 0; i < INPUTMAX; i++) { inputs[i].press = 0; } //get keyboard for (i = 0; i < KEYBMAX; i++) { if (CheckHitKey(keyb_key[i])) { inputs[i].press = 1; } } //get pad padstat = GetJoypadInputState(DX_INPUT_PAD1); if (padstat & PAD_INPUT_UP) inputs[INPUT_UP].press = 1; if (padstat & PAD_INPUT_DOWN) inputs[INPUT_DOWN].press = 1; if (padstat & PAD_INPUT_LEFT) inputs[INPUT_LEFT].press = 1; if (padstat & PAD_INPUT_RIGHT) inputs[INPUT_RIGHT].press = 1; if (padstat & PAD_INPUT_A) inputs[INPUT_TRIG1].press = 1; if (padstat & PAD_INPUT_B) inputs[INPUT_TRIG2].press = 1; if (padstat & PAD_INPUT_C) inputs[INPUT_TRIG3].press = 1; if (padstat & PAD_INPUT_X) inputs[INPUT_TRIG4].press = 1; if (padstat & PAD_INPUT_Y) inputs[INPUT_TRIG5].press = 1; if (padstat & PAD_INPUT_Z) inputs[INPUT_TRIG6].press = 1; for (i = 0; i < INPUTMAX; i++) { inputs[i].pushed = 0; inputs[i].uped = 0; if (inputs[i].press) { if (!inputs[i].osareteta) inputs[i].pushed = 1; inputs[i].osareteta = 1; } else /* genzai osarete nai */ { if (inputs[i].osareteta) inputs[i].uped = 1; inputs[i].osareteta = 0; } } }