2016-12-23 69 views
-1

我很開心構建2D平鋪遊戲(沒有libgdx的Slick2D),並且我在超過15個小時的時間內處理碰撞。我認爲是時候提問了。我搜索了很多,但沒有真正迴應我搜索的內容。Java - 二維平鋪遊戲中的檢測碰撞

所以,這是個什麼樣子:2D game capture(深色瓷磚都被玩家不能行走)和Another 2D game capture

矩形是被碰撞可能發生。在那裏,當它們碰撞時,它仍然移動到足以鎖定在瓦片中。 (不能再做什麼)

所以,我的類被輸入處理程序,更新和繪圖調用。論文三由「玩」類。誰只是更新的東西。 (Player.MoveUp(),Player.draw,...)

  • 的 「WorldManager」 是其中瓦片被管理(他們的只有4對GetType()是查找是否阻止(0有效,1封鎖)

  • 「LevelGeneration」是瓦片的位置,它的ID和 映射(用一個int [] [])(他確定'它創建帶有ID的地圖,以及何時我
    顯示然後他們都很好)

  • AssetManager是我在哪裏削減精靈錶轉換th en BufferedImage

  • tilesize是50,玩家是41x36。

  • 我有一個問題,因爲我想有mouvements的自由(4條邊使8個mouvements側)和定位點似乎是在upperleft側

因此,這裏是我的類(沒有進口和包):

public class Player { 

public static double SPEED; 
public static int WIDTH, HEIGHT; 
public static float XPos, YPos; 
public static float destXPos, destYPos; 

public static BufferedImage presentImage; 
public static int[] position; 
public static boolean moving; 
public static boolean movementlock; 
public static int side; // 0 up 1 right 2 down 3 left 
public static Rectangle p = null; 
public static Rectangle e = null; 
private static boolean mouvementlock; 
private static boolean collision; 

public static void CreateHero(){ 
    // Valeurs de test 
    position = new int[2]; 
    SPEED = 1; 
    XPos = destXPos = 100; 
    YPos = destYPos = 100; 
    presentImage = AssetManager.Player[0][0]; 
    moving = false; 
    movementlock = false; 
    collision = false; 

    position[0] = (int) (XPos/WorldManager.TileSize); 
    position[1] = (int) (YPos/WorldManager.TileSize); 

} 

public static void MoveUp(){ 
    side = 0; 
    destYPos -= SPEED; 
    moving = ValidateNextPosition(); 
} 
public static void MoveRight(){ 
    side = 1; 
    destXPos += SPEED; 
    moving = ValidateNextPosition(); 
} 

public static void MoveDown(){ 
    side = 2; 
    destYPos += SPEED; 
    moving = ValidateNextPosition(); 
} 

public static void MoveLeft(){ 
    side = 3; 
    destXPos -= SPEED; 
    moving = ValidateNextPosition(); 
} 

static void updateMovement(){ 
    if(moving == true && mouvementlock == false){ 
     mouvementlock = true; 
     System.out.println("Mouvement"); 
     System.out.println("X : " + XPos); 
     System.out.println("Y : " + YPos); 
     XPos = destXPos; 
     YPos = destYPos; 
     System.out.println("Xdest : " + destXPos); 
     System.out.println("Ydest : " + destYPos); 
     System.out.println("" + moving); 
     moving = false; 
     mouvementlock = false;} 
    else{ 
     destXPos = XPos; 
     destYPos = YPos; 
    } 
} 


public static boolean ValidateNextPosition(){ 
    if(moving) return false; 
    if(collision) return false; 

    p = new Rectangle((int) XPos, (int) YPos, presentImage.getWidth(null),presentImage.getHeight(null)); 
    int tileid = 0; 
    boolean validate = true; 
    int destpos[] = new int[2]; 
    double TileCollision[] = new double[2]; 
    destpos[0] = (int) destXPos/WorldManager.TileSize; 
    destpos[1] = (int) destYPos/WorldManager.TileSize; 
    TileCollision[0] = 0; 
    TileCollision[1] = 0; 


    if(side == 0 && collision != true){ 
     if(destpos[1] - 1 > 0){ 
      tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1] - 1]; 
      if(destYPos + 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1){ 
       destpos[1] -= 1;collision = true;}} 
    } 
    if(side == 1 && collision != true){ 
     tileid = LevelGenerator.getIdmap()[destpos[0] + 1][destpos[1]]; 
     if(destXPos + 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1){ 
      destpos[0] += 1;collision = true;} 
    } 
    if(side == 2 && collision != true){ 
     tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1] + 1]; 
     if(destYPos - 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1){ 
      destpos[1] += 1;collision = true;} 
    } 
    if(side == 3 && collision != true){ 
     tileid = LevelGenerator.getIdmap()[destpos[0]][destpos[1]]; 
     if(destXPos - 1 < 0 || WorldManager.Tuiles[tileid].getType() == 1){ 
      /*destpos[0] -= 1*/;collision = true;} 
    } 
    if (collision == true){ 
     TileCollision[0] = LevelGenerator.getPosmap()[destpos[0]][destpos[1]][0]; 
     TileCollision[1] = LevelGenerator.getPosmap()[destpos[0]][destpos[1]][1]; 
     e = new Rectangle((int) TileCollision[0], (int) TileCollision[1],WorldManager.TileSize,WorldManager.TileSize);} 

    if(e != null && p.intersects(e)){ 
     validate = false; 
     System.out.println("collision");} 

    return validate; 
} 


public static void update() { 
    updateMovement(); 
} 

public static void draw(Graphics2D g) { 
    g.drawImage(presentImage,(int) XPos,(int) YPos,presentImage.getWidth(null),presentImage.getWidth(null),null); 
    if(p != null){ 
     g.setColor(Color.BLACK); 
     g.drawRect(p.x, p.y, p.width, p.height);} 
    if(e != null){ 
     g.setColor(Color.BLACK); 
     g.drawRect(e.x, e.y, e.width, e.height);} 
    } 

} 

要恢復,

  1. 碰撞發生爲時已晚和玩家卡在被阻擋的區塊。
  2. 有時它會通過它,因爲(我想)左上角沒有碰到該塊。
  3. 它可以走出去的地圖沒有問題,然後墜毀,但一切我試圖保持崩潰遊戲

非常感謝你,有一個愉快的一天

Hell'no

(PS:英語是我的第三語言,所以問我你是否完全不懂)

+0

你爲什麼要我們修復你的遊戲?你爲什麼不選擇一個問題,並專注於它它是一個混亂 – gpasch

回答

0

collision設置爲true並且ValidateNextPosition方法返回false時,collision (並且延長您的moving變量)永遠不會再次切換,因爲您的頂部有if(collision) return false聲明。

+0

嗨,我只是嘗試和玩家再次卡在牆上。你有另外一個建議嗎? –