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

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

ただいまの
回答率

90.61%

  • DXライブラリ

    56questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 392

02053906212

score 1

前提・実現したいこと

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)が実行され次の画面に移行してしまう

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

 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;        //ステージが決定されたことにする        
  }
  }


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/16 17:21

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

    キャンセル

  • 2017/09/17 08:50

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

    キャンセル

  • 2017/09/17 09:25

    その通りです。

    キャンセル

  • 2017/09/17 09:55

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

    キャンセル

  • 2017/09/17 10:14 編集

    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にする
    }
    というやり方を思いついたのですがキャラセレの時チョン押(一瞬押す)した場合ステージセレクト画面が出るのですが普通に押すとスキップされてしまいます。

    キャンセル

  • 2017/09/17 10:23

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

    キャンセル

  • 2017/09/17 10:42

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

    キャンセル

  • 2017/09/17 11:01 編集

    その箇所を再度確認しましたが、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; //ステージが決定されたことにする
    }
    }
    の順番を逆にしてみてはいかがでしょうか。

    キャンセル

  • 2017/09/17 11:48

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

    キャンセル

  • 2017/09/17 11:52

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

    キャンセル

  • 2017/09/17 12: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; //追加
    //…(中略)
    と変更するのがよいと思われます。
    (グローバル変数の定義は削除してください)

    キャンセル

  • 2017/09/17 13:32

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

    キャンセル

  • 2017/09/17 14:12

    とりあえず、まずは、
    > 質問時はp1Circleだったのがp1clickに改名したということでしょうか?
    以上がどうなのか教えてください。

    最初のソースには、p1clickが無いので、どういうことになっているのか知りたいです。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • DXライブラリ

    56questions

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