2013-12-15 39 views
4

我必須爲Windows Forms製作一款適合學校的遊戲。我的遊戲包含一個用戶不得不通過迷宮。我試圖阻止我的用戶使用碰撞檢測直接穿過牆壁,但是由於用於表示牆的矩形的形狀不同而陷入困境。 Here's an image of the game.這個問題可能類似於this one,但是隨着我的運動,我相信它是完全不同的,因爲我沒有佈置網格系統或圖形地圖。壁厚較厚的2D迷宮中的碰撞檢測

正如你所看到的,牆壁相當厚。每個牆都以C#Rectangle,代表,就像我的播放器圖像(小黃色幽靈)一樣。我知道如何確定玩家是否使用C#的IntersectsWith(Rectangle r)方法穿過這些牆壁,但我不確定如何使用這些信息來處理碰撞並阻止玩家穿過牆壁。

這是我試過的:

這是我的實際運動代碼。因爲遊戲是建立在winform,該運動是由鍵盤事件觸發如OnKeyPressedOnKeyUp

public void Move(Direction dir) 
    { 
     HandleCollision(); // Handle collision while player is trying to move. 
     if (dir == Direction.NORTH) 
     {     
      this.y -= moveSpeed; 
     } 
     if (dir == Direction.SOUTH) 
     {     
      this.y += moveSpeed; 
     } 
     if (dir == Direction.EAST) 
     { 
      this.x += moveSpeed; 
     } 
     if (dir == Direction.WEST) 
     { 
      this.x -= moveSpeed; 
     } 
    } 

這是我撞的方法,HandleCollision():以上

private void HandleCollision() 
    { 
     // First, check to see if the player is hitting any of the boundaries of the game. 
     if (this.x <= 0) 
     { 
      this.x = 0; 
     } 
     if (this.x >= 748) 
     { 
      this.x = 748; 
     } 
     if (this.y <= 0) 
     { 
      this.y = 0; 
     } 
     if (this.y >= 405) 
     { 
      this.y = 405; 
     }   
     // Second, check for wall collision. 

     foreach (Rectangle wall in mazeWalls) 
     { 
      if (playerRectangle.IntersectsWith(wall)) 
      { 
       if (player.X > wall.X) { player.X += wall.Width; } 
       else if (player.X < wall.X) { player.X -= wall.Width; } 
       else if (player.Y > wall.Y) { player.Y += wall.Height; } 
       else if (player.Y < wall.Y) { player.Y -= wall.Height; }      
      } 
     } 
    } 

下面這段代碼作品。然而,由於玩家的座標已經增加了牆的寬度/高度,這會在地圖上發生一些奇怪的碰撞傳送,玩家最終會彈跳。那麼,實現碰撞檢測系統的最有效方法是什麼?它可以替代if (playerRectangle.IntersectsWith(wall)) {塊中的所有代碼?

回答

3

在移動中,保存當前位置,執行移動,檢查碰撞,如果爲true,則恢復舊位置。

爲此,HandleCollision將返回一個布爾值,對於每個成功的測試(成功=碰撞檢測)爲true,如果未滿足條件,則在最後爲false。該方法根本不會修改任何x或y值。爲了體現其新功能,應將此方法重命名爲CheckCollision。


從你在其他職位的gif看來,你的運動場被分成正方形,而牆和精靈是由多個正方形組成的?然後你的舉動應該以一個方格的增量進行,直到達到預期的增量。對於每個正方形,碰撞必須被檢查。

對於每步只有一次檢查的更高級方法,您需要一些線性數學。碰撞檢查將需要當前點P和移動的增量d。您需要檢查P和P + d之間是否跨越牆壁。這通常通過線性條件下的符號變化來表示。對於P左側的垂直牆W,如果d指向牆,則P.x+d.x-(W.x+W.width)將爲負值。用W.x+W.width<=P.x+s*d.x確定s。對於水平牆,您必須在y座標中進行相同的檢查。以所有擊中的對象爲最小值,並將P+s*d作爲新位置。