论打砖块游戏中的碰撞检测 - oop.com.cn 测试 游戏 - 面向对象技术开发

面向对象技术开发

会员投稿 投稿指南 站长资讯通告:
您的位置: 首页 > 测试技术 > 游戏测试 > 正文

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

来源: www.bianceng.cn 阅读:

MILY: 华文宋体; mso-bidi-font-size: 10.5pt">

作者最近在写一个2D的类似《打砖块》的小游戏,由于是新手,在设计碰撞检测时遇到一些困难,于是上网搜索资料。可是折腾了半天也没有找到详细的介绍。现将自己苦想出来的方法贴出来,共大家参考。

问题涉及两个对象:Ball and Brick

描述如下:

 

clearcase /" target="_blank" >ccff; MARGIN: auto 6.75pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-table-lspace: 9.0pt; mso-table-rspace: 9.0pt; mso-table-anchor-vertical: paragraph; mso-table-anchor-horizontal: margin; mso-table-left: left; mso-table-top: -.9pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 align=left border=1>

struct Ball

{

       int X;

       int Y;

       int Radius;

       int dx;

int dy;

}

 

struct Brick

{

       int X;

       int Y;

       int Width;

       int Height;

}

 

XY是球或砖块的中心

相对于背景坐标

                                                  

 

 

 

 

 

 

 

根据小球撞击砖块的各种可能性,建立如图坐标系。

              \

令外围矩形的长宽分别为WIDTHHEIGHT 

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;

 

大矩形被对角线分成1234四个区域,可近似认为小球球心位于哪个区域就是碰撞的砖块的哪个面。所以,当球心与原点连线与X轴夹角的绝对值小于θ时,小球碰撞垂直表面;大于θ时,碰撞水平表面。代码如下:

float tan = HEIGHT / WIDTH;//tanθ的值

 

if(x == 0)//x=0时,tanθ→∞

{

       Ball.dy = -Ball.dy;

}

else if (tan > abs(y / x))  //13区域

{

       Ball.dx = -Ball.dx;

}

else  //24区域

{

       Ball.dy = -Ball.dy   

}

 

 

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



Tags:
相关文章列表:
热门排行