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 设置得当。

因为你还没有这样做,blockedisnull而不是一个数组。这就是为什么当您尝试将某些内容分配给数组中的元素时会出现异常的原因。

在您的情况下,您可以添加

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

到你的init()函数的顶部。

于 2011-12-22T04:56:30.987 回答
0

你没有初始化数组

private boolean[][] blocked;

这就是你进入的NullPointerException原因blocked[xAxis][yAxis] = true;

于 2011-12-22T04:55:39.197 回答
0

我没有看到在任何地方初始化了阻塞的 2D 数组,您需要将其初始化为地图的大小

于 2011-12-22T04:56:18.287 回答