回答編集履歴

6

追記

2018/05/04 21:44

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -153,3 +153,61 @@
153
153
 
154
154
 
155
155
  **最後に質問文のソースコードはコンパイルエラーがないソースコードを載せてくださいな。**
156
+
157
+
158
+
159
+ ---
160
+
161
+ 追記コードを見て気になった点。
162
+
163
+ `Bullet`クラスの`update`メソッドの`ship.hit();`を行った後に、`Bullet`の生存フラグを`False`にしないと、次のループで2重判定されてしまいます。
164
+
165
+ 今よくよく考えてみたら、`Boss`クラスや`Ship`クラスと同様に`hp`値を保持し、HP1として`1`として設定し、減算するほうがシンプルな気がしてきました。
166
+
167
+
168
+
169
+ ```Java
170
+
171
+ class GameObject {
172
+
173
+ protected int x;
174
+
175
+ protected int y;
176
+
177
+ protected int dx;
178
+
179
+ protected int dy;
180
+
181
+ protected int hp;
182
+
183
+ GameObject(int x,int y){
184
+
185
+ this(x,y,1,1,1);
186
+
187
+ }
188
+
189
+ GameObject(int x,int y, int dx,int dy, int hp){
190
+
191
+ this.x = x;
192
+
193
+ this.y = y;
194
+
195
+ this.dx = dx;
196
+
197
+ this.dy = dy;
198
+
199
+ this.hp = hp;
200
+
201
+ }
202
+
203
+ public boolean isAlive() {
204
+
205
+ return this.hp != 0;
206
+
207
+ }
208
+
209
+ }
210
+
211
+ ```
212
+
213
+ `GameObject`クラスを`Boss`クラス,`Ship`,クラス`Bullet`,クラスは継承し、コンストラクタ内で`super()`で呼び出す。

5

質問文のリンクを追加

