2015-05-08 56 views
1

因此,目前我正在製作迷宮遊戲,當然,它是一個迷宮遊戲,它必須有牆壁。牆壁需要阻止玩家越過他們。我在檢查碰撞時遇到問題。它在一些地方有效,而其他地方則不適用。我目前的方法是通過我的二維數組,通過將他們當前的x和y除以50,然後使用這兩個數字來嘗試查看玩家是否會碰撞牆或不。正在發生的事情是,它阻止了玩家移動到某些牆上,有些則沒有。此外,它還會阻止玩家在沒有牆的地方(值爲2的值)。我覺得有些東西正在與數學混淆,但我無法弄清楚什麼。下面是我如何製作迷宮,伴隨着陣列它正在從製造代碼:試圖通過2d數組,並沒有得到正確的值?

private int[][] mazeWalls = { //top of the maze 
     {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 
     {1, 2, 2, 2, 2, 2, 2, 1, 2, 1}, 
     {1, 2, 2, 2, 2, 2, 2, 1, 2, 1}, 
     {1, 2, 2, 2, 2, 2, 2, 1, 2, 1}, 
     {1, 1, 1, 1, 2, 2, 2, 2, 2, 1}, 
/*left side*/{1, 2, 2, 2, 2, 2, 2, 2, 2, 1}, //right side 
     {1, 2, 2, 2, 2, 2, 2, 1, 2, 1}, 
     {1, 2, 2, 2, 2, 2, 2, 1, 2, 1}, 
     {1, 2, 2, 2, 2, 2, 2, 1, 2, 1}, 
     {1, 1, 1, 1, 1, 1, 1, 1, 1, 1} 
           //bottom of the maze 
}; 

public void paintMaze(Graphics g){ 
    for(int row = 0; row < mazeWalls.length; row++){ //example of loops 
     for(int col = 0; col < mazeWalls[row].length; col++){ //getting the positions set up 
      if(mazeWalls[row][col] == 1){ 
       g.setColor(Color.RED); //color of the walls 
       g.fillRect(col * 50, row * 50, 50, 50); //col times 50 is the x coordinate, and row times 50 is the y coordinate 
      } 
     } 
    } 
} 

這裏是我如何在同一個班級檢查碰撞的代碼:

public void collisionChecker(int playerX, int playerY){ //takes the user's location and then checks if they are running into the wall 
    if(mazeWalls[playerX/50][playerY/50] == 1){ 
     setCollision(true); 
    } 
    else if(mazeWalls[playerX/50][playerY/50] != 1){ 
     setCollision(false); //just in case 
    } 
} 

我覺得它應該起作用,但由於某種原因(我認爲這是用分割玩家座標之後的數字來表示),但事實並非如此。

+0

我相信'playerX'和'playerY'是用戶點擊的座標,然後你試圖獲得該rectanagle左上角的cooridnates來確定是否碰撞。對? –

+0

playerX和playerY的實際值是多少,它們總是可以被50整除?如果不是,那可能是問題。 – Chizzle

回答

1

在2D陣列的第一索引是按照慣例行索引,第二個是列索引,所以你的座標是錯誤的方式輪:

public void collisionChecker(int playerX, int playerY){ //takes the user's location and then checks if they are running into the wall 
    if(mazeWalls[playerY/50][playerX/50] == 1){ 
     setCollision(true); 
    } 
    else if(mazeWalls[playerY/50][playerX/50] != 1){ 
     setCollision(false); //just in case 
    } 
} 

此代碼可以簡化爲

public void collisionChecker(int playerX, int playerY){ //takes the user's location and then checks if they are running into the wall 
    setCollision(mazeWalls[playerY/50][playerX/50] == 1); 
} 
+0

我原本以爲這樣做,但我決定它不會做任何事情(顯然我錯了,不知道爲什麼我不試試這個)。我仍然可以穿過一些圍牆,但就目前而言,這似乎幾乎無法避免。如果你有任何想法,爲什麼這樣做讓我知道,但你的解決方案確實解決了它。 – user1234

+0

如果玩家仍然遇到問題,請考慮玩家的寬度和高度,而不是隻測試一個點(playerX,playerY)。假設玩家X,玩家Y(玩家X,玩家Y,玩家Y)和玩家X +玩家寬度,玩家Y +玩家高度),只要玩家小於一平方的大小,你應該能夠測試(玩家X +玩家寬度,玩家Y)是你的玩家精靈的左上角 – samgak

+0

好吧,我會確保嘗試一下。 – user1234