龍神録プログラミングその1 (8章)

白い時空
記事: 18
登録日時: 14年前
住所: 埼玉県さいたま市

龍神録プログラミングその1 (8章)

投稿記事 by 白い時空 » 14年前

私は、龍神録プログラミングを改変しながら進めているので、その過程でも日記に書いていこうと思います。
変数名・関数名が短くなっていたりします。

1つめは最初見たとき、気に入らなかったゲームパッド関係の箇所です。
ゲームパッド用にconfig.cppを作成してみました

CODE:

#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に追加。

CODE:

//パッドキーの最大数
#define PAD_MAX 24
//パッドボタンの定義
#define PAD_INPUT(NUM) (1<<(3+(NUM)))
function.hに追加。

CODE:

//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);
struct.hに追加

CODE:

//コンフィグに関する構造体
typedef struct{
	int left,up,right,down;
	int shot,bomb,slow,start,change;
}config_t;
ini.cppのfirst_ini関数に追加。

CODE:

//キー設定
	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);
後は、ProcessLoop関数にGetHitPadStateAll()を加えればOKです。

いろいろ付け加えてみました。
・ボタン登録をするSetPadKey関数
・左スティック対応
・POV対応
・同時押し対策
・ボタンが離れたとき、trueを返すCheckPadOut関数
などです。
SetPadKey関数は、単にSetJoypadInputToKeyInput関数を使用し、configの要素に適切な値を返しているだけです。

自分が納得のいくソースを目指した結果、こうなりました。
最後に編集したユーザー 白い時空 on 2010年10月19日(火) 13:11 [ 編集 1 回目 ]

コメントはまだありません。