[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
ジョイパッドに対応出来るようにしてみました。
まず、プロジェクトファイルはコチラ↓
https://blog.cnobi.jp/v1/blog/user/63629cf35d5259ece1529ed13f0745b1/1240177830
簡単なキーコンフィグも実装したので、適当にタイトル画面も加えてみた。
テストシューティングゲーム01って事で、とりあえずTSTG-01としました。
タイトル画面などの選択方法はC言語なんでも質問サイトさんの「34. メイン関数の書き方。」
を参考にswitchで分岐出来るようにしました。
で、ジョイパッドへの対応方法ですが、DXライブラリのGetJoypadInputState関数を使えば
簡単に対応出来ます。
具体的には
int key;
key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
と記述しておいて
if(key & PAD_INPUT_UP) ~上に行く処理~
if(key & PAD_INPUT_DOWN) ~下に行く処理~
と言う感じで書けばOK。
詳しいリファレンスはDXライブラリの公式ページに載っています。
(DX_INPUT_KEY_PAD1)を使う事によって、キーボードもジョイパッドも対応できるのが良い感じです。
とココまでは良かったのですが、キーコンフィグを作る所でつまづきました。
どうやって実装したら良いのか、まるで思いつきません(汗)
で、とりあえずGetJoypadInputState関数が、何を取得しているのか調べてみようと思って
簡単なプログラムを作ってみました↓
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK || DxLib_Init() == -1 ) return -1; //ウィンドウ化と初期化処理
SetDrawScreen( DX_SCREEN_BACK ) ;
int Cr , PadInput ;
Cr = GetColor( 255 , 255 , 255 ) ;// 白色の値を取得
while(!ProcessMessage() && !ClearDrawScreen() && CheckHitKey(KEY_INPUT_RETURN) == 0)//画面クリアとリターンで終了処理
{ // パッド1の入力を取得
PadInput = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;
DrawFormatString(240,200,Cr,"PadInput %1d",PadInput); //PadInputを表示
DrawString(480,460,"リターンキーで終了",Cr);
ScreenFlip(); //描画
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
動かすとこんな感じ↓
押されたキー情報を表示します。
すると
↓ 1
← 2
→ 4
↑ 8
1 16
2 32
3 64
4 128
・
・
・
と言う感じでボタンに対する数字がある事がわかりました。
コレって、HSPで使っていたCK JOYFORCE.DLLとほぼ同じです。
この数字を使えばキーコンフィグが作れるな~と思って作ってみた
キーコンフィグの関数はこんな感じ↓
////////////////////////オプション////////////////////////////////////////////////////////////////
//引数 なし
//返値 なし
void option(){
int padstate;
int color_white;
color_white= GetColor( 255 , 255 , 255 ) ;//色取
DrawString(160,10,"ショットボタンに使うキーを押して下さい",color_white);
DrawString(150,30,"Z,X,Cまたはボタン1,2,3のみ対応しています",color_white);
if(GetJoypadInputState( DX_INPUT_KEY_PAD1 ) == 0 ){//ボタンが押されたかどうか
g_padcnt=0;// 押されていない
}
else
{
if(g_padcnt<1){//押された場合
padstate = GetJoypadInputState( DX_INPUT_KEY_PAD1 ) ;//ボタンの状態取得
if(padstate==16) A=PAD_INPUT_A;//Zまたは1ボタン
if(padstate==32) A=PAD_INPUT_B;//Xまたは2ボタン
if(padstate==64) A=PAD_INPUT_C;//Cまたは3ボタン
if(padstate>=16) if(padstate<=64)g_syorisentaku=0;//ZXC以外のボタンを押しても無効にする為の処理
g_padcnt++;//連射しないように
}
}
fps();
}
////////////////////////////////////////////////////////////////////////////////////////////////////////
まず if(GetJoypadInputState( DX_INPUT_KEY_PAD1 ) == 0 )でキーが押されたかどうかを調べます。
押された場合は、例えばZキーが押された場合はpadstateに16が返ってくるので
その場合はショットボタンをPAD_INPUT_Aに設定。
Xボタンの場合だとpadstateに32が返ってくるので、PAD_INPUT_Bを設定・・・と言った感じ。
で、if(padstate>=16) if(padstate<=64)でZXCキー以外が押された時は反応しないようにしています。
ただ、同時押しなどには対応出来ていないので、これは今後の課題ですね。
それと、タイトル画面でカーソルを選択させようとしたのですが、普通にif(key & PAD_INPUT_UP)
としてしまうと、ずっとボタンが押された事になってしまってカーソルが動き続けて困ったので
g_padcntと言うボタンが押された時間を数える変数を用意して、if(g_padcnt<1)と言った感じで
カウントが1以下の時は処理を行うようにしてみたら、上手く動いてくれました^^
ついでに家にあったUSBゲームコントローラの返り値を調べてみました。
まず、XBOX360純正(非公式ドライバ使用)
↓ 1
← 2
→ 4
↑ 8
1 A 16
2 B 32
3 X 64
4 Y 128
5 LB 256
6 RB 512
7 ST 1024
8 BA 2048
9 LT 16384
10 RT 32768
13 XB 65536
PS2純正+エレコム変換機(JC-PS101USV)
↓ 1
← 2
→ 4
↑ 8
1 △ 16
2 ○ 32
3 × 64
4 □ 128
5 L2 256
6 R2 512
7 L1 1024
8 R1 2048
9 ST 4096
10 SE 8192
エレコムのJC-U1608TBK
↓ 1
← 2
→ 4
↑ 8
1 Y 16
2 X 32
3 B 64
4 A 128
5 L 256
6 R 512
7 SE 1024
8 ST 2048
10 | 2024/11 | 12 |
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!