トップページ > 記事閲覧
ジョイパッド・キーボードの入力状態
名前:無能プログラマ9 日時: 2017/09/16 14:32

キャラセレクトとステージセレクトの決定を同じボタンにするとステージセレクト画面が飛ばされ次の画面が描画されてしまいます。 解決方法を知っていれば教えてください int p1Flag,p2Flag; //プレイヤー決定 int charaFlag=0; //メッセージボックス確認用フラグ int staFlag=0; //ステージセレクト決定 int p1Circle,p2Circle; void Init(void) { p1Flag=0; //プレイヤー決定 p2Flag=0; //プレイヤー決定 staFlag=0;//ステージセレクト決定 charaFlag=0; p1Circle=0; p2Circle=0; } void selectKeyInput(void) { if(p1Circle==0) //●ボタンが押されてないとき { if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_2) != 0||CheckHitKey(KEY_INPUT_C))//「C」が押された時(大文字も反応する) { if (objs.getStagePD()) // もしPlayer1のPlayerPDがtrueなら{}内を実行 { p1Flag=1; // player1のキャラが決まったことにする p1Circle=1; // player1の●ボタンが押された設定 objs.setStagePD(false); // Player1のキーが押されている設定にする } } else { if (!objs.getStagePD()) objs.setStagePD(true); // Player1のキーを押されていない設定にする } } if(p2Flag==0) // player2のキャラが決定してないとき {    if ((GetJoypadInputState(DX_INPUT_PAD2) & PAD_INPUT_2) != 0||CheckHitKey(KEY_INPUT_N))//「N」が押された時(大文字も反応する)    { if (objs.getStagePD()) // もしPlayer2のPlayerPDがtrueなら{}内を実行 {   p2Flag=1; // player2のキャラが決定したことにする   p2Circle=1; // // player2の●ボタンが押された設定   objs.setStagePD(false); // Player2のキーが押されている設定にする }    }    else    { if (!objs.getStagePD()) objs.setStagePD(true); // Player2のキーを押されていない設定にする    }  }  if(p1Flag==1&&p2Flag==1&&p1Circle==1&&p2Circle==1)  {   charaFlag=1; //player1とplayer2がキャラを決定したらcharaFlagを1にする  }  if (charaFlag==1&&staFlag==0&&p1Circle==1&&p2Circle==1) //charaFlagが1でなおかつstageFlagが0の場合  {   if((GetJoypadInputState(DX_INPUT_PAD2) & PAD_INPUT_2) != 0||(GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_2) != 0||CheckHitKey( KEY_INPUT_C ) != 0||CheckHitKey( KEY_INPUT_N ) != 0) //「space」が押されたとき   { staFlag=1; //ステージが決定されたことにする   } } if(staFlag==1) {   slc.setProg(2); //次の画面に移行 } } 解説 実行するとキャラ選択が出来るのですが1Pと2Pが決定を押すとstaFlagに勝手に1が代入されてslc.setProg(2)が実行され次の画面に移行してしまいます
メンテ

Page: 1 |

Re: ジョイパッド・キーボードの入力状態 ( No.1 )
名前:管理人 日時:2017/09/17 01:14

