質問編集履歴

2

ねy

2019/12/08 02:59

投稿

R-ogiura
R-ogiura

スコア60

test CHANGED
File without changes
test CHANGED
@@ -397,3 +397,107 @@
397
397
 
398
398
 
399
399
  ```
400
+
401
+
402
+
403
+
404
+
405
+ 編集
406
+
407
+ 以下のようにfanaさんから頂いたプログラムで四角を押していて、かつL1ボタンを押していない時は弾がでないようにしたのですが
408
+
409
+ ```
410
+
411
+ if (Gfunction_status == 1) {if (Glock == 0) {
412
+
413
+ {
414
+
415
+
416
+
417
+ if (
418
+
419
+ (PrevPadState & PAD_INPUT_1) != 0 && MGcount >= 1 && Gtime == 0 && Gkey == 2
420
+
421
+ && //且つ
422
+
423
+ (CurrPadState & PAD_INPUT_1) != 0 && MGcount >= 1 && Gtime == 0 && Gkey == 2
424
+
425
+ )
426
+
427
+
428
+
429
+ {
430
+
431
+ MGframe = 1; MGtime = 1;
432
+
433
+ }
434
+
435
+ if (
436
+
437
+ (PrevPadState & PAD_INPUT_5) == 0 && MGcount > 0 && MGframe == 1
438
+
439
+ && //且つ
440
+
441
+ (CurrPadState & PAD_INPUT_5) == 0 && MGcount > 0 && MGframe == 1
442
+
443
+ )
444
+
445
+ {
446
+
447
+ --MGcount;//マシンガンの弾が減っていき、かつ相手が同じ行にいるときに相手のHPが減る。そうかかないと一度マシンガンを使った後、ボタンを押していなくても敵が同じ行にいるだけで相手のHPが勝手に減る。
448
+
449
+ ++MGtime;
450
+
451
+ if (playerY == enemyY && playerX + 1 == enemyX || playerY == enemyY && playerX + 2 == enemyX || playerY == enemyY && playerX + 3 == enemyX ||
452
+
453
+ 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の都合で押し続けても一回しか押さないようにしかカウントされないため、中には書かなかった。
454
+
455
+ enemyHP = enemyHP - 2;
456
+
457
+ enemyImage = enemyGHandle[5];
458
+
459
+ }
460
+
461
+
462
+
463
+ }
464
+
465
+ ```
466
+
467
+ 武器の切り替えを以下のように書いた時にL1が押されている状態なのに弾が垂れ流しになります。
468
+
469
+ fanaさんのプログラムもif ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_X) == 0) と同様に押されている間はフレームがずっと働くと思うのですが、なぜ武器の切り替えの時にL1が押されている状態なのに弾が垂れ流しになるのかわかりません。
470
+
471
+ ```
472
+
473
+ if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) != 0) { Lframe = 1; }
474
+
475
+ if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_5) == 0) { Lframe = 0; }//キーLを離すとLcountは0になる。
476
+
477
+ //if (Lcount > 0) { ++Lframe; }
478
+
479
+
480
+
481
+ if (Lframe > 0) {
482
+
483
+ if (Pad[PAD_1] == 1) {
484
+
485
+ Gtime = 0;
486
+
487
+ ++Gfunction_status;
488
+
489
+ ++Gkey;
490
+
491
+
492
+
493
+ }
494
+
495
+ }
496
+
497
+ if (Gkey > 2) { Gkey = 1; }
498
+
499
+ if (Gfunction_status > 1) { Gfunction_status = 0; }
500
+
501
+
502
+
503
+ ```

1

編集

2019/12/08 02:59

投稿

R-ogiura
R-ogiura

スコア60

test CHANGED
File without changes
test CHANGED
@@ -278,8 +278,122 @@
278
278
 
279
279
  と二つのキーボードのプログラムをコントローラ版に編集してみました。
280
280
 
281
- そこで問題があります。**L1ボタンを押している最中はLframeは1になるのになぜか0のままになってしまい、武器の切り替えができません。**キーボード版の方ではしっかりできました。
281
+ そこで問題があります。**(質問1)L1ボタンを押している最中はLframeは1になるのになぜか0のままになってしまい、武器の切り替えができません。**キーボード版の方ではしっかりできました。
282
282
 
283
283
  こちらはキーボードとコントローラの二つの操作ができる[全体のプログラム](https://pastebin.com/j1P8mt8g)です。
284
284
 
285
285
  上にも書きました通りコントローラの方は書いた通りに機能していません。
286
+
287
+
288
+
289
+
290
+
291
+ ちなみに、こちらの[プログラム](https://pastebin.com/SsatpXNx)を作りました。
292
+
293
+ このプログラムもキーボードとfanaさんの書いていただいた下に書いてあるプログラムを参考にコントローラで正しく操作できます。
294
+
295
+ epistemeとか言う人曰く
296
+
297
+ (質問2)fanaさんのやり方はgpUpdateKey()方式の"簡略版"だそうなのですが、簡略化にしても上に載せたキーボードを操作するためにあるgpUpdateKey()と同じように働くgpUpdatePad()はなぜ同じように働かないのでしょうか。
298
+
299
+
300
+
301
+ fanaさんから頂いたプログラムです。
302
+
303
+ ```//まず,変数として,
304
+
305
+ //「前回」と「今回」のパッド状態調査結果(GetJoypadInputState()の戻り値)を覚えておく場所
306
+
307
+ //を(適切な場所に)用意する
308
+
309
+ int PrevPadState = 0; //適切な初期値は0かなきっと
310
+
311
+ int CurrPadState = 0; //適切な初期値は0かなきっと
312
+
313
+
314
+
315
+ //現在のパッドの状態をGetJoypadInputState()を用いて調査し,
316
+
317
+ //2つの変数{ PrevPadState ,CurrPadState }を更新する作業を担う関数.
318
+
319
+ //この関数をメインループから毎回呼ぶ感じ.
320
+
321
+ void UpdatePadState()
322
+
323
+ {
324
+
325
+ //「前回」情報を更新
326
+
327
+ PrevPadState = CurrPadState;
328
+
329
+ //「今回」情報を更新
330
+
331
+ CurrPadState = GetJoypadInputState( DX_INPUT_KEY_PAD1 ); //引数はこれで良いのかな?
332
+
333
+ }
334
+
335
+
336
+
337
+ //実際どんなコードなのかはわからんけど,メインループで毎度↑の関数UpdatePadState()を呼ぶ
338
+
339
+ int main()
340
+
341
+ {
342
+
343
+ ... //初期処理
344
+
345
+
346
+
347
+ while( true ) //メインループのつもり
348
+
349
+ {
350
+
351
+ UpdatePadState(); //パッド状態の調査
352
+
353
+
354
+
355
+ ... //その他の処理
356
+
357
+ }
358
+
359
+
360
+
361
+ ... //後処理
362
+
363
+
364
+
365
+ return 0;
366
+
367
+ }
368
+
369
+
370
+
371
+ //
372
+
373
+ //以下はどこか(PrevPadStateとCurrPadStateの値を参照できる場所)での処理
374
+
375
+ //
376
+
377
+
378
+
379
+ //パッドの「右」ボタンが「今」押されたかどうか判定するとき
380
+
381
+ if(
382
+
383
+ ( PrevPadState & PAD_INPUT_RIGHT ) == 0 //前回は押されていなくて
384
+
385
+ && //且つ
386
+
387
+ ( CurrPadState & PAD_INPUT_RIGHT ) != 0 //今回は押されている
388
+
389
+ )
390
+
391
+ {//「右」は今押された
392
+
393
+ //「右」が押されたときの処理
394
+
395
+ }
396
+
397
+
398
+
399
+ ```