论打砖块游戏中的碰撞检测

王朝other·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

论打砖块游戏中的碰撞检测

作者:李成竹

创作日期: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

}

此方法在我看来复杂度还不算高,希望对大家有所帮助。本文绝对原创,由于作者是菜鸟,错误难免,欢迎高手指正。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航