ボタンやキーを押した最初のフレームかどうかを判定するようにすれば大丈夫です 載せていただいたプログラムを手元でも動くように少し変更させていただいて、且つ ステージセレクト画面が飛ばされないようにしてみましたので、よろしければご覧ください GetJoypadInputState や CheckHitKey の戻り値を直接使用せずに、一旦変数に入れた後 一つ前のフレームの入力情報を元に「今回のフレームで押されたボタン・キー」だけを 抽出しているのがポイントです #include "DxLib.h" // パッドの入力情報 int edgePadInput[ 2 ]; int oldPadInput[ 2 ]; int padInput[ 2 ]; // キーの入力情報 char edgeKeyInput[ 256 ]; int oldKeyInput[ 256 ]; char keyInput[ 256 ]; int p1Flag,p2Flag; //プレイヤー決定 int charaFlag=0; //メッセージボックス確認用フラグ int staFlag=0; //ステージセレクト決定 int p1Circle,p2Circle; int prog = 0; void Init(void) { p1Flag=0; //プレイヤー決定 p2Flag=0; //プレイヤー決定 staFlag=0;//ステージセレクト決定 charaFlag=0; p1Circle=0; p2Circle=0; } void selectKeyInput(void) { if(p1Circle==0) //●ボタンが押されてないとき { if ((edgePadInput[0] & PAD_INPUT_2) != 0||edgeKeyInput[KEY_INPUT_C])//「C」が押された時(大文字も反応する) { p1Flag=1; // player1のキャラが決まったことにする p1Circle=1; // player1の●ボタンが押された設定 } } if(p2Flag==0) // player2のキャラが決定してないとき { if ((edgePadInput[1] & PAD_INPUT_2) != 0||edgeKeyInput[KEY_INPUT_N])//「N」が押された時(大文字も反応する) { p2Flag=1; // player2のキャラが決定したことにする p2Circle=1; // // player2の●ボタンが押された設定 } } if (charaFlag==1&&staFlag==0&&p1Circle==1&&p2Circle==1) //charaFlagが1でなおかつstageFlagが0の場合 { if((edgePadInput[1] & PAD_INPUT_2) != 0||(edgePadInput[0] & PAD_INPUT_2) != 0||edgeKeyInput[KEY_INPUT_C] != 0||edgeKeyInput[KEY_INPUT_N] != 0) //「space」が押されたとき { staFlag=1; //ステージが決定されたことにする } } if(p1Flag==1&&p2Flag==1&&p1Circle==1&&p2Circle==1) { charaFlag=1; //player1とplayer2がキャラを決定したらcharaFlagを1にする } if(staFlag==1) { prog=1; //次の画面に移行 } } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 初期化 Init(); // メインループ while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // パッドの入力を更新 // 一つ前のフレームのパッド入力を oldPadInput に移す oldPadInput[ 0 ] = padInput[ 0 ]; oldPadInput[ 1 ] = padInput[ 1 ]; // 現在のフレームのパッド入力を padInput に代入する padInput[ 0 ] = GetJoypadInputState( DX_INPUT_PAD1 ); padInput[ 1 ] = GetJoypadInputState( DX_INPUT_PAD2 ); // 一つ前のフレームで押されていなくて今回のフレームで押されたボタンを抽出する edgePadInput[ 0 ] = padInput[ 0 ] & ~oldPadInput[ 0 ]; edgePadInput[ 1 ] = padInput[ 1 ] & ~oldPadInput[ 1 ]; // キーボードの入力を更新 // 一つ前のフレームのキー入力を oldKeyInput に移す for( int i = 0; i < 256; i++ ) { oldKeyInput[ i ] = keyInput[ i ]; } // 現在のフレームのキー入力を keyInput に代入する GetHitKeyStateAll( keyInput ); // 一つ前のフレームで押されていなくて今回のフレームで押されたキーを抽出する for( int i = 0; i < 256; i++ ) { edgeKeyInput[ i ] = keyInput[ i ] & ~oldKeyInput[ i ]; } // prog が 0 なら selectKeyInput を呼ぶ if( prog == 0 ) { selectKeyInput(); } // 変数の状態を表示 DrawFormatString( 0, 16 * 0, GetColor( 255,255,255 ), "p1Flag = %d", p1Flag ); DrawFormatString( 0, 16 * 1, GetColor( 255,255,255 ), "p2Flag = %d", p2Flag ); DrawFormatString( 0, 16 * 2, GetColor( 255,255,255 ), "charaFlag = %d", charaFlag ); DrawFormatString( 0, 16 * 3, GetColor( 255,255,255 ), "staFlag = %d", staFlag ); DrawFormatString( 0, 16 * 4, GetColor( 255,255,255 ), "p1Circle = %d", p1Circle ); DrawFormatString( 0, 16 * 5, GetColor( 255,255,255 ), "p2Circle = %d", p2Circle ); DrawFormatString( 0, 16 * 6, GetColor( 255,255,255 ), "prog = %d", prog ); // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 因みに charaFlag に 1 を代入する処理と、staFlag に 1 を代入する処理は順番を逆にしています そうしないと( あまりないと思いますが )プレイヤー1とプレイヤー2が同時に決定した場合、 やっぱりステージセレクト画面が飛ばされてしまうことになるので…
メンテ
Re: ジョイパッド・キーボードの入力状態 ( No.2 )
名前:無能プログラマ9 日時:2017/09/17 09:15

回答ありがとうございます 試しに入力してみたのですがキーボードを押しても反応してくれなくなりました
メンテ
Re: ジョイパッド・キーボードの入力状態 ( No.3 )
名前:無能プログラマ9 日時:2017/09/17 09:32

ヘッダーごとでのプログラムの場合でもmain.cppのWinmainに // パッドの入力を更新を入れればいいんですか??
メンテ
Re: ジョイパッド・キーボードの入力状態 ( No.4 )
名前:管理人 日時:2017/09/18 16:49

> ヘッダーごとでのプログラムの場合でもmain.cppのWinmainに // パッドの入力を更新を入れればいいんですか?? すみません、もう少し具体的に教えていただけないでしょうか… ( 『ヘッダーごとでのプログラム』がどのようなものかイメージできません… ) 複数の cpp ファイルから edgePadInput や edgeKeyInput にアクセスしたい場合は、例えば Input.h を作成するとしたら Input.h には以下を記述する必要があります extern int edgePadInput[ 2 ]; extern int oldPadInput[ 2 ]; extern int padInput[ 2 ]; ↑のように先頭に extern を記述する必要があります また、先頭に extern をつけない int edgePadInput[ 2 ]; int oldPadInput[ 2 ]; int padInput[ 2 ]; も、どこかの cpp ( 例えば main.cpp )に記述する必要があります ( extern 無しを記述するのは一つの cpp だけでOKです )
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存