0

好吧,我正在用 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;
}

谢谢!

4

2 回答 2

3

尝试打印出 x 和 y 值

if(Component.dungeon.block[x][y].id != Tile.air) {

您说在 y 的值之前的代码中应该保持不变,这意味着对于二维数组中 y 的每个其他索引,它们都设置为 null,但是在 forloop 中你有这个

for(int y = (int) (this.y / Tile.tileSize); y < (int) (this.y / Tile.tileSize  + 3); y++) {

这使我相信您正在尝试访问为空的索引,然后尝试访问“id”字段,但该对象不存在。

于 2012-09-16T03:38:42.793 回答
0

block[x][y] 可能没有为所有 y 值初始化......就像在 genrateDunegeon() 方法中你正在为所有 x 值初始化 block[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 构造函数中处理空值。

于 2012-09-16T03:56:49.710 回答