- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java简单游戏开发之碰撞检测
前言
?????????????? ?? 不久之前在论坛上有人发贴,使用java编写的超级马里奥如何实现碰撞检测,笔者自己以前
???????????? 也做过Tank大战。里面同样涉及到碰撞检测,翻翻U盘里的东西还在,什么时候也给共享出来。
???????????? 这篇文章就简单游戏中的碰撞检测做一个简单的总结。首先需声明的是这里只是2D的碰撞检测。
??? 碰撞检测
???????????????? 对于形状之间如何来判断是否是碰撞的这要根据具体的形状来定。在新手练手的小游戏中,
??????????? 物体形状一般可以设定为矩形区域,这类规则图形。它的碰撞检测可以通过java API中的
????????????Rectangle类来实现碰撞的检测。
??????规则图形碰撞检测(Rectangle)
???????????????? 首先我们查看API关于Rectangle类的介绍:它就是指定坐标空间的一个区域,这个区域是通过
???????????? 指定左上角x、y坐标和去高度和宽度来确定的。
???????????????? 接下来看起具体的方法public?Rectangle?intersection(Rectangle?r),这个方法就是碰撞检测的
????????????? 关键了,如果两个Rectangle对象有交集,那么他们就有碰撞了。而每个形状我们都可以得到他们
????????????? 的Rectangle对象,这样图形的碰撞检测也就得以实现了。
????????????? ? ? ? ? ? ? ? ? ?? ??
????????????????? 看下具体实现源码:
?
/*?判断子弹是否击中障碍物?*/??
public?boolean?isHit(com.Alex.map.Map?map)?{??
????boolean?flag?=?true;//?代表没有撞到??
????//?分类别的得到所有的障碍物??
????ListStuff?stuffList?=?new?VectorStuff();??
????stuffList.addAll(map.getBricks());??
????stuffList.addAll(map.getIrons());??
????stuffList.addAll(map.getWaters());??
????for?(int?i?=?0;?i??stuffList.size();?i++)?{??
????????Stuff?a?=?stuffList.get(i);??
????????Rectangle?tankRectangle?=?new?Rectangle(bullet2.getRec());??
????????Rectangle?stuffRectangle?=?new?Rectangle(a.getX(),?a.getY(),?20,?20);??
????????if?(stuffRersects(tankRectangle))?{??
????????????flag?=?false;//?撞到了??
????????????break;??
??
????????}??
??
????}??
????return?flag;??
}??
?????????????? 上述这个例子就是判断Tank发出的子弹是否对地图中的障碍物有碰撞,如果有的话
?
????????? 就做相关的操作(子弹爆炸、障碍物消失)。上述代码中子弹对象有一个getRec()方法就是
????????? 得到子弹图形的Rectangle对象,具体实现就是根据其坐标和width、height来生成的。
?????????????? 采用此种方法进行碰撞检测需要注意,对于图片的实现处理应该尽量的去掉图标边角
????????? 的空白,不然实际效果可以产生肉眼可辨的误差。也就是说Rectangle尽量的包住图形
????????? 且Rectangle的区域尽量小。这种碰撞检测的方法被称之为多矩形碰撞。
?????????? ? ? ? ? ? ?? ???
????? ? ? ? ?? ? 一旦有一个矩形数组中的矩形与另外一个矩形数组的矩形发生碰撞就可认为发生了
??????????? 多矩形碰撞。其中多圆形碰撞也是同样的道理,只是包裹的图形区域是圆形罢了。
????????????不过仔细思考多矩形碰撞同样会有误差,虽然这种误差十分小。
??????????????? ?? ???
????????????????????
?????? 像素级别的碰撞检测
????????????????? ? ? ?? 像素级别的碰撞检测算得上是最精确的碰撞检测
文档评论(0)