作者最近在写一个2D的类似《打砖块》的小游戏,由于是新手,在设计碰撞检测时遇到一些困难,于是上网搜索资料。可是折腾了半天也没有找到详细的介绍。现将自己苦想出来的方法贴出来,共大家参考。
问题涉及两个对象: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 }
|
此方法在我看来复杂度还不算高,希望对大家有所帮助。本文绝对原创,由于作者是菜鸟,错误难免,欢迎高手指正。
文章来源于领测软件测试网 https://www.ltesting.net/