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 の値の前のコードでは、同じままにする必要があると言っています。つまり、2 次元配列内の y の他のすべてのインデックスについては null に設定されていますが、forloop ではこれを持っています

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

そのオブジェクトが存在しないことを除いて、null のインデックスにアクセスしようとしてから、「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 コンストラクターで null 値を処理します。

于 2012-09-16T03:56:49.710 に答える