我原来就看过一些关于2D游戏碰撞检测的文章,今天又看过牛阿牛-野狼穴发表的随笔,实在是憋不住了,发表一点自己的见解,如果有错误还希望大家指出。(我不知道这种方法是否有人使用过,至少我没看见过类似的文章)
以前看到的文章都是写那些简单碰撞的文章,比如两个圆形的子弹相碰、圆形的子弹和方形、三角形的飞机相碰等等,这些碰撞的检测自然不是很复杂,用简单的数学知识就能搞定;但是像那些复杂的几何图形这个方法就不好用了,也许需要写上一大堆的方程来进行计算,而且很可能会影响到整个程序的效率。
有一天我和一位研究过编程的同学在一起,顺便问了一下,他开玩笑的说,用眼睛看呗。当时我灵光一闪,是啊,为什么非要用数学方法呢?通过一段时间的考虑,我想出了一个检测小物体和形状复杂的物体间碰撞的方法。
比如,在屏幕上有一个五角星形状的物体,还有一颗圆形的子弹(大小可以忽略的那种),要检测它们是否发生了碰撞,可以先将五角星绘制在屏幕上(假设背景为黑色,五角星不带黑色),然后取得子弹的当前坐标,判断屏幕上该处的颜色值,如果为黑色,就证明子弹没有撞上五角星,反之则证明两者相撞。
但是后来我想,这个方法的可行性还是很差的,因为游戏的背景通常是经过多种渲染的,不可能为单一的颜色,于是我就此问题对这个方法进行了改进。
我们可以另建一个绘图屏幕,取用单一的背景色,绘制五角星的时候对两块区域进行相同的操作,这样碰撞的检测就不会有问题了。
基于这个思想,我们还可以做更多的改进,比如绘制到后台屏幕时,黑白两色就可以搞定,这样可以节省空间;或者对于不同的对象用不同的颜色,在碰撞检测的同时就能知道是哪个对象触发了碰撞事件。
对于两个复杂图形的碰撞问题,可以用相似的方法进行扩展,相信大家能想出高效的算法。
posted on 2005-03-16 19:37 咸蛋的Blog 阅读(5449)
评论(17) 编辑 收藏
Feedback
2005-03-17 23:51 |
对于子弹比较大的情况,在游戏设计时可以专门为飞机画一张掩图。
2005-06-10 19:07 |
呵呵,看来我们都是学OI的,但都去高考了~
你说的这个象素判断法,在一屏时应该很好用吧
我却老想着用凸包去算物体扫过的面积,复杂化了~~
2005-10-25 11:40 |
好贴,多谢了,希望多些这样的贴 :)
2006-07-15 21:15 |
你的这个说法,以前也看人提过。
不过,一般游戏里并不用检测复杂的多边体,而是简化模型的。
而且这种检测是不连续检测,会导致穿透而不碰撞。
2007-10-10 12:23 |
这种检测连续的话,时间复杂度是不可忍受的,
ps:不知道vc中有没有boolean类型,用boolean的话还可以减小空间复杂度
2007-11-15 23:57 |
先判断矩形是否重叠,
然后判断各个矩形的重叠区域的各自颜色值是否为各自的背景色.
重叠区域可以被认为是很小的,所以计算量也不会太大.
2007-12-23 00:17 |
你的想法是不错的,但是很多问题要解决啊。
1. 图像重叠
2. 碰撞精确度
2008-09-28 23:36 |
颜色碰撞的原理是取角色的图片像素和当前想碰撞场景的蒙板中的像素进行"或"运算,如果结果全0表示发生碰撞,否则表示正常。