おべんきょ

  • タグ:
  • タグはありません
    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)) {
    		// ジャンプショット!
    	}
    }