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

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

詳細はこちら
C++

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

DXライブラリ

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

Q&A

2回答

1037閲覧

武器を変える際にコントローラの操作が正しく動きません。

R-ogiura

総合スコア60

C++

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

DXライブラリ

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

0グッド

1クリップ

投稿2019/12/07 06:21

編集2019/12/08 02:59

<環境>

  • Windows10
  • visual studio 2019
  • C++
  • X64

<質問内容>
Bullさんから頂いたこちらのコード

#include <DxLib.h> int Pad[32]; int gpUpdatePad() { int padStat = GetJoypadInputState(DX_INPUT_KEY_PAD1); //入力状態を padStat に格納 for (int i = 0; i < 28; i++) { //ボタン28個分ループ if (padStat & (1 << i)) { //ボタンiの入力フラグが立っていたら Pad[i]++; //加算 } else { //入力がなければ Pad[i] = 0; //0 にする } } return 0; } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更,初期化,裏画面設定 int x = 320; int y = 240; const int PAD_DOWN = 0; const int PAD_LEFT = 1; const int PAD_RIGHT = 2; const int PAD_UP = 3; const int KEY_ESC = 12; // while( 裏画面を表画面に反映, メッセージ処理, 画面クリア ) while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen()) { gpUpdatePad(); if (Pad[PAD_LEFT]) { if (x > 4) x -= 4; } if (Pad[PAD_RIGHT]) { if (x < 622) x += 4; } if (Pad[PAD_UP]) { if (y > 4) y -= 4; } if (Pad[PAD_DOWN]) { if (y < 464) y += 4; } DrawFormatString(x, y, GetColor(255,255,0), "●"); if (Pad[KEY_ESC]) break; } DxLib_End(); return 0; }

を参考に、キーボード入力で正しく動くこちらのプログラム

//キーLを押したまま別のキーを押すと武器が切り替わる if (Key[KEY_INPUT_L] == 1) { Lcount = 1; } if (Lcount > 0) { ++Lframe; } if (Key[KEY_INPUT_L] == !1) { Lcount = 0; Lframe = 0; }//キーLを離すとLcountは0になる。 if (Lcount > 0) { if (Key[KEY_INPUT_G] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; }

