teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

ねy

2019/12/08 02:59

投稿

R-ogiura
R-ogiura

スコア60

title CHANGED
File without changes
body CHANGED
@@ -197,4 +197,56 @@
197
197
  //「右」が押されたときの処理
198
198
  }
199
199
 
200
+ ```
201
+
202
+
203
+ 編集
204
+ 以下のようにfanaさんから頂いたプログラムで四角を押していて、かつL1ボタンを押していない時は弾がでないようにしたのですが
205
+ ```
206
+ if (Gfunction_status == 1) {if (Glock == 0) {
207
+ {
208
+
209
+ if (
210
+ (PrevPadState & PAD_INPUT_1) != 0 && MGcount >= 1 && Gtime == 0 && Gkey == 2
211
+ && //且つ
212
+ (CurrPadState & PAD_INPUT_1) != 0 && MGcount >= 1 && Gtime == 0 && Gkey == 2
213
+ )
214
+
215
+ {
216
+ MGframe = 1; MGtime = 1;
217
+ }
218
+ if (
219
+ (PrevPadState & PAD_INPUT_5) == 0 && MGcount > 0 && MGframe == 1
220
+ && //且つ
221
+ (CurrPadState & PAD_INPUT_5) == 0 && MGcount > 0 && MGframe == 1
222
+ )
223
+ {
224
+ --MGcount;//マシンガンの弾が減っていき、かつ相手が同じ行にいるときに相手のHPが減る。そうかかないと一度マシンガンを使った後、ボタンを押していなくても敵が同じ行にいるだけで相手のHPが勝手に減る。
225
+ ++MGtime;
226
+ if (playerY == enemyY && playerX + 1 == enemyX || playerY == enemyY && playerX + 2 == enemyX || playerY == enemyY && playerX + 3 == enemyX ||
227
+ 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の都合で押し続けても一回しか押さないようにしかカウントされないため、中には書かなかった。
228
+ enemyHP = enemyHP - 2;
229
+ enemyImage = enemyGHandle[5];
230
+ }
231
+
232
+ }
233
+ ```
234
+ 武器の切り替えを以下のように書いた時にL1が押されている状態なのに弾が垂れ流しになります。
235
+ fanaさんのプログラムもif ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_X) == 0) と同様に押されている間はフレームがずっと働くと思うのですが、なぜ武器の切り替えの時にL1が押されている状態なのに弾が垂れ流しになるのかわかりません。
236
+ ```
237
+ if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) != 0) { Lframe = 1; }
238
+ if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。
239
+ //if (Lcount > 0) { ++Lframe; }
240
+
241
+ if (Lframe > 0) {
242
+ if (Pad[PAD_1] == 1) {
243
+ Gtime = 0;
244
+ ++Gfunction_status;
245
+ ++Gkey;
246
+
247
+ }
248
+ }
249
+ if (Gkey > 2) { Gkey = 1; }
250
+ if (Gfunction_status > 1) { Gfunction_status = 0; }
251
+
200
252
  ```

1

編集

2019/12/08 02:59

投稿

R-ogiura
R-ogiura

スコア60

title CHANGED
File without changes
body CHANGED
@@ -138,6 +138,63 @@
138
138
 
139
139
  ```
140
140
  と二つのキーボードのプログラムをコントローラ版に編集してみました。
141
- そこで問題があります。**L1ボタンを押している最中はLframeは1になるのになぜか0のままになってしまい、武器の切り替えができません。**キーボード版の方ではしっかりできました。
141
+ そこで問題があります。**(質問1)L1ボタンを押している最中はLframeは1になるのになぜか0のままになってしまい、武器の切り替えができません。**キーボード版の方ではしっかりできました。
142
142
  こちらはキーボードとコントローラの二つの操作ができる[全体のプログラム](https://pastebin.com/j1P8mt8g)です。
143
- 上にも書きました通りコントローラの方は書いた通りに機能していません。
143
+ 上にも書きました通りコントローラの方は書いた通りに機能していません。
144
+
145
+
146
+ ちなみに、こちらの[プログラム](https://pastebin.com/SsatpXNx)を作りました。
147
+ このプログラムもキーボードとfanaさんの書いていただいた下に書いてあるプログラムを参考にコントローラで正しく操作できます。
148
+ epistemeとか言う人曰く
149
+ (質問2)fanaさんのやり方はgpUpdateKey()方式の"簡略版"だそうなのですが、簡略化にしても上に載せたキーボードを操作するためにあるgpUpdateKey()と同じように働くgpUpdatePad()はなぜ同じように働かないのでしょうか。
150
+
151
+ fanaさんから頂いたプログラムです。
152
+ ```//まず,変数として,
153
+ //「前回」と「今回」のパッド状態調査結果(GetJoypadInputState()の戻り値)を覚えておく場所
154
+ //を(適切な場所に)用意する
155
+ int PrevPadState = 0; //適切な初期値は0かなきっと
156
+ int CurrPadState = 0; //適切な初期値は0かなきっと
157
+
158
+ //現在のパッドの状態をGetJoypadInputState()を用いて調査し,
159
+ //2つの変数{ PrevPadState ,CurrPadState }を更新する作業を担う関数.
160
+ //この関数をメインループから毎回呼ぶ感じ.
161
+ void UpdatePadState()
162
+ {
163
+ //「前回」情報を更新
164
+ PrevPadState = CurrPadState;
165
+ //「今回」情報を更新
166
+ CurrPadState = GetJoypadInputState( DX_INPUT_KEY_PAD1 ); //引数はこれで良いのかな?
167
+ }
168
+
169
+ //実際どんなコードなのかはわからんけど,メインループで毎度↑の関数UpdatePadState()を呼ぶ
170
+ int main()
171
+ {
172
+ ... //初期処理
173
+
174
+ while( true ) //メインループのつもり
175
+ {
176
+ UpdatePadState(); //パッド状態の調査
177
+
178
+ ... //その他の処理
179
+ }
180
+
181
+ ... //後処理
182
+
183
+ return 0;
184
+ }
185
+
186
+ //
187
+ //以下はどこか(PrevPadStateとCurrPadStateの値を参照できる場所)での処理
188
+ //
189
+
190
+ //パッドの「右」ボタンが「今」押されたかどうか判定するとき
191
+ if(
192
+ ( PrevPadState & PAD_INPUT_RIGHT ) == 0 //前回は押されていなくて
193
+ && //且つ
194
+ ( CurrPadState & PAD_INPUT_RIGHT ) != 0 //今回は押されている
195
+ )
196
+ {//「右」は今押された
197
+ //「右」が押されたときの処理
198
+ }
199
+
200
+ ```