2011-12-22 43 views
0

我已经尝试运行没有碰撞的代码,并且它工作正常。但有了它,我得到一个NullPointerException。问题的根源有事情做与Java NullPointerException碰撞是来源,但不知道为什么

blocked[xAxis][yAxis] = true; 

编辑:对不起,不提供的痕迹早。

控制台:在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> 

全码的

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) 

属性。

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(); 
    } 

} 
+0

请发布完整的堆栈跟踪和行号(并提及代码中的行) – LazyCubicleMonkey 2011-12-22 04:42:30

+0

您可以提供堆栈跟踪吗? – Steven 2011-12-22 04:44:11

+0

NPE通常很容易调试。堆栈跟踪会告诉你它是从哪一行中抛出的。你所需要做的就是在那里贴一个断点,看看你想要解除引用的是什么null变量。你没有提供有关NPE在哪里投放的信息,那么我们应该告诉你什么? – 2011-12-22 04:44:26

回答

2

blocked永远不会被创建。你需要的地方说:

blocked = new boolean[xsize][ysize]; 

其中XSIZE和YSIZE适当设定。

因为你还没有这样做,blockednull而不是一个数组。这就是为什么当你尝试给数组中的一个元素赋值的时候你会得到异常。

在你的情况,你可以添加

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

init()函数的顶部。

+0

谢谢。没有意识到我的愚蠢的错误。 – Streak324 2011-12-22 05:03:04

0

你没有初始化数组

private boolean[][] blocked; 

这就是为什么你得到了NullPointerExceptionblocked[xAxis][yAxis] = true;

0

我没有看到堵塞二维数组初始化的任何地方,你需要初始化它到地图的大小