我在 2d 游戏中与平铺 map 进行了简单的碰撞,但看起来碰撞并没有考虑玩家的高度或平铺的大小,我的意思是,如果我从左边走到右侧,它有些有用,从上到下也是如此,但是如果我从右到左或从下到上行走,它只会检测到该位置中心的另一个图 block ,这是不正确的。
下面的 gif 将显示一个从左到右和从上到下的示例:
顺便说一句:0 = 沙子 1 = 熔岩(红色),请参阅左侧底部的 println!
下面的将显示从右到左,这不起作用,所以你可以看到:
(来源:gyazo.com)
我不太确定为什么会发生这种情况,这就是我检测当前区域中的图 block 的方式:
int[][] mapData = map.getMap();
System.out.println(mapData[p.getY() / 30][p.getX() / 30]);
这就是我从 .txt 文件获取 map 的方法:
public void buildTile() throws NumberFormatException, IOException {
try {
BufferedReader reader = new BufferedReader(new FileReader(this.tileMap));
this.tileWidth = Integer.parseInt(reader.readLine());
this.tileHeight = Integer.parseInt(reader.readLine());
map = new int[this.tileHeight][this.tileWidth];
for (int i = 0; i < this.tileHeight; i++) {
String line = reader.readLine();
String[] chars = line.split(" ");
for (int j = 0; j < this.tileWidth; j++) {
if (j >= chars.length) {
reader.close();
return;
}
map[i][j] = Integer.parseInt(chars[j]);
}
}
reader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
但大多数情况下,问题可能出在绘制方法上,因为我们无法真正知道图 block 是30x30,我不确定,但这是我的绘制 map 方法:
private void renderMap(Graphics2D g) throws IOException {
Player p1 = this.game.getPlayer();
int[][] tiledMap = this.map.getMap();
for (int i = 0; i < this.map.getHeight(); i++) {
for (int j = 0; j < this.map.getWidth(); j++) {
int currentRow = tiledMap[i][j];
if (currentRow == 0) {
g.drawImage(Collusion.getTile(currentRow), (j * 30) + p1.getOffX(), (i * 30) + p1.getOffY(), null);
}
if (currentRow == 1) {
g.setColor(Color.RED);
g.fillRect((j * 30) + p1.getOffX(), (i * 30) + p1.getOffY(), 30, 30);
}
}
}
}
为什么要这么做?如果您需要更多代码来检测问题,请告诉我。 也许我需要一种更好的方式来阅读/绘制 map ?
最佳答案
当图形的右下角与正方形连接时,似乎正在发生检测。检查碰撞检测以确保它检查角色的每个角而不是单个点。 除非您发布与碰撞相关的代码,否则我无法告诉您更多信息。
关于Java2D 碰撞无法正确处理图 block 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21287651/