🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

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

Q&A

1回答

1134閲覧

コントローラとキーボードを好きな方法で操作できるようにしたいです。

R-ogiura

総合スコア60

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DXライブラリ

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

0グッド

0クリップ

投稿2019/12/06 16:45

編集2019/12/06 16:51

<起きている問題>

  • キーLを押しても反応しない、
  • コントローラの四角ボタンで銃を撃つのですが、たまに何度押しても反応しないことがあります。

<試したこと>
解決方法として、コントローラが接続されている時はコントローラのみが働くように書いて、キーで行う時はキーのみで動くように書けばいい様に思えますが、int GetJoypadNum( void )は接続されているコントローラ数を得るだけなので、接続を切っても(説測しているコントローラが一つなので)値が1のままでした。
コントローラを切った場合に0になるならば、それを利用してどちらか一方のみを使えるようにしようと思ったのですが。
何か解決法は他にないでしょうか。

解決方法が見いだせなかったので、キーとコントローラの二つが対応できるように以下のように書きました。
これにより起きている問題が上に書いた問題です。

//キーLを押したままGキーを押すと武器が切り替わる if (Key[KEY_INPUT_L] == 1) { Lcount = 1; } if (Key[KEY_INPUT_L] == !1) { Lcount = 0; }//キーLを離すとLcountは0になる。 if (Lcount > 0) { if (Key[KEY_INPUT_G] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } //L1ボタンを押したまま四角のボタンを押すと武器が切り替わる if ( (PrevPadState & PAD_INPUT_5) == 0 //前回は押されていなくて && //且つ (CurrPadState & PAD_INPUT_5) != 0 //今回は押されている ) {//「四角」は今押された //「四角」が押されたときの処理 Lcount = 1; } else if(Key[KEY_INPUT_L] == 1) { Lcount = 1; } if ( (PrevPadState & PAD_INPUT_5) == 0 //前回は押されていない && //且つ (CurrPadState & PAD_INPUT_5) == 0 //今回も押されていない ) {//「四角」は今押された //「四角」が押されたときの処理 Lcount = 0; Glock = 0; Lframe = 0; } //if (Pad & PAD_INPUT_5) { Lcount = 1; } if (Lcount > 0) { ++Lframe; Glock = 1; } //if (Key[KEY_INPUT_L] == !1) { Lcount = 0; }//キーLを離すとLcountは0になる。//これのせいでLcountが上がらなかった if (Lcount > 0) { if ( (PrevPadState & PAD_INPUT_1) == 0 //前回は押されていない && //且つ (CurrPadState & PAD_INPUT_1) != 0 //今回は押されている ) {//「右」は今押された //「右」が押されたときの処理 Gtime = 0; ++Gfunction_status; ++Gkey; //Glock = 1; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; }

コントローラの四角ボタンと、キーGで銃で攻撃する部分です。
※(キーとコントローラのボタンを統一したように書いたため、
コントローラの四角ボタンで銃を撃つのですが、たまに何度押しても反応しないことがあるのかもしれません。)

if ( (PrevPadState & PAD_INPUT_1 && playerX > 0 && Gcount >= 1 && Gtime == 0 && Gkey == 1&& (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) == 0) == 0 //前回は押されていなくて && //且つ (CurrPadState & PAD_INPUT_1 && playerX > 0 && Gcount >= 1 && Gtime == 0 && Gkey == 1&& (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) == 0) != 0 //今回は押されている ) {//「右」は今押された //「右」が押されたときの処理 Gtime = 1; //銃を撃ってからの経過時間を1にする Gcount = Gcount - 1; //残弾数を-1する playerImage = playerGHandle[7]; //真正面の状態にする if (playerY == enemyY && playerX + 1 == enemyX || playerY == enemyY && playerX + 2 == enemyX || playerY == enemyY && playerX + 3 == enemyX || playerY == enemyY && playerX + 4 == enemyX || playerY == enemyY && playerX + 5 == enemyX) {//これで前に敵がいるときのみに攻撃が出来る。 enemyHP = enemyHP - 10; enemyImage = enemyGHandle[5]; } } if (Key[KEY_INPUT_G] == 1 && Gcount >= 1 && Gtime == 0 && Gkey == 1 && Key[KEY_INPUT_L] == !1) { //キーGを押していて且つ残り弾数( Gcount )が1発以上あって銃を撃ってからの経過時間( Gtime )が0の場合のみ銃を撃てる Gtime = 1; //銃を撃ってからの経過時間を1にする Gcount = Gcount - 1; //残弾数を-1する playerImage = playerGHandle[7]; //真正面の状態にする if (playerY == enemyY && playerX + 1 == enemyX || playerY == enemyY && playerX + 2 == enemyX || playerY == enemyY && playerX + 3 == enemyX || playerY == enemyY && playerX + 4 == enemyX || playerY == enemyY && playerX + 5 == enemyX) {//これで前に敵がいるときのみに攻撃が出来る。 enemyHP = enemyHP - 10; enemyImage = enemyGHandle[5]; } }

全体のプログラム
全体のプログラム

画像はこちらのサイトからです
画像

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

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

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

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

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

guest

回答1

0

ジョイパッドの入力を取得するのに以下のようにしているので、ジョイパッドとキーボードの入力を同時に拾うようになっています。
GetJoypadInputState(DX_INPUT_KEY_PAD1)

しかしながら、コードではキーボード入力とジョイパッドの入力の判定を個別に行っているのでそれが不具合の原因ではないかと推測します。
せっかくライブラリ側で同時に入力を拾えるようになっているのだから、ジョイパッドの入力判定に統一した方がいいと思いますよ。

投稿2019/12/06 17:54

TaroToyotomi

総合スコア1448

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

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

R-ogiura

2019/12/06 17:56

どうもありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問