変数名・関数名が短くなっていたりします。
1つめは最初見たとき、気に入らなかったゲームパッド関係の箇所です。
ゲームパッド用にconfig.cppを作成してみました
#include "../include/GV.h"
static unsigned int PadState[PAD_MAX];//パッド情報を格納
static bool PadStateOld[PAD_MAX];//パッドの過去情報
static int analog_set=1001; //アナログスティックの遊び値を格納
//キー設定のための関数
int SetPadKey(int PAD ,int KEY1,int KEY2,int KEY3,int KEY4){
SetJoypadInputToKeyInput( DX_INPUT_PAD1, PAD, KEY1, KEY2, KEY3, KEY4 ) ;
int i=0;
for(i=0;i=analog_set) Input |= PAD_INPUT_DOWN;
//左
if(Xbuf=analog_set) Input |= PAD_INPUT_RIGHT;
return Input;
}
int GetPOVState(int InputType){
switch(GetJoypadPOVState(InputType,0)){
case -1: return 0;
case 0: return PAD_INPUT_UP;
case 4500: return PAD_INPUT_UP | PAD_INPUT_RIGHT;
case 9000: return PAD_INPUT_RIGHT;
case 13500: return PAD_INPUT_RIGHT | PAD_INPUT_DOWN;
case 18000: return PAD_INPUT_DOWN;
case 22500: return PAD_INPUT_DOWN | PAD_INPUT_LEFT;
case 27000: return PAD_INPUT_LEFT;
case 31500: return PAD_INPUT_LEFT | PAD_INPUT_UP;
default:
printfDx("GetPOVState() error\n");
return 0;
}
}
void GetHitPadStateAll(){
int i,PadInput;
PadInput = GetJoypadInputState( DX_INPUT_PAD1 | DX_INPUT_KEY );//パッドの入力状態を取得
PadInput |= GetAnalogState(DX_INPUT_PAD1 | DX_INPUT_KEY);//左スティックから入力状態を取得
PadInput |= GetPOVState(DX_INPUT_PAD1 | DX_INPUT_KEY);//POV(ハットスイッチ)から入力状態を取得
for(i=0;i0;
if(PadInput & 1<<i) PadState[i]++;
else PadState[i]=0;
}
//同時押しの制御
//上下
if( PadState[0] && PadState[3] ){
PadState[0] =0;
PadState[3] =0;
}
//左右
if( PadState[1] && PadState[2] ){
PadState[1] =0;
PadState[2] =0;
}
}
int CheckPad(int Handle){
if(0<=Handle && Handle<PAD_MAX){
return PadState[Handle];
}else{
printfDx("CheckPadに渡した値が不正です\n");
return -1;
}
}
bool CheckPadOut(int Handle){
if(0<=Handle && Handle<PAD_MAX){
return PadStateOld[Handle] && PadState[Handle]==0;
}
else{
printfDx("CheckPadOutに渡した値が不正です\n");
return 0;
}
}
define.hに追加。 function.hに追加。
//config.h
GLOBAL int SetPadKey(int PAD ,int KEY1=-1,int KEY2=-1,int KEY3=-1,int KEY4=-1);
GLOBAL void SetAnalog(int Input);
GLOBAL void GetHitPadStateAll();
GLOBAL int CheckPad(int Handle);
GLOBAL bool CheckPadOut(int Handle);
//コンフィグに関する構造体
typedef struct{
int left,up,right,down;
int shot,bomb,slow,start,change;
}config_t;
//キー設定
config.down = SetPadKey(PAD_INPUT_DOWN , KEY_INPUT_DOWN , KEY_INPUT_NUMPAD2);
config.left = SetPadKey(PAD_INPUT_LEFT , KEY_INPUT_LEFT , KEY_INPUT_NUMPAD4);
config.right = SetPadKey(PAD_INPUT_RIGHT, KEY_INPUT_RIGHT, KEY_INPUT_NUMPAD6);
config.up = SetPadKey(PAD_INPUT_UP , KEY_INPUT_UP , KEY_INPUT_NUMPAD8);
//PAD_INPUT(ボタン番号)で指定。
config.shot = SetPadKey(PAD_INPUT(1) , KEY_INPUT_Z);
config.bomb = SetPadKey(PAD_INPUT(4) , KEY_INPUT_X);
config.slow = SetPadKey(PAD_INPUT(2) , KEY_INPUT_LSHIFT);
config.change= SetPadKey(PAD_INPUT(3) , KEY_INPUT_LCONTROL);
config.start = SetPadKey(PAD_INPUT(10) , KEY_INPUT_ESCAPE);
//左スティックの遊び値を設定
SetAnalog(400);
いろいろ付け加えてみました。
・ボタン登録をするSetPadKey関数
・左スティック対応
・POV対応
・同時押し対策
・ボタンが離れたとき、trueを返すCheckPadOut関数
などです。
SetPadKey関数は、単にSetJoypadInputToKeyInput関数を使用し、configの要素に適切な値を返しているだけです。
自分が納得のいくソースを目指した結果、こうなりました。