自作キー入力クラスのキーコンフィグ対応について
Posted: 2011年2月04日(金) 18:33
ずいぶんと久しぶりに質問させて頂きます。
以前 「Kou」 で書き込みさせて頂いておりましたが、使用できなかったので 「Kouichi」 に変更させて頂きました。
最近C++の勉強をしながら、シューティングゲームをチョコチョコ作成しています。
環境は、
OS : Windows7 Home 32ビット版
コンパイラ : Microsoft Visual C++ 2010 Express
使用ライブラリ : DxLib
使用言語 : C++(微妙にCの文法が混じっている時があります)
以下 【KeyClass.h】
以下 【KeyClass.cpp】
上記のプログラムは、龍神録のキー入力判定の部分を私なりにクラス化してみました。
実際に使用する時は、
こんな感じで使用します。
前置きが長くなりましたが、質問の内容は、
1.キーコンフィグに対応させたいのですが、キーコーンフィグのプログラムの概念が今ひとつ理解できない。(どんな処理をすれば良いか分からない)
2.現在のプログラムをキーコンフィグに対応させるには、クラスの設計をどう変更すれば良いか。(そもそもこれじゃ無理!・・・とか)
3.現在のプログラムをもう少しスッキリとできないか(ここって無駄だよ・・・とか)
質問が多くなってしまい申し訳ありませんが、どれか1つに付いてでも良いので、回答頂ければありがたいです。
よろしくお願いします。
以前 「Kou」 で書き込みさせて頂いておりましたが、使用できなかったので 「Kouichi」 に変更させて頂きました。
最近C++の勉強をしながら、シューティングゲームをチョコチョコ作成しています。
環境は、
OS : Windows7 Home 32ビット版
コンパイラ : Microsoft Visual C++ 2010 Express
使用ライブラリ : DxLib
使用言語 : C++(微妙にCの文法が混じっている時があります)
以下 【KeyClass.h】
#pragma once
class KeyClass
{
char cKeyBuf[256]; //Key入力状態格納用変数
char cKeyInput[256]; //Key入力継続フレーム数格納用変数
int iPadBuf; //Pad入力状態格納用変数
int iPadInput[16]; //Pad入力継続フレーム数格納用変数
int iPadTable[16]; //Pad入力チェック用配列テーブル
/* キーコンフィグ用構造体 */
struct ConfigKey_t
{
int up; //上入力
int down; //下入力
int left; //左入力
int right; //右入力
int shot; //ショット
int bom; //ボム
int slow; //低速
int start; //START
int esc; //終了
};
ConfigKey_t tCfKey; //Key入力用
ConfigKey_t tCfPad; //Pad入力用
int ReturnInputKey( int hndl );
int ReturnInputPad( int hndl );
int ReturnInputState( void );
int GetInputState( int pad, int key );
void CheckInputLoop( void );
void SetInputState( void );
public:
int up, down;
int left, right;
int shot, bom;
int slow, esc;
int start;
KeyClass(); //コンストラクタ
int GetKeyState( void );
};
#include "DxLib.h"
#include "../include/KeyClass.h"
/* コンストラクタ */
KeyClass::KeyClass()
{
//Key割り当て
tCfKey.up = KEY_INPUT_UP;
tCfKey.down = KEY_INPUT_DOWN;
tCfKey.left = KEY_INPUT_LEFT;
tCfKey.right = KEY_INPUT_RIGHT;
tCfKey.shot = KEY_INPUT_Z;
tCfKey.bom = KEY_INPUT_X;
tCfKey.slow = KEY_INPUT_LSHIFT;
tCfKey.esc = KEY_INPUT_ESCAPE;
//PadButton割り当て
tCfPad.down = 1; //PAD_INPUT_DOWN
tCfPad.left = 2; //PAD_INPUT_LEFT
tCfPad.right = 3; //PAD_INPUT_RIGHT
tCfPad.up = 4; //PAD_INPUT_UP
tCfPad.bom = 7; //PAD_INPUT_C
tCfPad.shot = 8; //PAD_INPUT_X
tCfPad.slow = 10; //PAD_INPUT_Z
tCfPad.start = 14; //PAD_INPUT_START
//Pad用ボタンテーブル初期化
iPadTable[1] = 1; //Down
iPadTable[2] = 2; //Left
iPadTable[3] = 4; //Right
iPadTable[4] = 8; //Up
iPadTable[7] = 64; //Bom
iPadTable[8] = 128; //Shot
iPadTable[10] = 512; //Slow
iPadTable[14] = 8192; //Start
for( int i = 0; i < 256; i++ )
{
cKeyBuf[i] = 0;
cKeyInput[i] = 0;
}
for( int i = 0; i < 16; i++ )
iPadInput[i] = 0;
}
/* Key & Pad 入力継続フレームチェック */
void KeyClass::CheckInputLoop( void )
{
for( int i = 0; i < 256; i++ )
{
if( cKeyBuf[i] == 1 )
cKeyInput[i]++;
else
cKeyInput[i] = 0;
}
for( int i = 0; i < 16; i++ )
{
if( iPadBuf & iPadTable[i] )
iPadInput[i]++;
else
iPadInput[i] = 0;
}
}
/* Key入力フレーム数取り出し */
int KeyClass::ReturnInputKey( int hndl )
{
return (int)cKeyInput[hndl];
}
/* Pad入力フレーム数取り出し */
int KeyClass::ReturnInputPad(int hndl)
{
return iPadInput[hndl];
}
/* Key or Pad 有効入力検索 */
int KeyClass::GetInputState(int pad, int key)
{
return pad > key ? pad : key;
}
/* 各ボタン入力フレーム数セット */
void KeyClass::SetInputState( void )
{
up = GetInputState( ReturnInputPad( tCfPad.up ), ReturnInputKey( tCfKey.up ) );
down = GetInputState( ReturnInputPad( tCfPad.down ), ReturnInputKey( tCfKey.down ) );
left = GetInputState( ReturnInputPad( tCfPad.left ), ReturnInputKey( tCfKey.left ) );
right = GetInputState( ReturnInputPad( tCfPad.right ), ReturnInputKey( tCfKey.right ) );
shot = GetInputState( ReturnInputPad( tCfPad.shot ), ReturnInputKey( tCfKey.shot ) );
bom = GetInputState( ReturnInputPad( tCfPad.bom ), ReturnInputKey( tCfKey.bom ) );
slow = GetInputState( ReturnInputPad( tCfPad.slow ), ReturnInputKey( tCfKey.slow ) );
esc = cKeyInput[tCfKey.esc];
start = iPadInput[tCfPad.start];
}
/* キーボード & パッド入力情報取得 */
/* 戻り値 : 成功 = 0 */
/* 失敗 = -1 */
int KeyClass::GetKeyState( void )
{
if( GetHitKeyStateAll( cKeyBuf ) == -1 ) return -1; //KeyInput情報取得
iPadBuf = GetJoypadInputState( DX_INPUT_PAD1 ); //JoyPad情報取得
CheckInputLoop();
SetInputState();
return 0;
}
実際に使用する時は、
//どこかでKeyClassのオブジェクトを作成
KeyClass* mKey = new KeyClass;
//ループの度にキーの入力状態をチェック
mKey->GetKeyState();
//単純に指定したキーが押されたか?
if( mKey->esc ) return true;
//2フレーム以上押されたか?
if( mKey->shot >= 2 ) return true;
前置きが長くなりましたが、質問の内容は、
1.キーコンフィグに対応させたいのですが、キーコーンフィグのプログラムの概念が今ひとつ理解できない。(どんな処理をすれば良いか分からない)
2.現在のプログラムをキーコンフィグに対応させるには、クラスの設計をどう変更すれば良いか。(そもそもこれじゃ無理!・・・とか)
3.現在のプログラムをもう少しスッキリとできないか(ここって無駄だよ・・・とか)
質問が多くなってしまい申し訳ありませんが、どれか1つに付いてでも良いので、回答頂ければありがたいです。
よろしくお願いします。