Java简单游戏开发之碰撞检测_第1页
Java简单游戏开发之碰撞检测_第2页
Java简单游戏开发之碰撞检测_第3页
Java简单游戏开发之碰撞检测_第4页
Java简单游戏开发之碰撞检测_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、前言 不久之前在论坛上有人发贴,使用java编写的超级马里奥如何实现碰撞检测,笔者自己以前 也做过Tank大战。里面同样涉及到碰撞检测,翻翻U盘里的东西还在,什么时候也给共享出来。 这篇文章就简单游戏中的碰撞检测做一个简单的总结。首先需声明的是这里只是2D的碰撞检测。 碰撞检测 对于形状之间如何来判断是否是碰撞的这要根据具体的形状来定。在新手练手的小游戏中, 物体形状一般可以设定为矩形区域,这类规则图形。它的碰撞检测可以通过java API中的Rectangle类来实现碰撞的检测。规则图形碰撞检测(Rectangle) 首先我们查看API关于Rectangle类的介绍:它就是指定坐标空间的一个

2、区域,这个区域是通过 指定左上角x、y坐标和去高度和宽度来确定的。 接下来看起具体的方法publicRectangleintersection(Rectangler),这个方法就是碰撞检测的 关键了,如果两个Rectangle对象有交集,那么他们就有碰撞了。而每个形状我们都可以得到他们 的Rectangle对象,这样图形的碰撞检测也就得以实现了。 看下具体实现源码:1. /*判断子弹是否击中障碍物*/2. publicbooleanisHit(com.Alex.map.Mapmap)3. booleanflag=true;/代表没有撞到4. /分类别的得到所有的障碍物5. ListstuffL

3、ist=newVector();6. stuffList.addAll(map.getBricks();7. stuffList.addAll(map.getIrons();8. stuffList.addAll(map.getWaters();9. for(inti=0;istuffList.size();i+)10. Stuffa=stuffList.get(i);11. RectangletankRectangle=newRectangle(bullet2.getRec();12. RectanglestuffRectangle=newRectangle(a.getX(),a.getY(

4、),20,20);13. if(stuffRersects(tankRectangle)14. flag=false;/撞到了15. break;16. 17. 18. 19. 20. returnflag;21. 上述这个例子就是判断Tank发出的子弹是否对地图中的障碍物有碰撞,如果有的话 就做相关的操作(子弹爆炸、障碍物消失)。上述代码中子弹对象有一个getRec()方法就是 得到子弹图形的Rectangle对象,具体实现就是根据其坐标和width、height来生成的。 采用此种方法进行碰撞检测需要注意,对于图片的实现处理应该尽量的去掉图标边角 的空白,不然实际效

5、果可以产生肉眼可辨的误差。也就是说Rectangle尽量的包住图形 且Rectangle的区域尽量小。这种碰撞检测的方法被称之为多矩形碰撞。 一旦有一个矩形数组中的矩形与另外一个矩形数组的矩形发生碰撞就可认为发生了 多矩形碰撞。其中多圆形碰撞也是同样的道理,只是包裹的图形区域是圆形罢了。不过仔细思考多矩形碰撞同样会有误差,虽然这种误差十分小。 像素级别的碰撞检测 像素级别的碰撞检测算得上是最精确的碰撞检测方法了。 首先遍历算出一张位图所有的像素点坐标,然后与另外一张位图上的所有点坐标进行对比, 一旦有一个像素点的坐标相同,就立刻取出这两个坐标相同的像素点,通过位运算取出这两个 像素点的最高位(

6、透明度)进行对比,如果两个像素点都是非透明像素则判定这两张位图发生 碰撞。 介绍了像素碰撞之后可以得到两个结论: 1、像素碰撞很精确,不论位图之间是否带有透明像素,都可以精确判断; 2、正是因为像素碰撞的这种高精确判定,从而也会造成代码效率明显降低! 假设两张100100 大小的位图利用像素级检测碰撞,仅是遍历两张位图的像素点就要循环 1001002=20000 句逻辑代码;况且还要对筛选出来的相同坐标的像素点进行遍历对比其 透明值!这种效率可想而知! 当然,这里的像素碰撞只是大致提供一种思路,肯定还可以进行代码优化;但是不论再优的 代码,使用像素级进行碰撞检测终会导致整个程序的运行效率大大降

7、低。因此像素级别的碰 撞检测在游戏开发中是尽量避免使用的!规则图形碰撞检测2 对于子弹和障碍物的碰撞检测,采用上述第一种方法就可以简单的实现了,不过子弹是圆形的 有没有更加精确的碰撞检测方法呢?也就是实现圆形和矩形的碰撞检测嘛。 这里我们需要简单的运行下几何数学的知识,给个简单的图就会明白了。 小圆有个运动轨迹,轨迹的线如果和他对着的正方形的相对某一象限的边有焦点,那么 就能碰撞,边就是那一个象限的边(还要把圆半径算进去),具体代码就不实现了,读者可 自己尝试着去实现。不规则图形碰撞检测 这里直接转载一篇文章: 对于矩形碰撞,很多人都知道。但面对多边形图形,大多数采用多矩形覆盖的方式。 但是我

8、不是很喜欢这种方式,我所采用的是利用一个经典算法: SAT 一种可以快速检测不规则的凸多边形是否碰撞的算法 给出两个凸多边形体,如果我们能找到一个轴线,使两物体在此轴线上的投影不重叠,则这 两个物体之间没有发生碰撞,这个轴线叫做Separating Axis(红色轴线)。 对于2D来说,红色线就是垂直与多边形边的轴。 因此,如果我们要检查两多边形是否碰撞,就去检查两多边形在每个所有可能的轴上的投影 是否重叠。1. /检测2个矩形是否发生碰撞2. 3. /4. 5. /6. 7. publicstaticboolIsIntersect(Vector2A,Vector2B)8. 9. 10. 11

9、. Vector2AX,AY,BX,BY;12. 13. AX=newVector2();14. 15. AY=newVector2();16. 17. BX=newVector2();18. 19. BY=newVector2();20. 21. 22. 23. AX.X=A0.X-A1.X;24. 25. AX.Y=A0.Y-A1.Y;26. 27. AY.X=A0.X-A3.X;28. 29. AY.Y=A0.Y-A3.Y;30. 31. BX.X=B0.X-B1.X;32. 33. BX.Y=B0.Y-B1.Y;34. 35. BY.X=B0.X-B3.X;36. 37. BY.Y=B

10、0.Y-B3.Y;38. 39. /对于AX上:40. 41. if(Tmp(AX,A,B)returnfalse;42. 43. if(Tmp(AY,A,B)returnfalse;44. 45. if(Tmp(BX,A,B)returnfalse;46. 47. if(Tmp(BY,A,B)returnfalse;48. 49. returntrue;50. 51. 52. 53. 54. 55. privatestaticboolTmp(Vector2IS,Vector2A,Vector2B)56. 57. 58. 59. floatv=newfloat4;60. 61. for(inti=0;i4;i+)62. 63. 64. 65. floattmp=(IS.X*Ai.X+IS.Y*Ai.Y)/(IS.X*IS.X+IS.Y*IS.Y);66. 67. vi=tmp*IS.X*IS.X+tmp*IS.Y*IS.Y;68. 69. 70. 71. floatvv=newfloat4;72. 73. for(inti=0;iMath.Min(Math.Min(vv0,vv1),Math.Min(vv2,vv

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论