-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBomber.java
170 lines (142 loc) · 5.43 KB
/
Bomber.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
package uet.oop.bomberman.entities.character;
import uet.oop.bomberman.Board;
import uet.oop.bomberman.Game;
import uet.oop.bomberman.entities.Entity;
import uet.oop.bomberman.entities.bomb.Bomb;
import uet.oop.bomberman.graphics.Screen;
import uet.oop.bomberman.graphics.Sprite;
import uet.oop.bomberman.input.Keyboard;
import java.util.Iterator;
import java.util.List;
public class Bomber extends Character {
private List<Bomb> _bombs;
protected Keyboard _input;
/**
* nếu giá trị này < 0 thì cho phép đặt đối tượng Bomb tiếp theo,
* cứ mỗi lần đặt 1 Bomb mới, giá trị này sẽ được reset về 0 và giảm dần trong mỗi lần update()
*/
protected int _timeBetweenPutBombs = 0;
public Bomber(int x, int y, Board board) {
super(x, y, board);
_bombs = _board.getBombs();
_input = _board.getInput();
_sprite = Sprite.player_right;
}
@Override
public void update() {
clearBombs();
if (!_alive) {
afterKill();
return;
}
if (_timeBetweenPutBombs < -7500) _timeBetweenPutBombs = 0;
else _timeBetweenPutBombs--;
animate();
calculateMove();
detectPlaceBomb();
}
@Override
public void render(Screen screen) {
calculateXOffset();
if (_alive)
chooseSprite();
else
_sprite = Sprite.player_dead1;
screen.renderEntity((int) _x, (int) _y - _sprite.SIZE, this);
}
public void calculateXOffset() {
int xScroll = Screen.calculateXOffset(_board, this);
Screen.setOffset(xScroll, 0);
}
/**
* Kiểm tra xem có đặt được bom hay không? nếu có thì đặt bom tại vị trí hiện tại của Bomber
*/
private void detectPlaceBomb() {
// TODO: kiểm tra xem phím điều khiển đặt bom có được gõ và giá trị _timeBetweenPutBombs, Game.getBombRate() có thỏa mãn hay không
// TODO: Game.getBombRate() sẽ trả về số lượng bom có thể đặt liên tiếp tại thời điểm hiện tại
// TODO: _timeBetweenPutBombs dùng để ngăn chặn Bomber đặt 2 Bomb cùng tại 1 vị trí trong 1 khoảng thời gian quá ngắn
// TODO: nếu 3 điều kiện trên thỏa mãn thì thực hiện đặt bom bằng placeBomb()
// TODO: sau khi đặt, nhớ giảm số lượng Bomb Rate và reset _timeBetweenPutBombs về 0
}
protected void placeBomb(int x, int y) {
// TODO: thực hiện tạo đối tượng bom, đặt vào vị trí (x, y)
}
private void clearBombs() {
Iterator<Bomb> bs = _bombs.iterator();
Bomb b;
while (bs.hasNext()) {
b = bs.next();
if (b.isRemoved()) {
bs.remove();
Game.addBombRate(1);
}
}
}
@Override
public void kill() {
if (!_alive) return;
_alive = false;
}
@Override
protected void afterKill() {
if (_timeAfter > 0) --_timeAfter;
else {
_board.endGame();
}
}
@Override
protected void calculateMove() {
// TODO: xử lý nhận tín hiệu điều khiển hướng đi từ _input và gọi move() để thực hiện 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 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 void move(double xa, double ya) {
// 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 và thực hiện thay đổi tọa độ _x, _y
// TODO: nhớ cập nhật giá trị _direction sau khi di chuyển
}
@Override
public boolean collide(Entity e) {
// TODO: xử lý va chạm với Flame
// TODO: xử lý va chạm với Enemy
return true;
}
private void chooseSprite() {
switch (_direction) {
case 0:
_sprite = Sprite.player_up;
if (_moving) {
_sprite = Sprite.movingSprite(Sprite.player_up_1, Sprite.player_up_2, _animate, 20);
}
break;
case 1:
_sprite = Sprite.player_right;
if (_moving) {
_sprite = Sprite.movingSprite(Sprite.player_right_1, Sprite.player_right_2, _animate, 20);
}
break;
case 2:
_sprite = Sprite.player_down;
if (_moving) {
_sprite = Sprite.movingSprite(Sprite.player_down_1, Sprite.player_down_2, _animate, 20);
}
break;
case 3:
_sprite = Sprite.player_left;
if (_moving) {
_sprite = Sprite.movingSprite(Sprite.player_left_1, Sprite.player_left_2, _animate, 20);
}
break;
default:
_sprite = Sprite.player_right;
if (_moving) {
_sprite = Sprite.movingSprite(Sprite.player_right_1, Sprite.player_right_2, _animate, 20);
}
break;
}
}
}