所以我觉得自己像个白痴,但我正在尝试实现碰撞检测,我需要检查玩家旁边是否有瓷砖。当我去检查一个,首先我看看我正在寻找的瓷砖是否真的存在。如果是,我继续选择图块并从中创建一个新对象。如果不是,我不碰瓷砖。但是,当我试图检查瓷砖时,我正在获得NPE!这是检查代码(只是一个相关的小部分):
if (world.tiles[(int) getX() / 32][(int) getY() / 32] != null) {
Tile t = world.tiles[(int) getX() / 32][(int) getY() / 32];
这是世界级的tile数组,我将其传递给播放器:
public Tile[][] tiles;
以及我如何创建它们:
tiles = new Tile[mx][my];
for (int x = 0; x < mx; x++) {
for (int y = 0; y < my; y++) {
if (rand.nextInt(2) == 0) {
tiles[x][y] = new Tile(x * 32, y * 32, 32);
}else if(y == 0){
tiles[x][y] = new Tile(x * 32, y * 32, 32);
}
}
}
如您所见,我获取玩家位置,然后除以图块大小(32)以获取图块坐标,然后检查图块是否为空。我知道我正在向世界传递给玩家,所以这不是问题所在。问题是,当我寻找瓷砖时,它是空的!为什么呢?
答案 0 :(得分:1)
请在下一篇文章中包含错误发生位置的确切错误消息,现在我可以假设两件事:
world
。rand
。我被敦促认为您忘记初始化rand
,因为您似乎习惯于正确初始化数组。
答案 1 :(得分:1)
您正在使用两个if语句初始化所有切片:
if (rand.nextInt(2) == 0) { // only executes when your random number is 0
tiles[x][y] = new Tile(x * 32, y * 32, 32);
}else if(y == 0){ // only executes once for each iteration of the outer for
tiles[x][y] = new Tile(x * 32, y * 32, 32);
}
答案 2 :(得分:0)
OP是关于导致NPE的线的具体信息:
if (world.tiles[(int) getX() / 32][(int) getY() / 32] != null) {
因此,由于if
块未覆盖所有可能性而导致某些图块未初始化,因此可能 nothing 。
或者:
1)world
是null
2)getX()
或getY()
为null
,因此转化为int
(a.k.a。取消装箱)失败。