質問編集履歴

1

質問内容訂正

2017/02/02 04:36

投稿

taiyokarasu
taiyokarasu

スコア27

test CHANGED
File without changes
test CHANGED
@@ -1,41 +1,729 @@
1
1
  ```ここに言語を入力
2
2
 
3
-
3
+ クラスObjectPool
4
+
4
-
5
+ //敵の配列を確保し、配列の要素分インスタンスを作る
6
+
7
+ enemy3 = new Enemy3[ENEMY3_MAX];
8
+
9
+ for(int i = 0; i < enemy3.length; i++)
10
+
11
+ {
12
+
13
+ enemy3[i] = new Enemy3(player);
14
+
15
+ }
16
+
17
+
18
+
19
+
20
+
21
+ クラスMyCanvas
22
+
23
+
24
+
25
+ //敵出現間隔
26
+
5
- if ((Level.level)==8&&(counter % (200 - 0) == 0)&&(Score.myscore >= 1050))
27
+ if ((Level.level)==8&&(counter % (200 - 0) == 0)&&(Score.myscore >= 1050))
6
28
 
7
29
  {
8
30
 
31
+ ObjectPool.newEnemy4(1 + random.nextInt(1), 0);
32
+
9
33
 
10
34
 
35
+ }
36
+
37
+
38
+
39
+ ```
40
+
41
+ Enemy4はボスキャラを作成したクラスなのですが、何とか一体ずつ出現させるためにMyCanvasのプログラムにしました。
42
+
43
+ このEnemy4のクラスは、第二形態のボスでこのボスを倒すと、最後の形態のボスが出てくるという仕組みにしたいと思っています。
44
+
45
+ Enemy4.active==falseにするとエラーになりましたが、エラーを取って実行しても意味がありませんでした。何故か、ゲームを始めるとすぐにCameOverになってしまうのです。
46
+
47
+
48
+
49
+ ```ここに言語を入力
50
+
51
+ package rol;
52
+
53
+
54
+
55
+ import java.awt.Color;
56
+
57
+ import java.awt.Graphics;
58
+
59
+
60
+
61
+ /**
62
+
63
+ *敵クラス<p>
64
+
65
+ *移動処理、描画処理など
66
+
67
+ */
68
+
69
+ public class Enemy4 extends GameObject
70
+
71
+ {
72
+
73
+ //生存時間(弾を撃つタイミングに使用)
74
+
75
+ int counter = 0;
76
+
77
+ //体力
78
+
79
+ static int katasa;
80
+
81
+ //種類
82
+
83
+ int type;
84
+
85
+ //あたり判定フラグ
86
+
87
+ boolean ishit2 = false;
88
+
89
+ //プレイヤーの位置を知っておくため、Playerインスタンスへの参照をを保持
90
+
91
+ Player player;
92
+
93
+ //打ち始めフラグ
94
+
95
+ boolean startshoot;
96
+
97
+ int shootnum;
98
+
99
+ double speed;
100
+
101
+
102
+
103
+ int dx,dy;
104
+
105
+
106
+
107
+ /**
108
+
109
+ * コンストラクタ
110
+
111
+ * @param プレイヤークラスのインスタンス(プレイヤーの位置を把握するため)
112
+
113
+ */
114
+
115
+ Enemy4(Player iplayer)
116
+
117
+ {
118
+
119
+ //プレイヤーの位置を把握
120
+
121
+ player = iplayer;
122
+
123
+ //初期化時はactiveでない
124
+
125
+ active = false;
126
+
127
+ }
128
+
129
+
130
+
131
+ /**
132
+
133
+ * インスタンスを有効にする。インスタンスの使い回しをしているので、
134
+
135
+ * 初期化処理もここで行う。
136
+
137
+ * @param ix 生成する位置(X座標)
138
+
139
+ * @param iy 生成する位置(Y座標)
140
+
141
+ */
142
+
143
+ public void activate(double ix, double iy)
144
+
145
+ {
146
+
147
+ x = ix;
148
+
149
+ y = iy;
150
+
151
+ type = (int)(Math.random());;
152
+
153
+ active = true; //弾のインスタンスを有効にする
154
+
155
+ katasa = 200;
156
+
157
+ counter = 0;
158
+
159
+ boolean ishit2 = false;
160
+
161
+ shootnum = Level.getLevel();
162
+
163
+ startshoot = false;
164
+
165
+
166
+
167
+ x=300;
168
+
169
+ y=0;
170
+
171
+
172
+
173
+ dx=0;
174
+
175
+ dy=1;
176
+
177
+ }
178
+
179
+
180
+
181
+ /**
182
+
183
+ * プレイヤーの弾と衝突したときの振る舞い
184
+
185
+ */
186
+
187
+ public void hit()
188
+
189
+ {
190
+
191
+ //体力減らす
192
+
193
+ katasa--;
194
+
195
+ ishit2 = true;
196
+
197
+ if (katasa < 0)
198
+
199
+ {
200
+
201
+ //得られる得点は敵の種類で変わる
202
+
203
+ switch(type)
204
+
205
+ {
206
+
207
+ case 0:
208
+
209
+ Score.addScore(120);
210
+
211
+ break;
212
+
213
+
214
+
215
+ default:
216
+
217
+ }
218
+
219
+ //スコアに加算
220
+
221
+
222
+
223
+ //爆発の生成
224
+
225
+ ObjectPool.newParticle(x, y, 45, 2);
226
+
227
+ ObjectPool.newParticle(x, y, 135, 2);
228
+
229
+ ObjectPool.newParticle(x, y, 225, 2);
230
+
231
+ ObjectPool.newParticle(x, y, 315, 2);
232
+
233
+ active = false;
234
+
235
+ }
236
+
237
+
238
+
239
+
240
+
241
+ }
242
+
243
+
244
+
245
+ public void hit2()
246
+
247
+ {
248
+
249
+ //体力減らす
250
+
251
+ katasa = katasa-5;
252
+
253
+ ishit2 = true;
254
+
255
+ if (katasa < 0)
256
+
257
+ {
258
+
259
+ //得られる得点は敵の種類で変わる
260
+
261
+ switch(type)
262
+
263
+ {
264
+
265
+ case 0:
266
+
267
+ Score.addScore(120);
268
+
269
+ break;
270
+
271
+ default:
272
+
273
+ }
274
+
275
+ //スコアに加算
276
+
277
+
278
+
279
+ //爆発の生成
280
+
281
+ ObjectPool.newParticle(x, y, 45, 2);
282
+
283
+ ObjectPool.newParticle(x, y, 135, 2);
284
+
285
+ ObjectPool.newParticle(x, y, 225, 2);
286
+
287
+ ObjectPool.newParticle(x, y, 315, 2);
288
+
289
+ active = false;
290
+
291
+ }
292
+
293
+ }
294
+
295
+
296
+
297
+ /**
298
+
299
+ * 動作を規定する。メインループ1周につき一回呼ばれる
300
+
301
+ */
302
+
303
+ public void move()
304
+
305
+ {
306
+
307
+ //種類で分岐
308
+
309
+ switch(type)
310
+
311
+ {
312
+
313
+ case 0:
314
+
315
+ move_enemy0();
316
+
317
+ break;
318
+
319
+ default:
320
+
321
+ }
322
+
323
+ }
324
+
325
+
326
+
327
+ /**
328
+
329
+ * 敵その1の動作
330
+
331
+ */
332
+
333
+ void move_enemy0()
334
+
335
+ {
336
+
337
+ counter++;
338
+
339
+ if (y == 250 && dx == 0) {
340
+
341
+ dx = 1;
342
+
343
+ dy = 0;
344
+
345
+ } else if (x >= 350) {
346
+
347
+ dx = -1;
348
+
349
+ } else if (x <= 200) {
350
+
351
+ dx = 1;
352
+
353
+ }
354
+
355
+ x += dx;
356
+
357
+ y += dy;
358
+
359
+
360
+
361
+
362
+
363
+ //一定間隔で弾を撃つ
364
+
365
+ if ((counter%30)==0)
366
+
367
+ {
368
+
369
+ Bullet4.FireRound(x, y);
370
+
371
+ }
372
+
373
+
374
+
375
+
376
+
377
+
378
+
379
+ //画面外に出たら消去
380
+
381
+
382
+
383
+
384
+
385
+ }
386
+
387
+
388
+
389
+ /**
390
+
391
+ * 敵その2の動作
392
+
393
+ */
394
+
395
+
396
+
397
+ /**
398
+
399
+ * 描画処理。
400
+
401
+ * 1ループで一回呼ばれる。
402
+
403
+ * @param g 描画先グラフィックハンドル
404
+
405
+ */
406
+
407
+ public void draw(Graphics g)
408
+
409
+ {
410
+
411
+ if(katasa>=0){
412
+
413
+ //弾が当たっていたら色をオレンジに
414
+
415
+ if (ishit2)
416
+
417
+ {
418
+
419
+ g.setColor(Color.red);
420
+
421
+ //翼 前
422
+
423
+ g.drawLine((int)x, (int)y, (int)x-150, (int)y-150);
424
+
425
+ g.drawLine((int)x, (int)y, (int)x+150, (int)y-150);
426
+
11
427
 
12
428
 
429
+ //翼
430
+
13
- ObjectPool.newEnemy4(1 + random.nextInt(1), 0);
431
+ g.drawLine((int)x-150, (int)y-150, (int)x-170, (int)y-200);
432
+
433
+ g.drawLine((int)x+150, (int)y-150, (int)x+170, (int)y-200);
434
+
435
+ g.drawLine((int)x-170, (int)y-200, (int)x-100, (int)y-180);
436
+
437
+ g.drawLine((int)x+170, (int)y-200, (int)x+100, (int)y-180);
14
438
 
15
439
 
16
440
 
441
+ //後ろの山
442
+
443
+ g.drawLine((int)x-100, (int)y-180, (int)x-60, (int)y-230);
444
+
445
+ g.drawLine((int)x-60, (int)y-230, (int)x-30, (int)y-200);
446
+
447
+ g.drawLine((int)x+100, (int)y-180, (int)x+60, (int)y-230);
448
+
449
+ g.drawLine((int)x+60, (int)y-230, (int)x+30, (int)y-200);
450
+
451
+ g.drawLine((int)x+30, (int)y-200, (int)x, (int)y-230);
452
+
453
+ g.drawLine((int)x-30, (int)y-200, (int)x, (int)y-230);
454
+
455
+
456
+
457
+
458
+
459
+ }else{
460
+
461
+ switch(type)
462
+
463
+ {
464
+
465
+ case 0:
466
+
467
+ g.setColor(Color.orange);
468
+
469
+
470
+
471
+
472
+
473
+ //翼 前
474
+
475
+ g.drawLine((int)x, (int)y, (int)x-150, (int)y-150);
476
+
477
+ g.drawLine((int)x, (int)y, (int)x+150, (int)y-150);
478
+
479
+
480
+
481
+ //翼
482
+
483
+ g.drawLine((int)x-150, (int)y-150, (int)x-170, (int)y-200);
484
+
485
+ g.drawLine((int)x+150, (int)y-150, (int)x+170, (int)y-200);
486
+
487
+ g.drawLine((int)x-170, (int)y-200, (int)x-100, (int)y-180);
488
+
489
+ g.drawLine((int)x+170, (int)y-200, (int)x+100, (int)y-180);
490
+
491
+
492
+
493
+ //後ろの山
494
+
495
+ g.drawLine((int)x-100, (int)y-180, (int)x-60, (int)y-230);
496
+
497
+ g.drawLine((int)x-60, (int)y-230, (int)x-30, (int)y-200);
498
+
499
+ g.drawLine((int)x+100, (int)y-180, (int)x+60, (int)y-230);
500
+
501
+ g.drawLine((int)x+60, (int)y-230, (int)x+30, (int)y-200);
502
+
503
+ g.drawLine((int)x+30, (int)y-200, (int)x, (int)y-230);
504
+
505
+ g.drawLine((int)x-30, (int)y-200, (int)x, (int)y-230);
506
+
507
+
508
+
509
+ g.setColor(Color.yellow);
510
+
511
+ g.drawRect((int)x-50, (int)y-80, 20 ,10);
512
+
513
+ g.drawRect((int)x+30, (int)y-80, 20 ,10);
514
+
515
+
516
+
517
+ g.setColor(Color.white);
518
+
519
+ g.drawLine((int)x-30, (int)y-200, (int)x-30, (int)y-150);
520
+
521
+ g.drawLine((int)x-30, (int)y-170, (int)x-20, (int)y-170);
522
+
523
+ g.drawLine((int)x-20, (int)y-170, (int)x-20, (int)y-130);
524
+
525
+ g.drawOval((int)x-25, (int)y-130, 10 ,10);
526
+
527
+
528
+
529
+ g.drawLine((int)x+60, (int)y-230, (int)x+60, (int)y-180);
530
+
531
+ g.drawLine((int)x+60, (int)y-180, (int)x+20, (int)y-180);
532
+
533
+ g.drawLine((int)x+20, (int)y-180, (int)x+20, (int)y-150);
534
+
535
+ g.drawLine((int)x+20, (int)y-160, (int)x+50, (int)y-160);
536
+
537
+ g.drawOval((int)x+50, (int)y-160, 10 ,10);
538
+
539
+
540
+
541
+ g.drawLine((int)x, (int)y-230, (int)x, (int)y-140);
542
+
543
+ g.drawLine((int)x, (int)y-140, (int)x+30, (int)y-140);
544
+
545
+ g.drawLine((int)x+30, (int)y-140, (int)x+30, (int)y-120);
546
+
547
+
548
+
549
+ g.drawLine((int)x-60, (int)y-230, (int)x-60, (int)y-180);
550
+
551
+ g.drawRect((int)x-70, (int)y-180, 20 ,10);
552
+
553
+
554
+
555
+ g.drawRect((int)x-10, (int)y-50, 20 ,10);
556
+
557
+
558
+
559
+ g.drawLine((int)x-100, (int)y-180, (int)x-100, (int)y-120);
560
+
561
+ g.drawLine((int)x-100, (int)y-150, (int)x-120, (int)y-150);
562
+
563
+ g.drawRect((int)x-120, (int)y-155, 10 ,10);
564
+
565
+
566
+
567
+ g.drawLine((int)x-100, (int)y-120, (int)x-80, (int)y-120);
568
+
569
+ g.drawRect((int)x-80, (int)y-130, 10 ,20);
570
+
571
+
572
+
573
+ g.drawLine((int)x+100, (int)y-180, (int)x+100, (int)y-150);
574
+
575
+ g.drawLine((int)x+100, (int)y-150, (int)x+80, (int)y-150);
576
+
577
+ g.drawLine((int)x+80, (int)y-150, (int)x+80, (int)y-130);
578
+
579
+ g.drawRect((int)x+75, (int)y-130, 10 ,10);
580
+
581
+
582
+
583
+ if(katasa<=100){
584
+
585
+
586
+
587
+ if(counter % 10 ==0){
588
+
589
+ g.setColor(Color.yellow);
590
+
591
+
592
+
593
+ g.drawLine((int)x-30, (int)y-200, (int)x-30, (int)y-150);
594
+
595
+ g.drawLine((int)x-30, (int)y-170, (int)x-20, (int)y-170);
596
+
597
+ g.drawLine((int)x-20, (int)y-170, (int)x-20, (int)y-130);
598
+
599
+
600
+
601
+
602
+
603
+ g.drawLine((int)x+60, (int)y-230, (int)x+60, (int)y-180);
604
+
605
+ g.drawLine((int)x+60, (int)y-180, (int)x+20, (int)y-180);
606
+
607
+ g.drawLine((int)x+20, (int)y-180, (int)x+20, (int)y-150);
608
+
609
+ g.drawLine((int)x+20, (int)y-160, (int)x+50, (int)y-160);
610
+
611
+
612
+
613
+
614
+
615
+ g.drawLine((int)x, (int)y-230, (int)x, (int)y-140);
616
+
617
+ g.drawLine((int)x, (int)y-140, (int)x+30, (int)y-140);
618
+
619
+ g.drawLine((int)x+30, (int)y-140, (int)x+30, (int)y-120);
620
+
621
+
622
+
623
+ g.drawLine((int)x-60, (int)y-230, (int)x-60, (int)y-180);
624
+
625
+
626
+
627
+
628
+
629
+ g.drawLine((int)x-100, (int)y-180, (int)x-100, (int)y-120);
630
+
631
+ g.drawLine((int)x-100, (int)y-150, (int)x-120, (int)y-150);
632
+
633
+
634
+
635
+
636
+
637
+ g.drawLine((int)x-100, (int)y-120, (int)x-80, (int)y-120);
638
+
639
+
640
+
641
+
642
+
643
+ g.drawLine((int)x+100, (int)y-180, (int)x+100, (int)y-150);
644
+
645
+ g.drawLine((int)x+100, (int)y-150, (int)x+80, (int)y-150);
646
+
647
+ g.drawLine((int)x+80, (int)y-150, (int)x+80, (int)y-130);
648
+
649
+
650
+
651
+ }
652
+
653
+ if(counter % 15 ==0){
654
+
655
+ g.setColor(Color.cyan);
656
+
657
+ g.fillOval((int)x-25, (int)y-130, 10 ,10);
658
+
659
+ g.fillOval((int)x+50, (int)y-160, 10 ,10);
660
+
661
+ }
662
+
663
+ if(counter % 20 ==0){
664
+
665
+ g.setColor(Color.red);
666
+
667
+ g.fillRect((int)x-70, (int)y-180, 20 ,10);
668
+
669
+ g.fillRect((int)x-10, (int)y-50, 20 ,10);
670
+
671
+ g.fillRect((int)x-120, (int)y-155, 10 ,10);
672
+
673
+ g.fillRect((int)x-80, (int)y-130, 10 ,20);
674
+
675
+ g.fillRect((int)x+75, (int)y-130, 10 ,10);
676
+
677
+
678
+
679
+ }
680
+
681
+
682
+
683
+
684
+
685
+
686
+
687
+ }
688
+
689
+
690
+
691
+
692
+
693
+
694
+
695
+
696
+
697
+
698
+
699
+ break;
700
+
701
+
702
+
703
+
704
+
705
+ default:
706
+
707
+ }
708
+
17
709
  }
18
710
 
19
- if(Enemy4.katasa<=0){
20
-
21
- if ((Level.level)==8)
22
-
23
- {
24
-
25
- ObjectPool.newEnemy5(1 + random.nextInt(1), 0);
26
-
27
711
  }
28
712
 
713
+ ishit2 = false;
714
+
715
+
716
+
29
- }
717
+ }
718
+
719
+
720
+
721
+
722
+
723
+
30
724
 
31
725
  ```
32
726
 
33
727
 
34
728
 
35
-
36
-
37
- のプログラムは、敵順番に出現さる為に作ったものです。
729
+ 一応、Enemy4クラスのプログラムをてみます。
38
-
39
- 前の敵が倒されたらという意味で、katasa<=0ならという条件をつけました。しかし、何故か二体の敵が同時に出てきてしまいます。
40
-
41
- Enemy4.active=falseというプログラムにすると、エラーが起きてしまいます。知恵を貸してください。