-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFileLevelLoader.java
163 lines (146 loc) · 5.53 KB
/
FileLevelLoader.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
package uet.oop.bomberman.level;
import uet.oop.bomberman.Board;
import uet.oop.bomberman.Game;
import uet.oop.bomberman.entities.LayeredEntity;
import uet.oop.bomberman.entities.character.Bomber;
import uet.oop.bomberman.entities.character.enemy.Balloon;
import uet.oop.bomberman.entities.character.enemy.Oneal;
import uet.oop.bomberman.entities.tile.Grass;
import uet.oop.bomberman.entities.tile.Portal;
import uet.oop.bomberman.entities.tile.Wall;
import uet.oop.bomberman.entities.tile.destroyable.Brick;
import uet.oop.bomberman.entities.tile.item.SpeedItem;
import uet.oop.bomberman.exceptions.LoadLevelException;
import uet.oop.bomberman.graphics.Screen;
import uet.oop.bomberman.graphics.Sprite;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.StringTokenizer;
public class FileLevelLoader extends LevelLoader {
/**
* Ma trận chứa thông tin bản đồ, mỗi phần tử lưu giá trị kí tự đọc được
* từ ma trận bản đồ trong tệp cấu hình
*/
private static char[][] _map;
public FileLevelLoader(Board board, int level) throws LoadLevelException {
super(board, level);
}
@Override
public void loadLevel(int level) throws LoadLevelException {
// TODO: đọc dữ liệu từ tệp cấu hình /levels/Level{level}.txt
String path = "levels/Level" + level + ".txt";
try {
URL absPath = FileLevelLoader.class.getResource("/" + path);
try (BufferedReader br = new BufferedReader(
new InputStreamReader(absPath.openStream()))) {
String data = br.readLine();
StringTokenizer tokens = new StringTokenizer(data);
_level = Integer.parseInt(tokens.nextToken());
_height = Integer.parseInt(tokens.nextToken());
_width = Integer.parseInt(tokens.nextToken());
_map = new char[_height][_width];
for (int i = 0; i < _height; i++) {
String _lineMap = br.readLine();
for (int j = 0; j < _width; j++) {
_map[i][j] = _lineMap.charAt(j);
}
}
}
} catch (IOException e) {
throw new LoadLevelException("Lỗi đường truyền " + path, e);
}
// TODO: cập nhật các giá trị đọc được vào _width, _height, _level, _map
}
@Override
public void createEntities() {
// TODO: tạo các Entity của màn chơi
// TODO: sau khi tạo xong, gọi _board.addEntity() để thêm Entity vào game
// TODO: phần code mẫu ở dưới để hướng dẫn cách thêm các loại Entity vào game
// TODO: hãy xóa nó khi hoàn thành chức năng load màn chơi từ tệp cấu hình
// thêm Wall
for (int y = 0; y < getHeight(); y++) {
for (int x = 0; x < getWidth(); x++) {
int pos = x + y * getWidth();
// Sprite sprite = y == 0 || x == 0 || x == 10 || y == 10 ? Sprite.wall : Sprite.grass;
// _board.addEntity(pos, new Grass(x, y, sprite));
switch (_map[y][x])
{
case '#': {
_board.addEntity(pos, new Wall(x, y, Sprite.wall));
break;
}
case 'p': {
_board.addCharacter(new Bomber(Coordinates.tileToPixel(x), Coordinates.tileToPixel(y) + Game.TILES_SIZE, _board));
Screen.setOffset(0, 0);
_board.addEntity(pos, new Grass(x, y, Sprite.grass));
break;
}
case '*' :
{
_board.addEntity(pos,new LayeredEntity(x,y,new Grass(x,y,Sprite.grass),new Brick(x,y,Sprite.brick)));
break;
}
case '1' :
{
_board.addCharacter(new Balloon(Coordinates.tileToPixel(x),Coordinates.tileToPixel(y)+Game.TILES_SIZE,_board));
_board.addEntity(pos,new Grass(x,y,Sprite.grass));
break;
}
case '2' :
{
_board.addCharacter(new Oneal(Coordinates.tileToPixel(x),Coordinates.tileToPixel(y)+Game.TILES_SIZE,_board));
_board.addEntity(pos,new Grass(x,y,Sprite.grass));
break;
}
case 'x' :
{
_board.addEntity(pos,new LayeredEntity(x,y,new Grass(x,y,Sprite.grass),new Portal(x,y,Sprite.portal),new Brick(x,y,Sprite.brick)));
break;
}
case 'f' :
{
_board.addEntity(pos,new LayeredEntity(x,y,new Grass(x,y,Sprite.grass),new SpeedItem(x,y,Sprite.powerup_flames),new Brick(x,y,Sprite.brick)));
break;
}
default:
_board.addEntity(pos,new Grass(x,y,Sprite.grass));
break;
}
}
}
// // thêm Bomber
// int xBomber = 1, yBomber = 1;
// _board.addCharacter( new Bomber(Coordinates.tileToPixel(xBomber), Coordinates.tileToPixel(yBomber) + Game.TILES_SIZE, _board) );
// Screen.setOffset(0, 0);
// _board.addEntity(xBomber + yBomber * _width, new Grass(xBomber, yBomber, Sprite.grass));
//
// // thêm Enemy
// int xE = 2, yE = 1;
// _board.addCharacter( new Balloon(Coordinates.tileToPixel(xE), Coordinates.tileToPixel(yE) + Game.TILES_SIZE, _board));
// _board.addEntity(xE + yE * _width, new Grass(xE, yE, Sprite.grass));
//
// // thêm Brick
// int xB = 3, yB = 1;
// _board.addEntity(xB + yB * _width,
// new LayeredEntity(xB, yB,
// new Grass(xB, yB, Sprite.grass),
// new Brick(xB, yB, Sprite.brick)
// )
// );
// //thêm wall
//// int xW = 4,yW = 1;
//// _board.addEntity(xW + yW * _width,
//// );
// // thêm Item kèm Brick che phủ ở trên
// int xI = 1, yI = 2;
// _board.addEntity(xI + yI * _width,
// new LayeredEntity(xI, yI,
// new Grass(xI ,yI, Sprite.grass),
// new SpeedItem(xI, yI, Sprite.powerup_flames),
// new Brick(xI, yI, Sprite.brick)
// )
// );
}
}