我有这个非常奇怪的问题,当我绘制我的tilemap时,线程会大幅减慢。
这是瓦片地图代码:
public class TileMap {
Tile[][] map;
int x = 30, y = 0;
public TileMap(String map) {
String sCurrentLine;
try {
List<String> list = new ArrayList<String>();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/" + map)));
while (true) {
/** Starts reading the buffered line **/
String line = bufferedReader.readLine();
/** Closes the loop if there is no line to read **/
if (line == null) {
bufferedReader.close();
break;
}
/** Adds a line to the list if it is not commented **/
if (!line.startsWith("#")) {
list.add(line);
}
}
readClass(list);
} catch (IOException e) {
e.printStackTrace();
}
}
public void readClass(List<String> stringList){
int x = 0;
int y = 0;
map = new Tile[stringList.get(0).length()][stringList.size()];
for(String s : stringList){
int i = 0;
while (i < s.length()){
char c = s.charAt(i);
// if(c == 'A'){
map[x][y] = new Tile();
// }
i++;
x++;
}
x = 0;
y++;
}
}
public void draw(Graphics g){
for (int x = 0; x < map.length; x++) {
for (int y = 0; y < map[0].length; y++) {
g.drawImage(map[x][y].getImage(), (x * 20), (y * 20), null);
}
}
}
}
现在这里是我的主类的代码,它基本检查绘制我的角色的方法并在角色之前绘制tilemap(注意:当我更改等待速度时,当tilemap减慢游戏速度时,没有任何反应):
public class GamePane extends JPanel implements Runnable {
public static GameStateHandler gameStateHandler = new GameStateHandler();
private static final long serialVersionUID = 1L;
public static int WIDTH, HEIGHT;
public static boolean running;
Graphics graphics;
Thread thread;
public GamePane(Graphics g) {
thread = new Thread(this);
this.graphics = g;
init();
thread.start();
setFocusable(true);
requestFocusInWindow();
addKeyListener(new GameKeyListener(this));
}
public void init() {
WIDTH = 800;
HEIGHT = 600;
setPreferredSize(new Dimension(WIDTH, HEIGHT));
running = true;
}
public void run() {
while (running) {
try {
Thread.sleep(10);
gameStateHandler.update();
Main.drawOffScreen();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void keyPress(int keyCode) {
gameStateHandler.keyPressed(keyCode);
}
public void keyReleased(int keyCode){
gameStateHandler.keyReleased(keyCode);
}
}
如果您还有其他需要,请告诉我!提前谢谢!
答案 0 :(得分:0)
你可以发布Tile类的代码吗?我最好的猜测是问题可能出在Tile的getImage例程中。对于初学者来说,除了你为Tiles打电话之外,我什么都没看到,你在设置他们正在使用的图像吗? getImage是否将图像预先读入内存,或者每次调用getImage时是否从硬盘驱动器中提取图像(这可能需要很长时间,特别是如果您每帧尝试多次)? / p>
另外,您是否可以发布您正在为地图阅读的文件?它中有多少个字符?如果它有一个完整的“世界”地图,那么你每帧都会有效地重新绘制整个世界。通常情况下,游戏只会绘制当前可以看到的东西和一些超出视觉范围的边界,这大大缩短了大型世界的抽奖时间。