论打砖块游戏中的碰撞检测
作者:李成竹
创作日期:2005-8-24
作者最近在写一个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
}
此方法在我看来复杂度还不算高,希望对大家有所帮助。本文绝对原创,由于作者是菜鸟,错误难免,欢迎高手指正。