2018/05/04 21:44

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,4 +1,4 @@
1
- 基本的な考え方は前回の質問の`Bullet`クラスと同じです。
1
+ 基本的な考え方は[前回の質問](https://teratail.com/questions/124466)の`Bullet`クラスと同じです。
2
2
 
3
3
 
4
4
 

4

追記

2018/05/04 21:04

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -12,9 +12,9 @@
12
12
 
13
13
  というゲームの進行状態(シーンとステージ)という概念が出てきたため、
14
14
 
15
- ゲームのステージの状態(`GameStage`)を管理するクラスとシーンの状態表す`GameScene`を作成します。
15
+ 各シーンの状態を表す`GameScene`とゲームのステージの状態(`GameStage`)を管理するクラスを作成します。
16
16
 
17
- ボスクラスとシップクラスはゲームステージクラスに属します。
17
+ `Boss`クラスと`Ship`クラスは`GameStage`クラスに属します。
18
18
 
19
19
 
20
20
 
@@ -22,7 +22,7 @@
22
22
 
23
23
 
24
24
 
25
- の部分には直接画面表示のコードを書かない方がいです。
25
+ コメント欄記載の部分には直接画面表示のコードを書かない方がいです。
26
26
 
27
27
  プログラム内のデータと表示処理は分けた方が、表示条件を追加した時に苦労しないです。
28
28
 
@@ -31,6 +31,8 @@
31
31
  1,ゲームのシーンを定義します。
32
32
 
33
33
  質問文の要件としてあるのはスタート、(プレイ)、ゲームクリア、ゲームオーバーです。
34
+
35
+ 括弧内のプレイは質問文にはないですが、隠れていた要件です。
34
36
 
35
37
 
36
38
 
@@ -48,7 +50,7 @@
48
50
 
49
51
 
50
52
 
51
- このフラグで各画面のシーン遷移を管理します。
53
+ `enum`変数:`scene`で各シーン遷移を管理します。
52
54
 
53
55
 
54
56
 
@@ -56,9 +58,9 @@
56
58
 
57
59
 
58
60
 
59
- 1,まずBossクラスについて
61
+ 2,次に`Boss`クラスについて
60
62
 
61
- 1-1,Bossクラスに生存状態を返す関数を作成します。
63
+ 2-1,`Boss`クラスに生存状態を返す関数を作成します。
62
64
 
63
65
 
64
66
 
@@ -74,7 +76,7 @@
74
76
 
75
77
 
76
78
 
77
- 1-2,`Boss`クラスの`private long routine = 0;`の下に以下のを追加
79
+ 2-2,`Boss`クラスの`private long routine = 0;`の下に以下の内容を追加します。
78
80
 
79
81
 
80
82
 
@@ -86,19 +88,19 @@
86
88
 
87
89
 
88
90
 
89
- 1-3,`Boss`クラスの`hit`関数は`Boss`の`hp`を減らすだけ。
91
+ 2-3,`Boss`クラスの`hit`メソッドは`Boss`の`hp`を減らすだけにします
90
92
 
91
93
  ※hitではなく、被ダメージなので、`damage`という命名の方が適切かもしれません。
92
94
 
93
95
  命名に関しては質問者様のわかり易さを優先させてくださいな。
94
96
 
95
- 1-4,1-1~1-3に関して`Ship`クラスにも`Boss`と同じ事が適用できます。共通の親クラスを定義し継承するのも一つの手かと。
97
+ 2-4, 2-1~2-3に関して`Ship`クラスにも`Boss`と同じ事が適用できます。共通の親クラスを定義し継承するのも一つの手かと。
96
98
 
97
99
 
98
100
 
99
- 2,`GameStage`クラスについて
101
+ 3,`GameStage`クラスについて
100
102
 
101
- 2-2,ソースコードの先頭行で宣言していた、`boss`の宣言を移動します。あと`Ship`クラスも
103
+ 3-1,ソースコードの先頭行で宣言していた、ボスクラスの変数:`boss`を`GameStage`クラスに移動します。あと`Ship`クラスも移動したほうがいいですが、難しそうでしたらそのままで。
102
104
 
103
105
  ```Java
104
106
 
@@ -106,11 +108,11 @@
106
108
 
107
109
  ```
108
110
 
109
- 2-1,`update`関数を追加`draw()`関数より呼び出します。
111
+ 3-2,`update`関数を定義ます。`draw()`関数より呼び出します。
110
112
 
111
113
  `update`関数内で、`boss.doShinking();`を呼び出します。
112
114
 
113
- `update`関数内で`boss`の変数と`ship`クラスの`is_alive()`を`if`文で判定して、`GameScene`の`scene`変数を更新します。
115
+ `update`関数内で`boss`の`is_alive()`と`ship`クラスの`is_alive()`を`if`文で判定して、`GameScene`の`scene`変数を更新します。
114
116
 
115
117
 
116
118
 
@@ -118,11 +120,7 @@
118
120
 
119
121
 
120
122
 
121
- ゲームスタート画面の表示について、左クリックでゲーム画面に切り替えるコードの書き方が分かりません
122
-
123
-
124
-
125
- 3-1,`draw`関数にて、について以下の判断を行います。
123
+ 3-3,`draw`関数にて、について以下の判断を行います。
126
124
 
127
125
  |変数:`scene`の値|クリック判定|行うこと|
128
126
 
@@ -144,12 +142,14 @@
144
142
 
145
143
 
146
144
 
147
- 複雑になるとコード管理ができなくなるため、あまりゲームの仕様を増やさないほうがよいかもしれません。
145
+ コード行数が増えて処理が複雑になるとコード管理ができなくなる恐れがあるため、
148
146
 
149
- と一度ゲームのステージの進行状態整理て、メモに書き出してみると条件判定の漏が少なくなり
147
+ まりゲームの仕様増やさないほうがよいかもしれません
150
148
 
149
+ 一度ゲームのステージの進行状態を整理して、メモに書き出してみると条件判定の漏れがなくなります。
150
+
151
- 例えば、要件として道中に雑魚MOBを増やした時に、ボスはまだ表示されてないが、その扱いをどう判断するのか。
151
+ 例えば、追加要件として道中に雑魚MOBを増やした時に、ボスはまだ表示されてないが、その扱いをどう判断するのか。などなど。
152
152
 
153
153
 
154
154
 
155
- **最後に質問文のソースコードはコンパイル可能で、エラーく実行可能なソースコードを載せてくださいな。**
155
+ **最後に質問文のソースコードはコンパイルエラーソースコードを載せてくださいな。**

3

追記

2018/05/04 21:03

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -122,13 +122,25 @@
122
122
 
123
123
 
124
124
 
125
- 3-1,`draw`関数にて、`scene`がSTARTだったら、ゲームスタート画面表示します。
125
+ 3-1,`draw`関数にて、について以下の判断行います。
126
126
 
127
- そして、そして、`scene`がSTARTかつ`mousePressed`判定だったら、`scene`をPLAYにします。
127
+ |変数:`scene`の値|クリック判定|行うこと|
128
128
 
129
- `scene`がPLAYだったら、GameStageクラスの`update`を呼び出します。
129
+ |:--:|:--:|:--:|
130
130
 
131
+ |START|-|ゲームスタート画面表示。|
132
+
133
+ |START|mousePressed|sceneをPLAYに|
134
+
135
+ |PLAY|-|GameStageクラスの`update`を呼び出す。|
136
+
137
+ |OVER|-|ゲームオーバー画面を表示。|
138
+
139
+ |OVER|mousePressed|sceneをSTARTに|
140
+
131
- `scene`がCLEARだったら、ゲームクリア画面を表示します
141
+ |CLEAR|-|ゲームクリア画面を表示。|
142
+
143
+ |CLEAR|mousePressed|sceneをSTARTに|
132
144
 
133
145
 
134
146
 

2

全面改訂

2018/05/04 19:32

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -1,24 +1,66 @@
1
- 基本的な考え方は前回の質問の`Bullet`クラスと同じです。GAMEOVER,GAMECLEARというゲームの進行状態(ステージ)という概念が出てきたので、ゲームのステージの状態(`GameStage`)を管理するクラスを作成します。
2
-
3
- **ボスクラスとシップクラスはゲームステージクラスに属します。**
1
+ 基本的な考え方は前回の質問の`Bullet`クラスと同じです。
4
2
 
5
3
 
6
4
 
5
+ 0. ゲームスタート
6
+
7
- > /ここにボスが消えて、ゲームクリアの画面を出すコードを書きたい
7
+ 0. ゲームクリア
8
+
9
+ 0. ゲームオーバー
8
10
 
9
11
 
10
12
 
11
- まず、そ部分には直接画面表示のコドを書かないいです。
13
+ というゲーム進行状態(シンとステージ)とう概念出てきたため、
12
14
 
13
- プログラ**デタ****示処理**は分けた方が、表示条件追加た時に苦労しないです。
15
+ ゲームのステジの状態(`GameStage`)を管理するクラスシーンの状態をす`GameScene`作成す。
16
+
17
+ ボスクラスとシップクラスはゲームステージクラスに属します。
14
18
 
15
19
 
16
20
 
17
- `void draw()`関数内で、ゲームの進行状態に合わせて表示処理分岐させてくださ
21
+ /ここにボスが消えて、ゲームクリア画面出すコードを書きた
18
22
 
19
- 1,まず`Boss`クラスについて
20
23
 
24
+
25
+ その部分には直接画面表示のコードを書かない方がいいです。
26
+
27
+ プログラム内のデータと表示処理は分けた方が、表示条件を追加した時に苦労しないです。
28
+
29
+
30
+
31
+ 1,ゲームのシーンを定義します。
32
+
33
+ 質問文の要件としてあるのはスタート、(プレイ)、ゲームクリア、ゲームオーバーです。
34
+
35
+
36
+
37
+ ```Java
38
+
39
+ enum GameScene {
40
+
41
+ START,PLAY,CLEAR,OVER;
42
+
43
+ }
44
+
45
+ private GameScene scene = GameScene.START;
46
+
47
+ ```
48
+
49
+
50
+
51
+ このフラグで各画面のシーン遷移を管理します。
52
+
53
+
54
+
55
+ `void draw()`関数内にて`scene`の値を判断して、表示処理を分岐させてください。(※この部分は後述します)
56
+
57
+
58
+
59
+ 1,まずBossクラスについて
60
+
21
- 1-1,`Boss`クラスに生存状態を返す関数を作成します。
61
+ 1-1,Bossクラスに生存状態を返す関数を作成します。
62
+
63
+
22
64
 
23
65
  ```Java
24
66
 
@@ -30,31 +72,45 @@
30
72
 
31
73
  ```
32
74
 
75
+
76
+
33
77
  1-2,`Boss`クラスの`private long routine = 0;`の下に以下の行を追加
34
78
 
35
- `private int hp = 8;`
36
79
 
37
- 1-3,
38
80
 
39
- `Boss`クラスの`hit`関数はBossのhpを減らすだけ。
81
+ ```Java
40
82
 
41
- ※`hit`ではなく、被ダメージなので、`damage`という命名の方が適切かもしれません。
83
+ private int hp = 8;
42
84
 
85
+ ```
86
+
87
+
88
+
89
+ 1-3,`Boss`クラスの`hit`関数は`Boss`の`hp`を減らすだけ。
90
+
91
+ ※hitではなく、被ダメージなので、`damage`という命名の方が適切かもしれません。
92
+
43
- ここらへん質問者様のわかりやすさを優先させてくださいな。
93
+ 命名に関しては質問者様のわかりさを優先させてくださいな。
94
+
95
+ 1-4,1-1~1-3に関しては`Ship`クラスにも`Boss`と同じ事が適用できます。共通の親クラスを定義し継承するのも一つの手かと。
44
96
 
45
97
 
46
98
 
47
99
  2,`GameStage`クラスについて
48
100
 
49
- 2-2,ソースコードの先頭行で宣言していた、boss の宣言を移動します。**あとShipクラスも**
101
+ 2-2,ソースコードの先頭行で宣言していた、`boss`の宣言を移動します。あと`Ship`クラスも
102
+
103
+ ```Java
50
104
 
51
105
  private Boss boss = new Boss(160, 150);
52
106
 
53
- 2-1,`update`関数を追加し、draw()関数より呼び出します。
107
+ ```
54
108
 
55
- などのdrawでboss.doShinking();を移動します。
109
+ 2-1,`update`関数を追加し、`draw()`関数より呼び出します。
56
110
 
111
+ `update`関数内で、`boss.doShinking();`を呼び出します。
112
+
57
- update関数内でboss.isAlive()とshipクラスにもBossクラスと同様にhpを判定する関数を作成して、後述するGameModeのmode変数を更します。
113
+ `update`関数内で`boss`の変数`ship`クラスの`is_alive()``if`文で判定して、`GameScene``scene`変数を更します。
58
114
 
59
115
 
60
116
 
@@ -62,38 +118,26 @@
62
118
 
63
119
 
64
120
 
65
- ---
66
-
67
- > ゲームスタート画面の表示について、左クリックでゲーム画面に切り替えるコードの書き方が分かりません
121
+ ゲームスタート画面の表示について、左クリックでゲーム画面に切り替えるコードの書き方が分かりません
68
122
 
69
123
 
70
124
 
71
- 3,ゲームのモを表す`Enum`型を導入します。`enum`の使い方はぐぐってください。
125
+ 3-1,`draw`関数にて、`scene`がSTARTだったら、ゲームスタト画面を表します。
72
126
 
73
- ```Java
127
+ そして、そして、`scene`がSTARTかつ`mousePressed`判定だったら、`scene`をPLAYにします。
74
128
 
75
- enum GameMode {
129
+ `scene`がPLAYだったら、GameStageクラスの`update`を呼び出します。
76
130
 
77
- START,PLAY,CLEAR,OVER;
78
-
79
- }
80
-
81
- private GameMode mode = GameMode.START;
82
-
83
- ```
84
-
85
- 3-1,`draw`関数にて、`mode`が`START`だったら、ゲームスタート画面を表示します。
86
-
87
- そして、そして、modeがSTARTかつmousePressed判定だったら、modeをPLAYにします。
88
-
89
- modeがPLAYだったら、GameStageクラスのupdateを呼び出します。
90
-
91
- modeがCLEARだったら、ゲームクリア画面を表示します。
131
+ `scene`がCLEARだったら、ゲームクリア画面を表示します。
92
132
 
93
133
 
94
134
 
95
- ---
96
-
97
135
  複雑になるとコード管理ができなくなるため、あまりゲームの仕様を増やさないほうがよいかもしれません。
98
136
 
137
+ あと一度ゲームのステージの進行状態を整理して、メモに書き出してみると条件判定の漏れが少なくなります。
138
+
99
- あと一度ゲームのステージの進行状態を整理して、メモに書き出してみると条件判定の漏れが少なくなります。例えば、要件として道中に雑魚MOBを増やした時に、ボスはまだ表示されてないが、その扱いをどう判断するのか。
139
+ 例えば、要件として道中に雑魚MOBを増やした時に、ボスはまだ表示されてないが、その扱いをどう判断するのか。
140
+
141
+
142
+
143
+ **最後に質問文のソースコードはコンパイル可能で、エラーもなく実行可能なソースコードを載せてくださいな。**

1

追記

2018/05/04 18:29

投稿

umyu
umyu

スコア5846

test CHANGED
@@ -9,6 +9,10 @@
9
9
 
10
10
 
11
11
  まず、その部分には直接画面表示のコードを書かない方がいいです。
12
+
13
+ プログラム内の**データ**と**表示処理**は分けた方が、表示条件を追加した時に苦労しないです。
14
+
15
+
12
16
 
13
17
  `void draw()`関数内で、ゲームの進行状態に合わせて表示処理を分岐させてください。
14
18
 
@@ -66,6 +70,8 @@
66
70
 
67
71
  3,ゲームのモードを表す`Enum`型を導入します。`enum`の使い方はぐぐってください。
68
72
 
73
+ ```Java
74
+
69
75
  enum GameMode {
70
76
 
71
77
  START,PLAY,CLEAR,OVER;
@@ -73,6 +79,8 @@
73
79
  }
74
80
 
75
81
  private GameMode mode = GameMode.START;
82
+
83
+ ```
76
84
 
77
85
  3-1,`draw`関数にて、`mode`が`START`だったら、ゲームスタート画面を表示します。
78
86
 
@@ -88,4 +96,4 @@
88
96
 
89
97
  複雑になるとコード管理ができなくなるため、あまりゲームの仕様を増やさないほうがよいかもしれません。
90
98
 
91
- あと一度ゲームのステージの進行状態を整理して、メモに書き出してみると条件判定の漏れがすくなくなります。例えば、要件として道中に雑魚MOBを増やした時に、ボスはまだ表示されてないが、その扱いをどう判断するのか。
99
+ あと一度ゲームのステージの進行状態を整理して、メモに書き出してみると条件判定の漏れがなくなります。例えば、要件として道中に雑魚MOBを増やした時に、ボスはまだ表示されてないが、その扱いをどう判断するのか。