0

我在使用对象数组或简单的对象数组时遇到问题,我很确定这与 slick 无关。每当 init 方法运行并到达块部分时,我都会得到一个空指针异常。我也确定问题在于我没有正确声明 Block 对象。请我真的需要一些帮助。

import org.newdawn.slick.*;
import org.newdawn.slick.state.*;

public class Stages extends BasicGameState {
    LevelInfo level = new LevelInfo(1);
    Block block[][];
    public Stages(int state) {

    }
    public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
        level.init();
        for(int i = 0; i < 13;i++) {
            for(int j = 0; j < 13;j++) {
                block[i][j] = new Block(level.type[i][j]);
            }
        }

    }
    public void render(GameContainer gc, StateBasedGame sbg,Graphics g) throws SlickException {
        for(int i = 0; i < 13;i++) {
            for(int j = 0; j < 13;j++) {
                g.drawImage(block[i][j].image,j*60,i*60);
            }
        }
    }
    public void update(GameContainer gc, StateBasedGame sbg,int delta) throws SlickException {

    }
    public int getID() {
        return 2;
    }
}
4

2 回答 2

3

你永远不会初始化block自己——它总是有一个null. 你需要:

block = new Block[13][13];

在您的init方法,构造函数或变量声明中。

其他几点注意事项:

  • 你几乎肯定应该让你的变量private
  • 您可能应该避免经常对数字 13 进行硬编码……您可以使用WIDTHand的常量HEIGHT吗?
  • 将变量声明为:

    private Block[][] block;
    

    这将有关变量的所有类型信息保存在一起。当 Java 被引入时,“变量名后面的数组部分”确实是为了让现有的 C/C++ 程序员感到高兴。

于 2013-03-19T17:25:13.990 回答
1

您永远不会实例化您的2D block数组,导致NPE您尝试在此处分配变量

block[i][j] = new Block(level.type[i][j]);

你可以这样声明你的数组:

private Block block[][] = new Block[13][13];
于 2013-03-19T17:25:11.043 回答