public static int KEY_UP = 1;//
public static int KEY_DOWN = 1<<1;//
public static int KEY_LEFT = 1<<2;//
public static int KEY_RIGHT = 1<<3;//
public static int KEY_SHOT = 1<<4;//
public static int KEY_JAMP = 1<<5;//
private static int KEY_CODE_UP = 0x00;// カーソルキー上のキーコードを代入する。
private static int KEY_CODE_DOWN = 0x00;// 下
private static int KEY_CODE_LEFT = 0x00;// 左
private static int KEY_CODE_RIGHT = 0x00;// 右
private static int KEY_CODE_SHOT = 0x00;// zキーあたり?
private static int KEY_CODE_JAMP = 0x00;// xキーあたり?
private int[] KEY_CODE_TABLE = {
KEY_CODE_UP,
KEY_CODE_DOWN,
KEY_CODE_LEFT,
KEY_CODE_RIGHT,
KEY_CODE_SHOT,
KEY_CODE_JAMP,
};
private int m_keyState = 0; // 現フレームのキー入力状態を保持する。
private int m_oldKeyState = 0; // 前フレームのキー入力状態を保持する。
//ワンショット。押しっぱなしではなく、マウスのクリックのような操作時のキー入力状態を保持する。
private int m_oneShotKeyState = 0;
public void checkKeyState() {
// 前フレームの入力を記憶しておく。
m_oldKeyState = m_keyState;
m_keyState = 0;
for (int i = 0; i < KEY_CODE_TABLE.length; i++) {
// getKeybordState(int keyCode)は各処理系に準備されたAPIだと見なしてください。
// 仕様としては、引数で渡したキーコードに該当するキーが押下されていたらtrueを返します。
if (getKeybordState(KEY_CODE_TABLE[i])) {
// キー状態のビットマップを組み立てます。
// 上キーが押されていた場合は 0000 0000 0000 0001
// SHOTキーが押されていた場合は 0000 0000 0001 0000
// 左キーとJAMPが押されている場合は 0000 0000 0010 0100
// といった具合に、キーに該当するビットが立ちます。
m_keyState |= 1 << i;
}
}
// XORでワンショットかどうかが求まる。
m_oneShotKeyState = m_oldKeyState^m_keyState;
}
// キーが押下されている?
public boolean press(int key) { return (m_keyState & key) == key; }
// キーが開放されている?
public boolean release(int key) { return (m_keyState & key) != key; }
// ワンショット押下(マウスのクリックで言う所の、ボタンを押し下げた瞬間だけを検出)
public boolean oneShotPress(int key) { return (m_oneShotKeyState & key) == key & press(key); }
// ワンショット開放(マウスのクリックで言う所の、ボタンを離した瞬間だけを検出)
public boolean oneShotRelease(int key) { return (m_oneShotKeyState & key) == key & release(key); }
/**使い方*/
void main() {
checkKeyState();
if (press(KEY_UP)) {
// 上キーの処理
}
if (oneShotPress(KEY_SHOT)) {
// ショット!
} else if (press(KEY_SHOT)){
// ショットを押しっぱなしの時はパワーをチャージ
} else if (oneShotRelease(KEY_SHOT)) {
// チャージが溜まっていたらハイパーショットを撃ったり打たなかったり。
}
// あまり使わなそうだけど、同時押しも検出できる。
if (press(KEY_SHOT | KEY_JAMP)) {
// ジャンプショット!
}
}