0

衝突せずにコードを実行してみましたが、正常に動作します。しかし、それを使用すると、NullPointerExceptionが発生します。問題の根本は何かと関係があります

blocked[xAxis][yAxis] = true;

編集:以前にトレースを提供しなかったことをお詫びします。

コンソール:

Wed Dec 21 20:32:52 PST 2011 INFO:Slick Build #274
Wed Dec 21 20:32:52 PST 2011 INFO:LWJGL Version: 2.8.2
Wed Dec 21 20:32:52 PST 2011 INFO:OriginalDisplayMode: 1440 x 900 x 32 @60Hz
Wed Dec 21 20:32:52 PST 2011 INFO:TargetDisplayMode: 800 x 600 x 0 @0Hz
Wed Dec 21 20:32:53 PST 2011 INFO:Starting display 800x600
Wed Dec 21 20:32:53 PST 2011 INFO:Use Java PNG Loader = true
Loading: net.java.games.input.DirectAndRawInputEnvironmentPlugin
Wed Dec 21 20:32:54 PST 2011 INFO:Found 0 controllers
Exception in thread "main" java.lang.NullPointerException
at RPG.Main.init(Main.java:41)
at org.newdawn.slick.AppGameContainer.setup(AppGameContainer.java:390)
at org.newdawn.slick.AppGameContainer.start(AppGameContainer.java:314)
at RPG.Main.main(Main.java:102)

TiledMapのプロパティ

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
<map version="1.0" orientation="orthogonal" width="10" height="10" tilewidth="32"                   <tileheight="32">
<tileset name="wall" firstgid="1" tilewidth="32" tileheight="32">
<image source="wall.png"/>
<tile id="0">
<properties>
<property name="blocked" value="true"/>
</properties>
</tile>
</tileset>
<tileset name="grass" firstgid="2" tilewidth="32" tileheight="32">
<image source="grass.png"/>
</tileset>
<layer name="Layer 0" width="10" height="10">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAGNkYGBgJBIzEcCUqBvsYtTwLzEYAHHwHBmQAQAA
</data>
</layer>
</map>

完全なコード。

public class Main extends BasicGame {

Image player = null;
Image land = null;

private float playerX = 32f;
private float playerY = 32f;
private static final int SIZE = 32;

private boolean[][] blocked;

private TiledMap map;


public Main()
{
    super("Classic");
}

@Override
public void init(GameContainer gc)
        throws SlickException 
{
    player = new Image("RPG/player.png");
    map = new TiledMap("RPG/Map.tmx");

    for (int xAxis=0;xAxis<map.getWidth(); xAxis++)
    {
         for (int yAxis=0;yAxis<map.getHeight(); yAxis++)
         {
             int tileID = map.getTileId(xAxis, yAxis, 0);
             String value = map.getTileProperty(tileID, "blocked", "false");
             if ("true".equals(value))
             {
                 blocked[xAxis][yAxis] = true;
             }
         }
     }

}

@Override
public void update(GameContainer gc, int delta)
        throws SlickException
{
    Input input = gc.getInput();

    if (input.isKeyDown(Input.KEY_LEFT)) {
        if (!isBlocked(playerX, playerY - delta * 0.1f))
        {
        playerX-= delta * 0.1f;
        }
    }
    if (input.isKeyDown(Input.KEY_RIGHT)) {
        if (!isBlocked(playerX, playerY - delta * 0.1f))
        {
        playerX+= delta * 0.1f;
        }
    }
    if (input.isKeyDown(Input.KEY_UP)) {
        if (!isBlocked(playerX, playerY - delta * 0.1f))
        {
        playerY-= delta * 0.1f;
        }
    }
    if (input.isKeyDown(Input.KEY_DOWN)) {
        if (!isBlocked(playerX, playerY - delta * 0.1f))
        {
        playerY+= delta * 0.1f;
        }
    }

}

public void render(GameContainer gc, Graphics g)
        throws SlickException
{
    map.render(0, 0);

    player.draw(playerX, playerY);

}

private boolean isBlocked(float playerX, float playerY)
{
    int xBlock = (int)playerX / SIZE;
    int yBlock = (int)playerY / SIZE;
    return blocked[xBlock][yBlock];
}

public static void main(String[] args)
        throws SlickException
{
     AppGameContainer app = new AppGameContainer( new Main() );
     app.setDisplayMode(800, 600, false);
     app.start();
   }

}
4

3 に答える 3

2

blocked作成されることはありません。あなたはどこかで言う必要があります:

blocked = new boolean[xsize][ysize];

ここで、xsizeとysizeは適切に設定されています。

これを行っていないため、blockednull配列の代わりになります。そのため、配列内の要素に何かを割り当てようとすると、例外が発生します。

あなたの場合、あなたは追加することができます

blocked = new boolean[map.getWidth()][map.getHeight()];

関数の先頭に移動しますinit()

于 2011-12-22T04:56:30.987 に答える
0

アレイを初期化しませんでした

private boolean[][] blocked;

だからあなたNullPointerExceptionblocked[xAxis][yAxis] = true;

于 2011-12-22T04:55:39.197 に答える
0

ブロックされた2D配列がどこにも初期化されていないので、マップのサイズに初期化する必要があります

于 2011-12-22T04:56:18.287 に答える