-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEnemy.java
127 lines (99 loc) · 2.92 KB
/
Enemy.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
package uet.oop.bomberman.entities.character.enemy;
import uet.oop.bomberman.Board;
import uet.oop.bomberman.Game;
import uet.oop.bomberman.entities.Entity;
import uet.oop.bomberman.entities.Message;
import uet.oop.bomberman.entities.bomb.Flame;
import uet.oop.bomberman.entities.character.Bomber;
import uet.oop.bomberman.entities.character.Character;
import uet.oop.bomberman.entities.character.enemy.ai.AI;
import uet.oop.bomberman.graphics.Screen;
import uet.oop.bomberman.graphics.Sprite;
import uet.oop.bomberman.level.Coordinates;
import java.awt.*;
public abstract class Enemy extends Character {
protected int _points;
protected double _speed;
protected AI _ai;
protected final double MAX_STEPS;
protected final double rest;
protected double _steps;
protected int _finalAnimation = 30;
protected Sprite _deadSprite;
public Enemy(int x, int y, Board board, Sprite dead, double speed, int points) {
super(x, y, board);
_points = points;
_speed = speed;
MAX_STEPS = Game.TILES_SIZE / _speed;
rest = (MAX_STEPS - (int) MAX_STEPS) / MAX_STEPS;
_steps = MAX_STEPS;
_timeAfter = 20;
_deadSprite = dead;
}
@Override
public void update() {
animate();
if(!_alive) {
afterKill();
return;
}
if(_alive)
calculateMove();
}
@Override
public void render(Screen screen) {
if(_alive)
chooseSprite();
else {
if(_timeAfter > 0) {
_sprite = _deadSprite;
_animate = 0;
} else {
_sprite = Sprite.movingSprite(Sprite.mob_dead1, Sprite.mob_dead2, Sprite.mob_dead3, _animate, 60);
}
}
screen.renderEntity((int)_x, (int)_y - _sprite.SIZE, this);
}
@Override
public void calculateMove() {
// TODO: Tính toán hướng đi và di chuyển Enemy theo _ai và cập nhật giá trị cho _direction
// TODO: sử dụng canMove() để kiểm tra xem có thể di chuyển tới điểm đã tính toán hay không
// TODO: sử dụng move() để di chuyển
// TODO: nhớ cập nhật lại giá trị cờ _moving khi thay đổi trạng thái di chuyển
}
@Override
public void move(double xa, double ya) {
if(!_alive) return;
_y += ya;
_x += xa;
}
@Override
public boolean canMove(double x, double y) {
// TODO: kiểm tra có đối tượng tại vị trí chuẩn bị di chuyển đến và có thể di chuyển tới đó hay không
return false;
}
@Override
public boolean collide(Entity e) {
// TODO: xử lý va chạm với Flame
// TODO: xử lý va chạm với Bomber
return true;
}
@Override
public void kill() {
if(!_alive) return;
_alive = false;
_board.addPoints(_points);
Message msg = new Message("+" + _points, getXMessage(), getYMessage(), 2, Color.white, 14);
_board.addMessage(msg);
}
@Override
protected void afterKill() {
if(_timeAfter > 0) --_timeAfter;
else {
if(_finalAnimation > 0) --_finalAnimation;
else
remove();
}
}
protected abstract void chooseSprite();
}