• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-4-28 23:35 | 作者: 李成竹 | 来源: jdcb2001的专栏 | 查看: 278次 | 进入软件测试论坛讨论

领测软件测试网 MILY: 华文宋体; mso-bidi-font-size: 10.5pt">

作者最近在写一个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;

}

 

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   

}

 

 

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



延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

TAG: 游戏测试


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网