posts - 17,  comments - 226,  trackbacks - 1
<2010年3月>
28123456
78910111213
14151617181920
21222324252627
28293031123
45678910

留言簿(0)

随笔档案

文章档案

搜索

最新评论

  • 1. sfwwbnwi
  • --sfwwbnwi
  • 2. re: 2D游戏碰撞检测之我见
  • 有想法是不错,可惜有错误。如果子弹速度很快,在2帧之间距离大,直接跳过了阻挡体,怎么办?
  • --cc
  • 3. clopidogrel
  • Human beings have an inalienable right to invent themselves.
  • --clopidogrel
  • 4. lipitor nargol liege
  • Patriotism is your conviction that this country is superior to all other countries because you were born in it.
  • --lipitor nargol liege
  • 5. calan
  • Never eat more than you can lift.
  • --calan
  • 6. diamox
  • The most beautiful adventures are not those we go to seek.
  • --diamox
  • 7. xanax side effects
  • Keep cool and you command everybody.
  • --xanax side effects
  • 8. vjgqqmqm
  • --vjgqqmqm
  • 9. ampicillin
  • When you encounter difficulties and contradictions, do not try to break them, but bend them with gentleness and time.
  • --ampicillin
  • 10. valium
  • A large income is the best recipe for happiness I ever heard of.
  • --valium

阅读排行榜

评论排行榜

我原来就看过一些关于2D游戏碰撞检测的文章,今天又看过牛阿牛-野狼穴发表的随笔,实在是憋不住了,发表一点自己的见解,如果有错误还希望大家指出。(我不知道这种方法是否有人使用过,至少我没看见过类似的文章)

以前看到的文章都是写那些简单碰撞的文章,比如两个圆形的子弹相碰、圆形的子弹和方形、三角形的飞机相碰等等,这些碰撞的检测自然不是很复杂,用简单的数学知识就能搞定;但是像那些复杂的几何图形这个方法就不好用了,也许需要写上一大堆的方程来进行计算,而且很可能会影响到整个程序的效率。

有一天我和一位研究过编程的同学在一起,顺便问了一下,他开玩笑的说,用眼睛看呗。当时我灵光一闪,是啊,为什么非要用数学方法呢?通过一段时间的考虑,我想出了一个检测小物体和形状复杂的物体间碰撞的方法。

比如,在屏幕上有一个五角星形状的物体,还有一颗圆形的子弹(大小可以忽略的那种),要检测它们是否发生了碰撞,可以先将五角星绘制在屏幕上(假设背景为黑色,五角星不带黑色),然后取得子弹的当前坐标,判断屏幕上该处的颜色值,如果为黑色,就证明子弹没有撞上五角星,反之则证明两者相撞。

但是后来我想,这个方法的可行性还是很差的,因为游戏的背景通常是经过多种渲染的,不可能为单一的颜色,于是我就此问题对这个方法进行了改进。

我们可以另建一个绘图屏幕,取用单一的背景色,绘制五角星的时候对两块区域进行相同的操作,这样碰撞的检测就不会有问题了。

基于这个思想,我们还可以做更多的改进,比如绘制到后台屏幕时,黑白两色就可以搞定,这样可以节省空间;或者对于不同的对象用不同的颜色,在碰撞检测的同时就能知道是哪个对象触发了碰撞事件。

对于两个复杂图形的碰撞问题,可以用相似的方法进行扩展,相信大家能想出高效的算法。

posted on 2005-03-16 19:37 咸蛋的Blog 阅读(8001) 评论(20)  编辑 收藏
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]