joypad管理クラス

アバター
MoNoQLoREATOR
記事: 284
登録日時: 14年前
住所: 東京

joypad管理クラス

投稿記事 by MoNoQLoREATOR » 13年前

以前にも作ったと思いますが、ちょっと視点を変えて作り直してみました。

~特徴~
●キーコンフィグが楽にできる
●特定のキーが何フレーム押されているか取得できる(押されていない場合は0が返る)
●特定の時間内でのキーのクリック回数が返る(レバガチャ用)
●全てのキーが 押されている/押されていない かを取得できる

※1つのジョイパッドにつき1つの実体を持つことが前提


~全機能一覧~

○キーコンフィグ
返り値:成功なら1、失敗なら0

bool config(size_t action, size_t dxpad)
引数:action・・・キーの管理番号(任意。詳細は後述), dxpad・・・対応させたいキーの定数(詳細はこちら)

bool config(size_t action)
引数:キーの管理番号
補足:「現在押されているキー」が「対応させたいキー」に設定される。これはtrueが返されるまで呼び出し続けるべきである。

尚、引数が1つのconfigを呼び出した際に十字キーが押されていた場合は無条件で失敗する。どうしてもやりたい場合は bool allconfig(size_t action) を使用する必要がある。「何も押されていない状態」を登録したい場合は、引数が2つのconfigの第2引数に0を指定する

○入力フレーム数取得
インスタンス.pad[キーの管理番号]
とすることで、特定のキーが何フレーム押されているかを取得することができる。押されていない場合は0が返る

size_t any()
インスタンスから呼び出すと、すべてのキーの範囲で1つでもキーが押されていればそのフレーム数を返す。すべてのキーの範囲で1つもキーがおされていなければ0を返す
インスタンス.pad から呼び出すと、範囲が「キーコンフィグで設定されたキーの範囲」となる

size_t none()
1つもキーが押されていない場合のみ、そのフレーム数を返す。1つでもキーが押されていれば0を返す。詳細は上記anyと同様。

○レバガチャ
void setbeat()
レバガチャ回数のカウントを開始する。なんらかのキーが押された瞬間にカウントが加算される。インスタンスから直接呼び出した場合とpadから呼び出した場合とで範囲が異なる。詳細は上記any,noneと同様。

size_t beat()
レバガチャ回数を返す

○振動パッド

void vib(int time = -1, int power = 1000)
振動を開始させる。
引数:time・・・振動させる時間をミリ秒で指定する。-1を指定すると下記stopを呼び出すまで振動し続ける
    power・・・振動の強さを0~1000の間で指定する

void stop()
振動を停止させる


●キーの管理番号について
以下のように定数を宣言することをおすすめする
#define UP 0
#define DOWN 1



又は
enum{UP,DOWN,LEFT,RIGHT,A,B,R,L,X,Y,Z, MAX_NUM};


~注意事項~
・インスタンス化
joypad(size_t padNum, size_t actNum) //コンストラクタ
void init(省略) //代わりにinit関数を使って初期化することもできる
引数:padNum・・・どのジョイパッドを管理するかを1~4で指定する。(※例えば接続されているジョイパッドが2つの場合には1か2を指定することになる), actNum・・・キーの管理番号の最大値+1の値

・情報更新
void renew()
メインループの最初に呼び出すべきである


~使用例~

CODE:

namespace pad{
	enum{up,down,left,right,a,b,r,z,num};
}

void SetMyJoypad(joypad & target){
	target.config(pad::up, PAD_INPUT_UP);
	target.config(pad::down, PAD_INPUT_DOWN);
	target.config(pad::left, PAD_INPUT_LEFT);
	target.config(pad::right, PAD_INPUT_RIGHT);
	target.config(pad::a, PAD_INPUT_1);
	target.config(pad::b, PAD_INPUT_2);
	target.config(pad::r, PAD_INPUT_6);
	target.config(pad::z, PAD_INPUT_8);
}

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
	ChangeWindowMode(TRUE);
	SetOutApplicationLogValidFlag(FALSE);
	SetWindowText("DxLib");
	if(DxLib_Init() == -1) return(-1);
	SetAlwaysRunFlag(FALSE);
	SetDrawScreen(DX_SCREEN_BACK);

	joypad j(1, pad::num);	//インスタンス化。1つ目のジョイパッドを管理する。
	SetMyJoypad(j);			//ジョイパッドのデフォルトキーコンフィグ
	j.setbeat();			//レバガチゃ回数のカウントを開始する
	bool flag = 0;			//ユーザーキーコンフィグ用

	while(ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
        ClsDrawScreen();

		j.renew();	//____________________________	//情報更新。メインループの最初に呼び出すべきである
		if(flag==0) flag = j.config(pad::a);			//ユーザーキーコンフィグ。最初に押されたキーをAボタンに設定する
		SetFontSize(15);	//フォントサイズ設定
		if(j.pad[pad::a]) j.setbeat();	//____________	//Aボタンが押されていたらレバガチャ回数をカウントし直す
		DrawFormatString(0,0,0xffffff,"%d",j.beat() );	//レバガチャ回数を表示

		j.any();	//何らかのキーが(renew呼び出し時に)押されていればそのフレーム数を返す
		j.none();	//いずれのキーも押されていなければそのフレーム数を返す

		//pad::up, pad::down, pad::left, pad::right, pad::a, pad::b, pad::r, pad::z
		j.pad.any();	//この場合、上記のキーのうち1つでも押されていればそのフレーム数を返す
		j.pad.none();	//この場合、上記のキーのうち1つも押されていなければそのフレーム数を返す

		ScreenFlip();
	}

	DxLib_End();
	return(0);
}
~ソースコード~
► スポイラーを表示
最後に編集したユーザー MoNoQLoREATOR on 2012年2月20日(月) 00:59 [ 編集 1 回目 ]

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