好吧,我正在用java创建一个相对简单的平台游戏,我有一个生成关卡的方法,但是平铺不会绘制。
public void generateDungeon() {
int y = 30;
for(int x = 0; x < block[0].length; x++) {
block[x][y] = new Block(new Rectangle(x * Tile.tileSize, y * Tile.tileSize, Tile.tileSize, Tile.tileSize), Tile.basic);
}
}
我希望Y保持不变,这就是为什么它有一个设定值。
这就是我认为问题所在,但这是控制台消息
Exception in thread "Thread-2" java.lang.NullPointerException
at mineandbuild.Player.isCollidingWithBlock(Player.java:82)
at mineandbuild.Player.tick(Player.java:22)
at mineandbuild.Component.tick(Component.java:89)
at mineandbuild.Component.run(Component.java:110)
at java.lang.Thread.run(Unknown Source)
控制台说问题出现在这行代码中:
public boolean isCollidingWithBlock(Point pt1, Point pt2) {
for(int x = (int) (this.x / Tile.tileSize); x < (int) (this.x / Tile.tileSize + 3); x++) {
for(int y = (int) (this.y / Tile.tileSize); y < (int) (this.y / Tile.tileSize + 3); y++) {
if(x >= 0 && y >= 0 && x < Component.dungeon.block.length && y < Component.dungeon.block[0].length)
This line ---> if(Component.dungeon.block[x][y].id != Tile.air) {
if(Component.dungeon.block[x][y].contains(pt1) || Component.dungeon.block[x][y].contains(pt2)) {
return true;
}
}
}
}
return false;
}
谢谢!
答案 0 :(得分:3)
尝试打印出
的x和y值if(Component.dungeon.block[x][y].id != Tile.air) {
你说在y之前的代码应该保持不变,这意味着对于2-d数组中y的每个其他索引,它们都被设置为null,但是在forloop中你有这个
for(int y = (int) (this.y / Tile.tileSize); y < (int) (this.y / Tile.tileSize + 3); y++) {
这让我相信你正在尝试访问null的索引,然后尝试访问“id”字段,除了该对象不存在。
答案 1 :(得分:0)
块[x] [y]可能尚未针对所有y值进行初始化...如在genrateDunegeon()方法中,您正在为x的所有值初始化块[x] [30]。
所以问题是y的其他值是什么...你是否在未显示的代码片段中初始化了它。
在您不进行初始化之前,将生成异常。
我认为这可能有用.....(虽然不确定..)
public void generateDungeon()
{
for(int x = 0; x < block[0].length; x++)
{
for (int y=0; /*your termination condition like y<n */; y++)
if(y == 30)
block[x][y] = new Block(new Rectangle(x * Tile.tileSize, y * Tile.tileSize, Tile.tileSize, Tile.tileSize), Tile.basic);
else
block[x][y] = new Block(null);
}
}
并在Block构造函数中处理null值。