質問編集履歴

5

文法修正

2016/11/23 15:08

投稿

taiyokarasu
taiyokarasu

スコア27

test CHANGED
File without changes
test CHANGED
@@ -80,10 +80,14 @@
80
80
 
81
81
  もともと、このプログラムにはレベルが上がるためのクリア条件というものがありませんでした
82
82
 
83
+ 500フレーム経過すると、自然とレベルが上がり、ひたすらhiscoreを競うものだったようです。
84
+
83
85
  上記のものは、私がレベルを一つずつ上げるために追加したものです。
84
86
 
85
87
 
86
88
 
89
+
90
+
87
91
  ```ここに言語を入力
88
92
 
89
93
 

4

文法追加

2016/11/23 15:07

投稿

taiyokarasu
taiyokarasu

スコア27

test CHANGED
File without changes
test CHANGED
@@ -74,6 +74,14 @@
74
74
 
75
75
  この下が、MyCanvasのすべてのプログラムです
76
76
 
77
+ なお、このプログラムはサンプルコードとして配布していたものを私が改造していっている段階です
78
+
79
+
80
+
81
+ もともと、このプログラムにはレベルが上がるためのクリア条件というものがありませんでした
82
+
83
+ 上記のものは、私がレベルを一つずつ上げるために追加したものです。
84
+
77
85
 
78
86
 
79
87
  ```ここに言語を入力

3

文法の修正

2016/11/23 15:04

投稿

taiyokarasu
taiyokarasu

スコア27

test CHANGED
File without changes
test CHANGED
@@ -484,55 +484,55 @@
484
484
 
485
485
 
486
486
 