if (Gfunction_status == 0) { 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) {//これで前に敵がいるときのみに攻撃が出来る。 enemysabunHP = 100; enemyImage = enemyGHandle[5]; } } }

をコントローラで操作できるように以下のように編集しました。

if (jyoicon == 1) { //キーLを押したまま別のキーを押すと武器が切り替わる if (Pad[PAD_5] == 1) { Lframe = 1; } if (Lcount > 0) { ++Lframe; } if (Pad[PAD_5] != 1) { Lframe = 0; }//キーLを離すとLcountは0になる。 if (Lframe > 0) { if (Pad[PAD_1] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; } }

if (jyoicon == 1) { if(Pad[PAD_1] == 1 && playerX > 0 && Gcount >= 1 && Gtime == 0 && Gkey == 1 && Pad[PAD_5] != 1) {//「右」は今押された //「右」が押されたときの処理 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]; } } }

と二つのキーボードのプログラムをコントローラ版に編集してみました。
そこで問題があります。**(質問1)L1ボタンを押している最中はLframeは1になるのになぜか0のままになってしまい、武器の切り替えができません。**キーボード版の方ではしっかりできました。
こちらはキーボードとコントローラの二つの操作ができる全体のプログラムです。
上にも書きました通りコントローラの方は書いた通りに機能していません。

ちなみに、こちらのプログラムを作りました。
このプログラムもキーボードとfanaさんの書いていただいた下に書いてあるプログラムを参考にコントローラで正しく操作できます。
epistemeとか言う人曰く
(質問2)fanaさんのやり方はgpUpdateKey()方式の"簡略版"だそうなのですが、簡略化にしても上に載せたキーボードを操作するためにあるgpUpdateKey()と同じように働くgpUpdatePad()はなぜ同じように働かないのでしょうか。

fanaさんから頂いたプログラムです。

//「前回」と「今回」のパッド状態調査結果(GetJoypadInputState()の戻り値)を覚えておく場所 //を(適切な場所に)用意する int PrevPadState = 0; //適切な初期値は0かなきっと int CurrPadState = 0; //適切な初期値は0かなきっと //現在のパッドの状態をGetJoypadInputState()を用いて調査し, //2つの変数{ PrevPadState ,CurrPadState }を更新する作業を担う関数. //この関数をメインループから毎回呼ぶ感じ. void UpdatePadState() { //「前回」情報を更新 PrevPadState = CurrPadState; //「今回」情報を更新 CurrPadState = GetJoypadInputState( DX_INPUT_KEY_PAD1 ); //引数はこれで良いのかな? } //実際どんなコードなのかはわからんけど,メインループで毎度↑の関数UpdatePadState()を呼ぶ int main() { ... //初期処理 while( true ) //メインループのつもり { UpdatePadState(); //パッド状態の調査 ... //その他の処理 } ... //後処理 return 0; } // //以下はどこか(PrevPadStateとCurrPadStateの値を参照できる場所)での処理 // //パッドの「右」ボタンが「今」押されたかどうか判定するとき if( ( PrevPadState & PAD_INPUT_RIGHT ) == 0 //前回は押されていなくて && //且つ ( CurrPadState & PAD_INPUT_RIGHT ) != 0 //今回は押されている ) {//「右」は今押された //「右」が押されたときの処理 }

編集
以下のようにfanaさんから頂いたプログラムで四角を押していて、かつL1ボタンを押していない時は弾がでないようにしたのですが

if (Gfunction_status == 1) {if (Glock == 0) { { if ( (PrevPadState & PAD_INPUT_1) != 0 && MGcount >= 1 && Gtime == 0 && Gkey == 2 && //且つ (CurrPadState & PAD_INPUT_1) != 0 && MGcount >= 1 && Gtime == 0 && Gkey == 2 ) { MGframe = 1; MGtime = 1; } if ( (PrevPadState & PAD_INPUT_5) == 0 && MGcount > 0 && MGframe == 1 && //且つ (CurrPadState & PAD_INPUT_5) == 0 && MGcount > 0 && MGframe == 1 ) { --MGcount;//マシンガンの弾が減っていき、かつ相手が同じ行にいるときに相手のHPが減る。そうかかないと一度マシンガンを使った後、ボタンを押していなくても敵が同じ行にいるだけで相手のHPが勝手に減る。 ++MGtime; 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) {//if (Key[KEY_INPUT_G] == 1 && Gcount >= 1 && Gtime == 0 && Gkey == 2)の中ではKey[KEY_INPUT_] == 1の都合で押し続けても一回しか押さないようにしかカウントされないため、中には書かなかった。 enemyHP = enemyHP - 2; enemyImage = enemyGHandle[5]; } }

武器の切り替えを以下のように書いた時にL1が押されている状態なのに弾が垂れ流しになります。
fanaさんのプログラムもif ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_X) == 0) と同様に押されている間はフレームがずっと働くと思うのですが、なぜ武器の切り替えの時にL1が押されている状態なのに弾が垂れ流しになるのかわかりません。

if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) != 0) { Lframe = 1; } if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。 //if (Lcount > 0) { ++Lframe; } if (Lframe > 0) { if (Pad[PAD_1] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; }

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

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

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

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

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

episteme

2019/12/07 06:28

デバッグの丸投げか?
episteme

2019/12/08 03:04

> 編集 > 以下のようにfanaさんから頂いたプログラムで四角を押していて、かつL1ボタンを押していない時は弾がでないようにしたのですが ... # 今回に限らずだけど 「切り出して示されたコードの中に間違いがある」と断言できるのか? そうでなければ質問に意味がないぞ。
R-ogiura

2019/12/08 03:35

ん?間違いはないと思いますが、正しく動くコードを使ってなぜ正しく動かなかったのかが知りたいです。
episteme

2019/12/08 03:45

正しく動くコードであるなら正しく動く。絶対に。 正しく動かないなら 「正しく作っていない」 もしくは 「原因が他にある」 のいずれか。
R-ogiura

2019/12/08 03:50

なるほど!さすがepisteme!
guest

回答2

0

回答でなくアドバイスになりますが……

質問するのが早い(質問という行動に出るのが早い)です.
「話をとりあえず放り込んだだけの段階」に見えます.
吟味と整理をしてください.

まずわかっておいて欲しいのは,
これ系の質問への回答として書かれたようなコード断片というのは,原理や方法の説明のために書かれたものであるため,そのままダイレクトに使用するのは非常に不便だったり,あるいは何かしらの穴があって実用には耐えないものであったりする場合もあります.

つまり,そのコード断片を参考にするにしても,参考にすべきはそのコード断片による説明対象であった「話の内容」であり,その話をまともに使えるように整備したコードを別途実装する必要が(普通は)あります

あなたは,回答に書かれたコードをそのままの形で実際のコードに取り込もうとしていますが……
少なくとも,
「ボタンが○○な状態である」みたいな判定は,判定方法がわかったならば,関数化してください.
例えば,
Pad[32]という変数を使っている側の方法における具体的な判定方法というが

  • 今初めて押されたか否かを知りたいときは Pad[対象]の値が1であることを調べる
  • ただ押されているか否かを知りたいときは Pad[対象]の値が1以上であることを調べる
  • ...

のだとわかったならば,コードの各所に「Pad[対象]==1」みたいな条件をそのまま書きまくるのではなく,例えば

//引数に指定したボタンが「今」押されのか否か,の判定結果を返す bool IsPadButtonPushedNow( int 調べたい対象ボタンを示す値 ) //ひでぇ関数名だが… { return (Pad[引数]==1); } //引数に指定したボタンが押されているか否か,の判定結果を返す bool GetPadButtonState( int 調べたい対象ボタンを示す値 ) //ここでは意図的に2つの関数の名を全然違う形とした { return (Pad[引数]>=1); }

のような関数を用意して,これらを使い分ける形にしてください.そのようにして,

  • 無意味な混乱や間違いを防ぐ
  • どの機能(処理)をどこが受け持っているのかを明確にする

ことを行ってください.

そういうことをきちんとやっていれば,
入力系のための判定とアプリケーションロジックの判定がごちゃまぜになった誰が見ても何を判定しているのか意味がわからないような条件文を書いたりすることが無くなります.現状はぐちゃぐちゃです.

「ボタンが○○な状態であって,且つ,アプリケーションのデータが××である場合」というのを

if( ボタンが○○な状態である ) //上記の関数呼び出しにより解決される { if( アプリケーションのデータが××である ) //※こういうのも関数化なりなんなりして「意味」が取れるようにするとよい { //処理 } }

という形に書くという「整理」を行ってください.
この「整理」というのは,コードの形だけでなく「思考の整理」でもあります.
思考が整理されていない段階で質問しても更なる混乱を生むだけです.

#あと,ぐちゃぐちゃのコードに存在する判定間違いのようなバグは,整理している過程で気付くか,あるいは自然消滅したりもしますしね.

投稿2019/12/09 02:35

編集2019/12/09 02:38
fana

総合スコア11985

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

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

episteme

2019/12/09 03:32 編集

「関数化」できないんだと思う。 # 教本読み進めてる今ならワンチャンあるかもと期待。
fana

2019/12/09 03:16

その場合は 「関数って何だろう? 書いてみよう! 使ってみよう!」という試練をクリアしてきてもらえば良いだけですね.(理想論)
fana

2019/12/09 03:25

(何だっけ…? 「トリガー」がどうの… とか.)
episteme

2019/12/09 19:38 編集

あと構造体(と配列)もすっ飛ばしてるから大量の変数に撹乱されてる。 key/padが押された/離された等のphysicalな情報 と 弾に当たった/武器を持ち換えた等のlogicalな情報 とが入り乱れている。 で、logicalな不具合を質問されても困るんよね、僕らの頭の中には無いんだから。 「そんなコード書いたから」「デバッグを人にやらすな」としか答えようがない。 # 以下に示した20行の中に間違いがある とかでない限り
fana

2019/12/10 01:28

logicに関する質問をするには,どんなlogicかを他者が読み取れるようにコードなりを書かねばならない. その意味でもまた「整理」が必要であろう.
guest

0

if (Pad[PAD_5] != 1) { Lframe = 0; }//キーLを離すとLcountは0になる。

  1. このコメント:

  「キーLを離すとLcountは0になる。」

「キーLを離すとLframeは0になる。」
の誤りか?

2.「キーLを離すとLframeは0になる。」を期待しているとすれば、

if (Pad[PAD_5] != 1)
ではなく
if (Pad[PAD_5] == 0)
ではないか?

投稿2019/12/07 07:25

編集2019/12/07 07:27
episteme

総合スコア16612

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

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

R-ogiura

2019/12/07 07:27

すいません、コメントが誤っていました。直します
episteme

2019/12/07 07:30

2. に関しては?
R-ogiura

2019/12/07 07:33

if (jyoicon == 1) { //キーLを押したまま別のキーを押すと武器が切り替わる if (Pad[PAD_5] == 1) { Lframe = 1; } //if (Lcount > 0) { ++Lframe; } if (Pad[PAD_5] == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。 if (Lframe > 0) { if (Pad[PAD_1] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; } } と書き直してみましたが、残念ながらうまくいきませんでした。
episteme

2019/12/07 07:36 編集

うまくいかないとは? キーLを離してもLframeは0にならんかったのか? どうやって確認した? break-point貼って停止しなかったのか?
R-ogiura

2019/12/07 07:43

コントロールL1を押しましたがLframeは0のままです。 描画して確認しました。 他に以下のようにリファレンスを基に押されていない時で書いてみましたが、0のままでした。 if (Pad[PAD_5] == 1) { Lframe = 1; } //if (Lcount > 0) { ++Lframe; } if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_1) == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。 if (Lframe > 0) { if (Pad[PAD_1] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } }
episteme

2019/12/07 23:48 編集

描画はアテにならない。描画に先立ってLframeを書き換えている可能性があるから。 break-point貼って停止するかを確認せよ。 [追記] 描画で確認したいならたとえば if (Pad[PAD_5] == 1) { Lframe = 1; dummy = Lframe; } /* dummyに値をコピーする */ しかるのち dummy を描画せよ。 # 理由は「描画に先立ってLframeを書き換えている可能性があるから。」 # もちろん他の箇所で dummy を書き換えてはならない。
Bull

2019/12/07 07:56

PAD_5 は何ですか? fanaさんのやり方とはボタンの指定方法が全く違います。 その辺は大丈夫ですか?
R-ogiura

2019/12/07 08:04

え!?そうなのですか、同じだと思っていました。 どのように違うのでしょうか。 PAD_5はコントローラでいう8番目を表すものです。
R-ogiura

2019/12/07 08:05

break-pointのやり方を調べるます。
R-ogiura

2019/12/07 08:13

Bullさん、gpUpdatePad()とgpUpdateKey()は同じ働きをすると思うのですが、なぜ質問に書いた二つのプログラムのようにキーの部分をボタンに切り替えるとエラーが出たのでしょうか。
Bull

2019/12/07 08:16

fanaさんのやり方は Pad の状態をビットパターンで見ているだと思います。 gpUpdatePad() 関数は gpUpdateKey() 関数と同じように、配列に格納しています。 コントローラーによって違うかもしれませんが、PS3 コントローラーですと 8番目のキーは L2 になります。
Bull

2019/12/07 08:20

コメントが入れ違いになりました。 gpUpdatePad() は gpUpdateKey() と同じく配列に入れますが、内容は全く違います。 順番は公式のドキュメント (https://dxlib.xsrv.jp/function/dxfunc_input.html#R5N4) と同じになるはずです。
episteme

2019/12/07 08:27 編集

僕の環境では Pad[PAD_5]は、押された瞬間に1 / 離した状態で0 となることを確認済だ。 だから、不具合の原因はどこか他にもあると思っている。
R-ogiura

2019/12/07 08:48

なるほど、お二方ありがとうございます。 ちなみにPad[PAD_5] == 1に関して、否定の書き方はPad[PAD_5] != 1でも良いと思うのですが、 なぜPad[PAD_5] != 1は正しく働かずPad[PAD_5] == 0と書いたのでしょうか。 もう一つ、fanaさんのやり方とgpUpdateKey() 関数のやり方は同じものですか?また同じ内容ですか?
episteme

2019/12/07 09:10

Pad[PAD_5] == 1 は"押した瞬間"であり、 その否定 Pad[PAD_5] != 1 は"押した瞬間ではない"だ。 "離した状態"とは異なる。
episteme

2019/12/07 22:16

> fanaさんのやり方とgpUpdateKey() 関数のやり方は同じものですか?また同じ内容ですか? それぞれ pad入力 と key入力。同じはずがない。
R-ogiura

2019/12/08 01:02 編集

なるほど、同じではないため、プログラムの表し方も異なり、 Bullさんバージョンは //この部分を外に書いたらうまくいった if (Pad[PAD_5] == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。 if (jyoicon == 1) { //キーLを押したまま別のキーを押すと武器が切り替わる if (Pad[PAD_5] == 1) { Lframe = 1; } //if (Lcount > 0) { ++Lframe; } if (Lframe > 0) { if (Pad[PAD_1] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; } } fanaさんバージョンは if (jyoicon == 1) { if ( (PrevPadState & PAD_INPUT_5) == 0 //前回は押されていなくて && //且つ (CurrPadState & PAD_INPUT_5) != 0 //今回は押されている ) {//「四角」は今押された //「四角」が押されたときの処理 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; } } 私の考えたバージョンは //キーLを押したまま別のキーを押すと武器が切り替わる //この部分を外に書いたらうまくいった if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。 if (jyoicon == 1) { //キーLを押したまま別のキーを押すと武器が切り替わる if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) != 0) { Lframe = 1; } //if (Lcount > 0) { ++Lframe; } if (Lframe > 0) { if (Pad[PAD_1] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; } } となりました。 ひとつ疑問なのは、なぜBullさんと私のバージョンは外にLframe = 0;tなる条件式を書くと正しく動くのかわかりません。(Bullさんと私のバージョンではif (jyoicon == 1) {}の中にLframe = 0;の条件式を書くと正しく動きません。
R-ogiura

2019/12/08 02:20

すいません。 if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_1) != 0 && MGcount >= 1 && Gtime == 0 && Gkey == 2)//押している時 { MGframe = 1; MGtime = 1; } if (MGcount > 0 && MGframe == 1 && (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) == 0) { --MGcount;//マシンガンの弾が減っていき、かつ相手が同じ行にいるときに相手のHPが減る。そうかかないと一度マシンガンを使った後、ボタンを押していなくても敵が同じ行にいるだけで相手のHPが勝手に減る。 ++MGtime; 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) {//if (Key[KEY_INPUT_G] == 1 && Gcount >= 1 && Gtime == 0 && Gkey == 2)の中ではKey[KEY_INPUT_] == 1の都合で押し続けても一回しか押さないようにしかカウントされないため、中には書かなかった。 enemyHP = enemyHP - 2; enemyImage = enemyGHandle[5]; } } とした時に、 私の作ったバージョン if (jyoicon == 1) { //キーLを押したまま別のキーを押すと武器が切り替わる if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) != 0) { Lframe = 1; } if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。 //if (Lcount > 0) { ++Lframe; } if (Lframe > 0) { if (Pad[PAD_1] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; } } bullさんのバージョンを if (jyoicon == 1) { //キーLを押したまま別のキーを押すと武器が切り替わる if (Pad[PAD_5] == 1) { Lframe = 1; } if (Pad[PAD_5] == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。 //if (Lcount > 0) { ++Lframe; } if (Lframe > 0) { if (Pad[PAD_1] == 1) { Gtime = 0; ++Gfunction_status; ++Gkey; } } if (Gkey > 2) { Gkey = 1; } if (Gfunction_status > 1) { Gfunction_status = 0; } } と書いたところ正しく動きました。 しかし、もう一つ疑問があります。 if (Pad[PAD_1] == 1 && MGcount >= 1 && Gtime == 0 && Gkey == 2)//押している時 { MGframe = 1; MGtime = 1; } if (MGcount > 0 && MGframe == 1 && Pad[PAD_5] == 0) { --MGcount;//マシンガンの弾が減っていき、かつ相手が同じ行にいるときに相手のHPが減る。そうかかないと一度マシンガンを使った後、ボタンを押していなくても敵が同じ行にいるだけで相手のHPが勝手に減る。 ++MGtime; 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) {//if (Key[KEY_INPUT_G] == 1 && Gcount >= 1 && Gtime == 0 && Gkey == 2)の中ではKey[KEY_INPUT_] == 1の都合で押し続けても一回しか押さないようにしかカウントされないため、中には書かなかった。 enemyHP = enemyHP - 2; enemyImage = enemyGHandle[5]; } } と置いた際に、
R-ogiura

2019/12/08 02:46

あの、それぞれ pad入力 と key入力、それぞれ何がどう違うのでしょうか?
episteme

2019/12/08 02:58

あなたはその両者が同じだと思っているの?
episteme

2019/12/08 03:38

padから得られるのは 32個の on/off 情報 keyから得られるのは 256個の on/off 情報 まずここから違うんだが。
R-ogiura

2019/12/08 03:51

もちろん、それはわかっています。それ以外の違いがわかりません。
episteme

2019/12/08 04:06

...ごめん匙投げる。 僕より教え方の上手な回答者を探してください。
episteme

2019/12/08 04:38 編集

そうであることを願うばかりです。 教わり方もうまくなってくださいね。
thkana

2019/12/08 05:14

教えるってのがなにかしら動くコードを与えてくれるという定義なら「教え方の上手い」人はいくらでもいるでしょうね。コードが簡単なうちは。 そうやって手に入れた、なにかおまじないの書いてあるコードが目の前に存在することを「理解」と呼んでいるから、理解したはずのコードも状況が少し変わっただけで動かなくなる/動かせなくなる。コードがちょっと大きくなってくると、もう誰も「教えて」くれないということになりそうに思うけど、どうかな。
episteme

2019/12/08 12:11 編集

僕より教え方の上手な人はたくさんいます。それは間違いない。 問題は”あなた”に教えてくれるそんな人がどれだけいるか、です。
episteme

2019/12/09 05:27

コメントは僕の自由だな。ココは公の場なんだから。他の方と同様、スルーしてくださいな。
R-ogiura

2019/12/09 12:22

あなただけは嫌い過ぎて無視できない、、、。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問