不会画瓷砖?

时间:2012-09-16 03:29:47

标签: java

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

谢谢!

2 个答案:

答案 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值。