2011-12-22 42 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

我沒有看到堵塞二維數組初始化的任何地方,你需要初始化它到地圖的大小