-1

我正在尝试制作一个需要你放置块的游戏,类似于 Minecraft。但是,我在尝试制作一个多维数组来存储放置的块的 x 和 y 坐标时遇到了一些麻烦。代码如下;

public Block[][] blocks = new Block[maxBlockX][maxBlockY];

它给了我一个空指针异常。例外情况如下;

Exception in thread "main" java.lang.NullPointerException
    at net.lojana.src.World.loadWorldAsReg(World.java:16)
    at net.lojana.client.SpriteCraft.display(SpriteCraft.java:45)
    at Run.main(Run.java:5)

loadWorldAsReg()在我的 World 类中引用了以下方法。方法在这里。

public void loadWorldAsReg() {
    for (int x = 0; x < maxBlockX; x += 20) {
        for (int y = 0; y < maxBlockY; y += 20) {
            blocks[x][y].draw();
        }
        }
}

它还引用了以下方法。

public void draw() {
    getTexture().bind();
    shapes.drawSquare(new Point(x, y), new Point(x + 20, y + 20));
}

有谁知道如何解决这个特殊的错误?非常感激!

4

3 回答 3

3

您的数组中充满了nulls。

您需要Block首先为数组中的每个元素创建一个实例。

于 2012-12-24T14:45:00.373 回答
0

改成这样:

public void loadWorldAsReg() {
    for (int x = 0; x < maxBlockX; x += 20) {
        for (int y = 0; y < maxBlockY; y += 20) {
        blocks[x][y] = new Block();
        blocks[x][y].draw();
    }
    }
}

在使用对象之前调用构造函数。Block()假设您的代码有一个,我使用了默认构造函数。如果构造函数需要,请包含参数。:)

于 2012-12-24T14:47:16.293 回答
0

写入Block[][] blocks = new Block[maxBlockX][maxBlockY]将创建一个大小为 maxBlockX * maxBlockY 的二维数组,其中仅包含空值。

新的 DATA_TYPE[size1][size2] 只会填写 PRIMITIVE 数据类型的默认值。所以 new int[2][1] 将创建一个数组 [[0],[0]] 并且 new Block[2][1] 将创建 [[null],[null]]。

只需正确初始化您的块,您将被设置。

Block[][] blocks = new Block[maxBlockX][maxBlockY];
for (int i=0; i<blocks.length; i++)
  for (int j=0; j<blocks[0].length; j++)
    blocks[i][j] = new Block();

您还可以通过检查 loadWorld 函数来避免绘制错误(空)数据。这也可能让你的生活更轻松,不知道:

public void loadWorldAsReg() {
  for (int x = 0; x < maxBlockX; x += 20) {
    for (int y = 0; y < maxBlockY; y += 20) {
      if (blocks[x][y] != null)
        blocks[x][y].draw();
    }
  }
}
于 2012-12-24T14:55:12.573 回答