2013-12-18 70 views
0

這是地圖: 藍色方形圖層名稱:背景 青色廣場圖層名稱:對象 白方=玩家 http://prntscr.com/2c2m5l(心中永遠的黑色空間)。Java的Slick2D瓷磚地圖碰撞失敗

看一對夫婦的教程後,我結束了編碼這個類:

public class LevelOne extends BasicGameState{ 

public int state; 
boolean esc; 
Input input; 

private TiledMap map; 

private int x,y; 


public LevelOne(int state){ 
    this.state = state; 
} 

@Override 
public void init(GameContainer arg0, StateBasedGame arg1) 
     throws SlickException { 
     esc = false; 
     map = new TiledMap("res/map/map.tmx"); 

     x = 1; 
     y = 1; 
} 

@Override 
public void render(GameContainer arg0, StateBasedGame arg1, Graphics g) 
     throws SlickException { 
     map.render(0, 0); 

     g.fillRect(x * 32, y * 32, 32, 32); 

} 

@Override 
public void update(GameContainer gc, StateBasedGame sbg, int arg2) 
     throws SlickException { 
    input = gc.getInput(); 
    if(esc){ 
     Mouse.setGrabbed(false); 

    }else{ 
     Mouse.setGrabbed(true); 
    } 
     if(input.isKeyPressed(Input.KEY_ESCAPE)){ 
      esc = true; 
     } 
    if(esc){ 
     Mouse.setGrabbed(false); 
      if(input.isKeyPressed(Input.KEY_R)){ 
       esc = false; 
      }else if(input.isKeyPressed(Keyboard.KEY_Q)){ 
       System.exit(0); 
      }else if(input.isKeyPressed(Keyboard.KEY_M)){ 
       esc = false; 
       sbg.enterState(0); 
       Mouse.setGrabbed(false); 
      } 
     } 

    int objLayer = map.getLayerIndex("Objects"); 

    map.getTileId(0, 0, objLayer); 


    if(input.isKeyPressed(Input.KEY_RIGHT)){ 
     if(map.getTileId(x+1, y, objLayer) == 0){ 
      x++; 
     } 
    } 

    if(input.isKeyPressed(Input.KEY_LEFT)){ 
     if(map.getTileId(x-1, y, objLayer) == 0){ 
      x--; 
     } 
    } 

    if(input.isKeyPressed(Input.KEY_UP)){ 
     if(map.getTileId(x, y-1, objLayer) == 0){ 
      y--; 
     } 
    } 

    if(input.isKeyPressed(Input.KEY_DOWN)){ 
     if(map.getTileId(x, y+1, objLayer) == 0){ 
      y++; 
     } 
    } 

     } 

@Override 
public int getID() { 
    return state; 
} 

}

碰撞檢測不工作,我不明白爲什麼我需要這兩條線:

int objLayer = map.getLayerIndex("Objects"); 

    map.getTileId(0, 0, objLayer);//this one in particular 

回答

1
map.getTileId(0, 0, objLayer); //this one in particular 

此行不是必需的。方法getTileID(int x,int y,int layerID)將返回放置在位置(x | y)的拼貼的ID。

int objLayer = map.getLayerIndex("Objects"); 

此行將爲您提供名爲「對象」的圖層的layerID。所以基本上你必須看看你的瓷磚地圖文件。 在你的瓷磚地圖中,你可以有多個圖層。轉到地圖編輯器並搜索要與之相撞的圖層的名稱。 例如,您可以創建一個名爲「Objects」的額外圖層,然後將圖塊與該圖層進行碰撞。

找到名稱後,使用getLayerIndex(String layerName)以整數形式獲取此圖層的layerID。

稍後,您可以在getTileID(int x,int y,int layerID)中使用該值來獲取該圖層上的特定圖塊ID。最後要注意的是,你想確保瓷磚有什麼id。

檢查代碼的一種簡單方法是在每個if語句中打印getTileID(int x,int y,int layerID)的結果。有了這個,你會看到對象id,你會看到它是否工作。

簡而言之即到每一個if語句,例如:

if(input.isKeyPressed(Input.KEY_LEFT)){ 
    System.out.println("Try to walk left.Tile id left to the player is:"+ 
               map.getTileId(x-1, y, objLayer)); 
    if(map.getTileId(x-1, y, objLayer) == 0){ 
     x--; 
    } 
} 

所以檢查 1.正確的圖層名稱 2.右側區塊ID

與問候, 欽