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;
		}
	}
}