作者最近在寫一個 2D 的類似《打磚塊》的小 游戲 ,由于是新手,在設計碰撞檢測時遇到一些困難,于是上網搜索資料??墒钦垓v了半天也沒有找到詳細的介紹?,F將自己苦想出來的方法貼出來,共大家參考。 問題涉" name="description" />
作者最近在寫一個2D的類似《打磚塊》的小游戲,由于是新手,在設計碰撞檢測時遇到一些困難,于是上網搜索資料??墒钦垓v了半天也沒有找到詳細的介紹?,F將自己苦想出來的方法貼出來,共大家參考。
問題涉及兩個對象:Ball and Brick。
描述如下:
struct Ball { int X; int Y; int Radius; int dx; int dy; }
|
struct Brick { int X; int Y; int Width; int Height; }
|
(X、Y是球或磚塊的中心
相對于背景坐標)
根據小球撞擊磚塊的各種可能性,建立如圖坐標系。
令外圍矩形的長寬分別為WIDTH和HEIGHT 。
float WIDTH = Brick.Width + 2 * Ball.Radius; float HEIGHT = Brick.Height + 2 * Ball.Radius; |
設小球中心在圖示坐標系中的坐標為(x,y),則
float x = Ball.X – Brick.X; float y = Ball.Y – Brick.Y; |
大矩形被對角線分成1、2、3、4四個區域,可近似認為小球球心位于哪個區域就是碰撞的磚塊的哪個面。所以,當球心與原點連線與X軸夾角的絕對值小于θ時,小球碰撞垂直表面;大于θ時,碰撞水平表面。代碼如下:
float tan = HEIGHT / WIDTH;//tanθ的值
if(x == 0)//當x=0時,tanθ→∞ { Ball.dy = -Ball.dy; } else if (tan > abs(y / x)) //在1、3區域 { Ball.dx = -Ball.dx; } else //在2、4區域 { Ball.dy = -Ball.dy }
|
此方法在我看來復雜度還不算高,希望對大家有所幫助。本文絕對原創,由于作者是菜鳥,錯誤難免,歡迎高手指正。
原文轉自:http://www.anti-gravitydesign.com