-
Notifications
You must be signed in to change notification settings - Fork 1
/
Enemies.java
309 lines (262 loc) · 11.5 KB
/
Enemies.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/*旧当たり判定に仕様するインポート*/
import java.util.ArrayList;
import java.util.List;
public class Enemies extends Actor {
//ここからコンストラクタで定義
//自分の画像
GreenfootImage img;
//体力
int hitpoint;
//倒したときのスコア
int giveScore;
//落とすアイテム
//配列の大きさ = 落とす数
//配列の中身 = アイテム
int items[];
//
int beamFlameCount = 0;
//当たり判定の広さ
int range = 10;
GreenfootSound bye = new GreenfootSound("./sounds/bye.mp3");
//-------------------------//
//ここからstatusUpdate()で使用。
//x座標
int x;
//y座標
int y;
//-------------------------//
//ここから当たり判定に使用
//周りのオブジェクトを取得したときの格納先
List list = new ArrayList();
//自機外郭
static CaterOuter meout = new CaterOuter();
//自機かどうか判断のためのインスタンス
static Cater me = new Cater(meout);
static BulletEnhanced beam = new BulletEnhanced();
//-------------------------//
//コンストラクタの見本.少なくともここにあるものは全部定義してほしい
public Enemies() {
//自分の画像を指定
img = new GreenfootImage("./images/point.png");
//画像を設定
setImage(img);
//体力を設定
hitpoint = 10;
//倒されたときのスコアを設定(使うかわからないからとりあえず0でいい)
giveScore = 0;
//落とすアイテムを定義
//なぜが代入じゃないと許してくれないから、ローカル変数宣言->代入で行く
int[] items = {0, 1};
this.items = items;
bye.setVolume(45);
//当たり判定の広さを設定
range = 10;
//オブジェクトの中心からの距離がrange以下の物を取得するので、やってみての調整になると思う
}
//act()の見本
public void act() {
//最初に現在位置を更新
statusUpdate();
//ここから移動に関するスクリプトを書く
setLocation(x, y + 1);
//-------------------------//
//その後ろに当たり判定を確認
hitStatusCheck(img);
//最後に退場のタイミングを書く.下のように一連のifにremoveObjectが入っているのがいいっぽい。
//先に体力を判定
if (hitpoint <= 0) {
//ドロップアイテムの出現
putItem(items, giveScore);
//消滅
if (!bye.isPlaying()) {
bye.play();
}
getWorld().removeObject(this);
//その後に現在一の判定
} else if (isAtEdge() || x >= 598) {
//消滅
getWorld().removeObject(this);
}
//複数で別々のifにremoveObjectがあると、なぜかエラーがでる。
/*なぜかエラーが出る例
if(hitpoint <= 0){
putItem(items);
getWorld().removeObject(this);
}
if(isAtEdge() || getX() >= 598){
getWorld().removeObject(this);
}
*/
}
//変数xとyに現在位置情報を代入するためのメソッド。
//ほかから参照するかも知れないので、act()内で最初に呼び出す
public void statusUpdate() {
x = getX();
y = getY();
}
//当たり判定のメソッド
public void hitStatusCheck(int range) {
list = getObjectsInRange(range, Stage.bullets[0].getClass());
//listの中身の数分forをまわして、それぞれのクラスが「自機の弾」」かを判断する
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
//取得したクラスが「自分に当たっているクラス」かを判断
if (isTouching(list.get(i).getClass())) {
//もし当たっているクラスが「Bulletクラス = 自機の弾」なら
if (list.get(i).toString().matches("Bullet@.*")) {
//体力から1減らす
hitpoint--;
//当たった弾の判別のため、bulletsの要素数でforを回す
for (int j = 0; j < Stage.bullets.length; j++) {
//当たったオブジェクトの名前が一致する弾を探す
if (list.get(i).toString().equals(Stage.bulletsClassName[j])) {
//見つけたら該当の弾の使用中フラグを更新
Stage.bullets[j].moveFlag = false;
//該当の弾を除去
getWorld().removeObject(Stage.bullets[j]);
break;
}
}
}
//else if(list.get(i).toString().matches("BulletEnhanced@.*")){
// //体力から1減らす
// hitpoint--;
// }
}
}
if (Cater.isBeaming) {
for (int i = 0; i < Cater.bulletEnhanced.length; i++) {
try {
if (Cater.bulletEnhanced[i].checkT(x, y)) {
if (beamFlameCount == 0) {
hitpoint--;
}
beamFlameCount++;
if (beamFlameCount == 15) {
beamFlameCount = 0;
}
}
} catch (Exception e) {
}
}
}
list = getObjectsInRange(range, me.getClass());
//listの中身の数分forをまわして、「自機本体」かを判断する
for (int i = 0; i < list.size(); i++) {
//取得したクラスが「自分に当たっているクラス」かを判断
if (isTouching(list.get(i).getClass())) {
//もし当たっているクラスが「Caterクラス = 自機」なら
if (list.get(i).toString().matches("Cater@.*") && Cater.notInvincible) {
//自機の体力or残機を減らす処理がここに来る
Cater.life--;
Cater.updateLife = true;
Cater.notInvincible = false;
}
}
}
}
//原理的に画像ファイルの縦横があれば最適解が弾けるので、画像を引数にした版
public void hitStatusCheck(GreenfootImage img) {
//int range = 0;
if (img.getWidth() - img.getHeight() >= 0) {
range = img.getWidth() / 2;
} else {
range = img.getHeight() / 2;
}
list = getObjectsInRange(range, Stage.bullets[0].getClass());
//listの中身の数分forをまわして、それぞれのクラスが「自機の弾」」かを判断する
for (int i = 0; i < list.size(); i++) {
//取得したクラスが「自分に当たっているクラス」かを判断
if (isTouching(list.get(i).getClass())) {
//もし当たっているクラスが「Bulletクラス = 自機の弾」なら
if (list.get(i).toString().matches("Bullet@.*")) {
//体力から1減らす
hitpoint--;
//当たった弾の判別のため、bulletsの要素数でforを回す
for (int j = 0; j < Stage.bullets.length; j++) {
//当たったオブジェクトの名前が一致する弾を探す
if (list.get(i).toString().equals(Stage.bulletsClassName[j])) {
//見つけたら該当の弾の使用中フラグを更新
Stage.bullets[j].moveFlag = false;
//該当の弾を除去
getWorld().removeObject(Stage.bullets[j]);
break;
}
}
}
}
}
if (Cater.isBeaming) {
for (int i = 0; i < Cater.bulletEnhanced.length; i++) {
try {
if (Cater.bulletEnhanced[i].checkT(x, y)) {
if (beamFlameCount == 0) {
hitpoint--;
}
beamFlameCount++;
if (beamFlameCount == 15) {
beamFlameCount = 0;
}
}
} catch (Exception e) {
}
}
}
list = getObjectsInRange(range, me.getClass());
//listの中身の数分forをまわして、「自機本体」かを判断する
for (int i = 0; i < list.size(); i++) {
//取得したクラスが「自分に当たっているクラス」かを判断
if (isTouching(list.get(i).getClass())) {
//もし当たっているクラスが「Caterクラス = 自機」なら
if (list.get(i).toString().matches("Cater@.*") && Cater.notInvincible) {
//自機の体力or残機を減らす処理がここに来る
Cater.life--;
Cater.updateLife = true;
Cater.notInvincible = false;
}
}
}
}
//アイテム出現のメソッド。引数としてドロップアイテムの配列をもらう
public void putItem(int items[], int givePoints) {
//アイテム出現位置調整用変数
int[] dx = new int[10];
//ドロップアイテムの数によってx座標を変えるので、それに応じたx座標の差分を指定
//とりあえず上限は3だけど、必要に応じて増やす
switch (items.length) {
case 0://ここ必要かな...?
int[] case0 = {};
dx = case0;
break;
case 1://1つの時
int[] case1 = {0};//呼び出したオブジェクトの真上
dx = case1;
break;
case 2:
int[] case2 = {-5, +5};//呼び出したオブジェクトの斜め左右上
dx = case2;
break;
case 3:
int[] case3 = {-8, 0, 8};//呼び出したオブジェクトの真上と斜め左右上
dx = case3;
break;
}
//item配列の長さ分だけforをまわして、内容に応じたアイテムを出現させる
for (int i = 0; i < items.length; i++) {
//内容の判断
switch (items[i]) {
case 0://0はスコアをゲットするアイテムに割り当て
getWorld().addObject(new GivePoints(giveScore), x + dx[i], y - 5);
break;
case 1://1は必殺技(?)のチャンスをゲットするアイテムに割り当て
getWorld().addObject(new GiveSkill(), x + dx[i], y - 5);
break;
}
}
}
//弾を撃つメソッド。使うクラスがメソッド名を統一するために定義。
public void shot() {
//だから空っぽ
}
}