487
- if ((Score.myscore >200)&&(Level.getLevel() == 2)){
487
+ if ((Score.myscore >200)&&(Level.getLevel() == 1)){
488
-
488
+
489
- Level.addLevel();
489
+ Level.addLevel();
490
-
490
+
491
- }
491
+ }
492
-
493
-
494
-
492
+
493
+
494
+
495
- if ((Score.myscore >300)&&(Level.getLevel() == 3)){
495
+ if ((Score.myscore >300)&&(Level.getLevel() == 2)){
496
-
496
+
497
- Level.addLevel();
497
+ Level.addLevel();
498
-
498
+
499
- }
499
+ }
500
-
501
-
502
-
500
+
501
+
502
+
503
- if ((Score.myscore >400)&&(Level.getLevel() == 4)){
503
+ if ((Score.myscore >400)&&(Level.getLevel() == 3)){
504
-
504
+
505
- Level.addLevel();
505
+ Level.addLevel();
506
-
506
+
507
- }
507
+ }
508
-
509
-
510
-
508
+
509
+
510
+
511
- if ((Score.myscore >500)&&(Level.getLevel() == 5)){
511
+ if ((Score.myscore >500)&&(Level.getLevel() == 4)){
512
-
512
+
513
- Level.addLevel();
513
+ Level.addLevel();
514
-
514
+
515
- }
515
+ }
516
-
517
-
518
-
516
+
517
+
518
+
519
- if((Score.myscore >600)&&(Level.getLevel() == 6)){
519
+ if((Score.myscore >600)&&(Level.getLevel() == 5)){
520
-
520
+
521
- Level.addLevel();
521
+ Level.addLevel();
522
-
522
+
523
- }
523
+ }
524
-
525
-
526
-
524
+
525
+
526
+
527
- if((Score.myscore >700)&&(Level.getLevel() == 7)){
527
+ if((Score.myscore >700)&&(Level.getLevel() == 6)){
528
-
528
+
529
- Level.addLevel();
529
+ Level.addLevel();
530
-
530
+
531
- }
531
+ }
532
-
533
-
534
-
532
+
533
+
534
+
535
- if((Score.myscore >800)&&(Level.getLevel() == 8)){
535
+ if((Score.myscore >800)&&(Level.getLevel() == 7)){
536
536
 
537
537
  Level.addLevel();
538
538
 

2

質問内容の修正

2016/11/23 14:55

投稿

taiyokarasu
taiyokarasu

スコア27

test CHANGED
File without changes
test CHANGED
@@ -70,4 +70,512 @@
70
70
 
71
71
 
72
72
 
73
+
74
+
75
+ この下が、MyCanvasのすべてのプログラムです
76
+
77
+
78
+
79
+ ```ここに言語を入力
80
+
81
+
82
+
83
+ import java.awt.Canvas;
84
+
85
+ import java.awt.Color;
86
+
87
+ import java.awt.Graphics;
88
+
89
+ import java.awt.Image;
90
+
91
+ import java.util.Random;
92
+
93
+
94
+
95
+ /**
96
+
97
+ *描画先コンポーネントクラス(Canvasを継承)<p>
98
+
99
+ *メインループもここ
100
+
101
+ */
102
+
103
+ public class MyCanvas extends Canvas implements Runnable{
104
+
105
+ ObjectPool objectpool;
106
+
107
+ KeyInput keyinput;
108
+
109
+ Image imgBuf;
110
+
111
+ Graphics gBuf;
112
+
113
+ Random random;
114
+
115
+ Title title;
116
+
117
+ Score score;
118
+
119
+
120
+
121
+
122
+
123
+
124
+
125
+ /**
126
+
127
+ * シーン管理変数<p>
128
+
129
+ * 0:タイトル画面 1:ゲームのメイン画面
130
+
131
+ */
132
+
133
+ public int scene;
134
+
135
+ static final int SCENE_TITLE = 0;
136
+
137
+ static final int SCENE_GAMEMAIN = 1;
138
+
139
+
140
+
141
+
142
+
143
+ public boolean gameover;
144
+
145
+ int counter;
146
+
147
+
148
+
149
+
150
+
151
+ //押されている
152
+
153
+ static final int SHOT_PRESSED = 1;
154
+
155
+ //今押されたばかり
156
+
157
+ static final int SHOT_DOWN = 2;
158
+
159
+ int shotkey_state;
160
+
161
+
162
+
163
+
164
+
165
+ /**
166
+
167
+ * コンストラクタ
168
+
169
+ */
170
+
171
+ MyCanvas()
172
+
173
+ {
174
+
175
+ //キーリスナ実装
176
+
177
+ keyinput = new KeyInput();
178
+
179
+ addKeyListener(keyinput);
180
+
181
+ setFocusable(true); //フォーカスを取得できるようにする。
182
+
183
+ random = new Random(); //乱数オブジェクト
184
+
185
+ title = new Title();
186
+
187
+ score = new Score();
188
+
189
+ }
190
+
191
+
192
+
193
+ /**
194
+
195
+ * 初期化処理<p>
196
+
197
+ * アプリケーションの開始時、またはリスタート時に呼ばれ、<br>
198
+
199
+ * ゲーム内で使われる変数の初期化を行う。
200
+
201
+ */
202
+
203
+ public void init()
204
+
205
+ {
206
+
207
+ objectpool = new ObjectPool();
208
+
209
+ Score.loadScore();
210
+
211
+
212
+
213
+ //シーンはタイトル画面
214
+
215
+ scene = SCENE_TITLE;
216
+
217
+ gameover = false;
218
+
219
+ //レベルの初期化
220
+
221
+ Level.initLevel();
222
+
223
+ //スコアの初期化
224
+
225
+ Score.initScore();
226
+
227
+
228
+
229
+ Title.initTitle();
230
+
231
+ }
232
+
233
+
234
+
235
+ /**
236
+
237
+ * 外部からスレッドを初期化する。
238
+
239
+ */
240
+
241
+ public void initThread()
242
+
243
+ {
244
+
245
+ Thread thread = new Thread(this);
246
+
247
+ thread.start();
248
+
249
+ }
250
+
251
+
252
+
253
+ /**
254
+
255
+ * 描画処理<p>
256
+
257
+ * repaint()の際に呼ばれて、
258
+
259
+ * オフスクリーンバッファから画像をコピーし表示する。
260
+
261
+ * @param g 描画先グラフィックハンドル
262
+
263
+ */
264
+
265
+ public void paint(Graphics g)
266
+
267
+ {
268
+
269
+ //オフスクリーンバッファの内容を自分にコピー
270
+
271
+ g.drawImage(imgBuf, 0, 0, this);
272
+
273
+ }
274
+
275
+
276
+
277
+ /**
278
+
279
+ * メインループ
280
+
281
+ */
282
+
283
+ public void run()
284
+
285
+ {
286
+
287
+ //オフスクリーンバッファ作成
288
+
289
+ imgBuf = createImage(500, 500);
290
+
291
+ gBuf = imgBuf.getGraphics();
292
+
293
+
294
+
295
+ for(counter = 0; ; counter++)
296
+
297
+ {
298
+
299
+ shotkey_state = keyinput.checkShotKey();
300
+
301
+
302
+
303
+ //バッファをクリア
304
+
305
+ gBuf.setColor(Color.white);
306
+
307
+ gBuf.fillRect(0, 0, 500, 500);
308
+
309
+
310
+
311
+ //シーン遷移用の変数で分岐
312
+
313
+ switch (scene)
314
+
315
+ {
316
+
317
+ //タイトル画面
318
+
319
+ case 0:
320
+
321
+ title.drawTitle(gBuf);
322
+
323
+ score.drawScore(gBuf);
324
+
325
+ score.drawHiScore(gBuf);
326
+
327
+
328
+
329
+ //スペースキーが押された
330
+
331
+ if (shotkey_state == SHOT_DOWN)
332
+
333
+ {
334
+
335
+ //メイン画面に行く
336
+
337
+ scene = SCENE_GAMEMAIN;
338
+
339
+ }
340
+
341
+ break;
342
+
343
+
344
+
345
+ //ゲームのメイン画面
346
+
347
+ case 1:
348
+
349
+ gameMain();
350
+
351
+ break;
352
+
353
+ }
354
+
355
+
356
+
357
+ //再描画を要求
358
+
359
+ repaint();
360
+
361
+
362
+
363
+ try{
364
+
365
+ Thread.sleep(20); //ループのウェイト
366
+
367
+ }
368
+
369
+ catch(InterruptedException e)
370
+
371
+ {}
372
+
373
+ }
374
+
375
+ }
376
+
377
+
378
+
379
+ /**
380
+
381
+ * 画面をいちいちクリアしないようにするため、
382
+
383
+ * updateメソッドをオーバーライドする。
384
+
385
+ * @param g 更新先グラフィックハンドル
386
+
387
+ */
388
+
389
+ public void update(Graphics g)
390
+
391
+ {
392
+
393
+ paint(g);
394
+
395
+ }
396
+
397
+
398
+
399
+ /**
400
+
401
+ * ゲーム画面のメイン処理
402
+
403
+ */
404
+
405
+ void gameMain()
406
+
407
+ {
408
+
409
+ //ゲームオーバーか?
410
+
411
+ if (objectpool.isGameover())
412
+
413
+ {
414
+
415
+ //ゲームオーバー文字を表示
416
+
417
+ title.drawGameover(gBuf);
418
+
419
+
420
+
421
+ if (shotkey_state == SHOT_DOWN)
422
+
423
+ {
424
+
425
+ //スコアをハイスコアに適用、必要があればセーブ
426
+
427
+ Score.compareScore();
428
+
429
+
430
+
431
+ //ゲームを再初期化
432
+
433
+ init();
434
+
435
+ }
436
+
437
+ }
438
+
439
+
440
+
441
+ //衝突の判定
442
+
443
+ objectpool.getColision();
444
+
445
+ objectpool.movePlayer(keyinput);
446
+
447
+
448
+
449
+ //敵出現間隔:レベルに応じて短くなる
450
+
451
+ if (counter % (100 - Level.getLevel() * 10) == 0)
452
+
453
+ {
454
+
455
+ ObjectPool.newEnemy(100 + random.nextInt(300), 0);
456
+
457
+ }
458
+
459
+
460
+
461
+ //500フレーム経過するとレベルが上昇
462
+
463
+ if ((Score.myscore >100)&&(Level.getLevel() == 0)){
464
+
465
+ Level.addLevel();
466
+
467
+
468
+
469
+ }
470
+
471
+ if ((150>Score.myscore)&&(Score.myscore >100)&&(Level.getLevel() == 1)){
472
+
473
+
474
+
475
+ title.drawGameclear(gBuf);
476
+
477
+
478
+
479
+
480
+
481
+ }
482
+
483
+
484
+
485
+
486
+
487
+ if ((Score.myscore >200)&&(Level.getLevel() == 2)){
488
+
489
+ Level.addLevel();
490
+
491
+ }
492
+
493
+
494
+
495
+ if ((Score.myscore >300)&&(Level.getLevel() == 3)){
496
+
497
+ Level.addLevel();
498
+
499
+ }
500
+
501
+
502
+
503
+ if ((Score.myscore >400)&&(Level.getLevel() == 4)){
504
+
505
+ Level.addLevel();
506
+
507
+ }
508
+
509
+
510
+
511
+ if ((Score.myscore >500)&&(Level.getLevel() == 5)){
512
+
513
+ Level.addLevel();
514
+
515
+ }
516
+
517
+
518
+
519
+ if((Score.myscore >600)&&(Level.getLevel() == 6)){
520
+
521
+ Level.addLevel();
522
+
523
+ }
524
+
525
+
526
+
527
+ if((Score.myscore >700)&&(Level.getLevel() == 7)){
528
+
529
+ Level.addLevel();
530
+
531
+ }
532
+
533
+
534
+
535
+ if((Score.myscore >800)&&(Level.getLevel() == 8)){
536
+
537
+ Level.addLevel();
538
+
539
+ }
540
+
541
+
542
+
543
+ //スペースキーが押されており、かつカウンタが3の倍数なら弾を撃つ(等間隔に弾を撃てる)
544
+
545
+ if ((shotkey_state == SHOT_PRESSED)&&(counter % 3 == 0))
546
+
547
+ {
548
+
549
+ objectpool.shotPlayer();
550
+
551
+ }
552
+
553
+
554
+
555
+ //ゲームオブジェクトの一括描画処理
556
+
557
+ objectpool.drawAll(gBuf);
558
+
559
+ //スコア描画
560
+
561
+ score.drawScore(gBuf);
562
+
563
+ score.drawHiScore(gBuf);
564
+
565
+
566
+
567
+ }
568
+
569
+ }
570
+
571
+
572
+
573
+
574
+
575
+
576
+
577
+
578
+
579
+ ```
580
+
73
581
  `

1

質問内容を変更

2016/11/23 14:51

投稿

taiyokarasu
taiyokarasu

スコア27

test CHANGED
@@ -1 +1 @@
1
- 処理を取り消すプログラムありますか?
1
+ 当たり判定の処理を一時的に止めるにどうしたらいいですか?
test CHANGED
@@ -24,18 +24,50 @@
24
24
 
25
25
  }
26
26
 
27
+ 質問を変えます
28
+
27
29
  上のプログラムは、クラスMyCanvasのプログラムの一部です。レベル上昇の条件と、クリアという文字を表示する処理をしています。
28
-
29
- この状態のまま、実行してみました。最初は問題がなさそうだったのですが、レベルが上昇した直後ゲームオーバーになった時、クリアの文字が画面に残ってしまい、ゲームオーバーの文字が見えにくくなってしまいます。
30
30
 
31
31
 
32
32
 
33
+ void gameMain()
34
+
35
+ {
36
+
37
+ //ゲームオーバーか?
38
+
33
- クリア文字を表示するところで、さらにif文で条件を入力したりしましたが、うまくいきませんでした。
39
+ if (objectpool.isGameover())
40
+
41
+ {
42
+
43
+ //ゲームオーバー文字を表示
44
+
45
+ title.drawGameover(gBuf);
34
46
 
35
47
 
36
48
 
49
+ これが、ゲームオーバーの文字を表示するプログラムです
50
+
37
- その為、ゲームオーバーの時には、クリアの文字は出さないとい風にしたいのでが、そのようなプログラムをするに、やはりスレッドの一時停止がいのでしょか?
51
+ ゲームオーバーかどかを返すプログラムはObjectPoolというクラスにあります
38
52
 
39
53
 
40
54
 
55
+ ゲームオーバーになってSPACEキーを押すと、タイトル画面に戻る仕組みです
56
+
57
+
58
+
41
- 他に可能なプログラムを教えてください
59
+ レベル上昇してしばらく当たり判定のプログラムを停止せたです
60
+
61
+ そうすれば、レベル上昇と同時にゲームオーバーになることは防げると思います
62
+
63
+
64
+
65
+ しかし、当たり判定はゲームオーバーと同じくObjectPoolで書かれていて、どうやってMyCanvasで当たり判定のプログラムを停止させる処理を作ればいいのかがわかりません。レベルが上がって、しばらく処理を停止させるにはどうしたらいいでしょうか?
66
+
67
+
68
+
69
+ それか、決められた時間の間だけ、文字を表示するにはどうしたらいいですか?
70
+
71
+
72
+
73
+ `