質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

Q&A

解決済

1回答

281閲覧

ジョイパッド・キーボードの入力状態

02053906212

総合スコア7

DXライブラリ

DXライブラリとは、DirectXを使ったWindowsソフトの開発に必ず付いて回るDirectXやWindows関連のプログラムを使い易くまとめた形で利用できるようにしたC++言語用のゲームライブラリです。

0グッド

0クリップ

投稿2017/09/16 07:24

###前提・実現したいこと
Dxlibでキャラセレクト画面とステージセレクト画面を作っています。
P1の決定ボタンをC P2の決定ボタンをNで作っていたのですが
キャラをP1とP2が決定するとステージセレクト画面を飛ばして次の画面に飛んでしまいます。
ここに質問したいことを詳細に書いてください

###該当のソースコード

#include "DxLib.h" // DXライブラリ 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) { staFlag=1; //ステージが決定されたことにする } } if(staFlag==1) { slc.setProg(2); //次の画面に移行 } }

###補足情報(言語/FW/ツール等のバージョンなど)
使っているのは
MicrosoftVisual Studio Express 2012 for Windows Desktop

###実行した結果
実行するとキャラ選択が出来るのですが1Pと2Pが決定を押すとstaFlagに勝手に1が代入されてslc.setProg(2)が実行され次の画面に移行してしまう

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C++

1 if (charaFlag==1&&staFlag==0&&p1Circle==1&&p2Circle==1) //charaFlagが1でなおかつstageFlagが0の場合 2 { 3 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) 4 { 5 staFlag=1; //ステージが決定されたことにする 6 } 7 }

キャラクターを決定してcharaFlag==1となったときは、上記箇所でも決定ボタンを押されていることになります。
そのため、キャラクター決定と同時にマップの決定(staFlag=1;)が行われることになってしまいます。

「キャラクター決定後に、ボタンが離されたかどうか」もチェックすることで、解決できるのではないかなと思います。

投稿2017/09/16 07:58

fiveHundred

総合スコア9778

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

02053906212

2017/09/16 08:21

もう学校が終わったので明日実行してみます。 まだ直らなかったらコメントします
02053906212

2017/09/16 23:50

今頑張ってやってはいるのですがどうしてもうまくいきません if(p1Flag==1&&p2Flag==1&&p1Circle==1&&p2Circle==1) { charaFlag=1; //player1とplayer2がキャラを決定したらcharaFlagを1にする } のときにも決定ボタンが押されている処理になるということでいいのでしょうか??
02053906212

2017/09/17 00:55

決定ボタンの押されている処理をなくす方法の検討が付かないのですがもう少し教えてもらってもいいですか?
02053906212

2017/09/17 01:15 編集

if (charaFlag==1&&staFlag==0) //charaFlagが1でなおかつstageFlagが0の場合 {    if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_2) == 0||CheckHitKey(KEY_INPUT_C)==0)//「C」が押されてない時(大文字も反応する) { p1click=0; } if ((GetJoypadInputState(DX_INPUT_PAD2) & PAD_INPUT_2) == 0||CheckHitKey(KEY_INPUT_N)==0) //「M」が押された時(大文字も反応する) { p2click=0; } } if(p1Flag==1&&p2Flag==1&&p1click==1&&p2click==1) { charaFlag=1; //player1とplayer2がキャラを決定したらcharaFlagを1にする } というやり方を思いついたのですがキャラセレの時チョン押(一瞬押す)した場合ステージセレクト画面が出るのですが普通に押すとスキップされてしまいます。
fiveHundred

2017/09/17 01:23

「前フレームで押されていない、かつ、今のフレームでは押されている」場合にのみ「有効」にすればよいです。 言い換えれば、「前フレームで押されている、または、今のフレームでは押されていない」場合は「無効」にすればよいです。
02053906212

2017/09/17 01:42

今のプログラムだと if (objs.getStagePD()) // もしstageのstagePDがtrueなら{}内を実行 {       objs.setStagePD(false); // stageのキーが押されている設定にする } else {    if (!objs.getStagePD()) objs.setStagePD(true); // stageのキーを押されていない設定にする } というのが「前フレームで押されていない、かつ、今のフレームでは押されている」だと思うのですがどうでしょうか
fiveHundred

2017/09/17 02:03 編集

その箇所を再度確認しましたが、p1Circleやp2Circleを0に戻すという処理を追加するのがよいと思います。 ただ、それだけだと直らないと思いますので、 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) { staFlag=1; //ステージが決定されたことにする } } の順番を逆にしてみてはいかがでしょうか。
02053906212

2017/09/17 02:48

p1clickとp2clickを0に戻す処理を else {    if (!objs.getStagePD()) objs.setStagePD(true); // stageのキーを押されていない設定にする } のほうに入れた場合片方はしっかりと動作するのですが2人目が決まった時にしっかりと動作してくれません
02053906212

2017/09/17 02:52

例えばですが player1が先に決めた場合 p1Flag:1 p1click:0 になるのですが player2が次に決めると p2Flag:1 p2click:1 になってしまいます。
fiveHundred

2017/09/17 03:37

私は「p1Circle」を0にするように言ったはずです。 質問時はp1Circleだったのがp1clickに改名したということでしょうか? また、1P側では、 if(p1Circle==0) //●ボタンが押されてないとき { となっているのが、2P側では、 if(p2Flag==0) // player2のキャラが決定してないとき { となっているので、どちらかに同一したほうが分かりやすいと思います。 (バグの原因かどうかは分かりませんが…) 0に戻す処理ですが、関数の最初か最後で行ったほうが分かりやすいと思います。 ご提示の箇所だと、離したタイミングでしか0に戻らないため、押し続けた場合も考慮して、もう1か所追加する必要があると思います。 また、p1Circleを他の関数で使う予定がないのであれば、グローバル変数ではなく、関数内の変数にしたほうがよいです。 (グローバル変数はなるべく使わない方がよいです。どうしても必要な場合は、別のファイルから読み込めないように「static」と付けるとよいです) それを考慮すると、 void selectKeyInput(void) { int p1Circle=0, p2Circle=0; //追加 //…(中略) と変更するのがよいと思われます。 (グローバル変数の定義は削除してください)
02053906212

2017/09/17 04:32

すみません混乱し始めて全く分からなくなってきました。 結局何をすればよろしいのでしょうか??
fiveHundred

2017/09/17 05:12

とりあえず、まずは、 > 質問時はp1Circleだったのがp1clickに改名したということでしょうか? 以上がどうなのか教えてください。 最初のソースには、p1clickが無いので、どういうことになっているのか知りたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問