Project1

标题: 小游戏模板·碰撞检测范例 [打印本页]

作者: Sion    时间: 2013-3-26 19:11
标题: 小游戏模板·碰撞检测范例
本帖最后由 Sion 于 2013-9-15 14:11 编辑

    本来是帮朋友写一个算法的,但是后来心血来潮,就写了这个小游戏。

    使用这个需要一些脚本基础,可以做一些弹幕游戏~
    不过里面有福利啦,进去玩就行啦。

下面是自己做的3个小游戏,没有什么创意内容,纯模仿罢了- -b

这个模仿了魔兽世界,法师职业的几个技能(已经好几年没玩了,不过有点怀念..):


另外两个嘛就是“是男人就撑30秒系列...”
射击(这个要撑30秒有点蛋疼了):

躲避(玩这个最好用鼠标,哈哈):



这个界面是用来测试代码效率的,运行时每一帧计算每一个物体是否与其他物体发生碰撞,碰撞的物体显示为红色。

有兴趣的朋友可以百度一下:四叉树 网格
如果你想用这个脚本,不懂的地方可以直接问我 :)

Scripts.rar (33.63 KB, 下载次数: 355)
新建工程,把这个解压到Data文件夹替换掉,之后运行工程就行了。
作者: 姬文翔    时间: 2013-3-26 22:54
好像很底层的样子。我试试去
作者: 九夜神尊    时间: 2013-3-26 23:59
这东西是带体积的对象管理器,用于管理平面内的对象。
适合做射击游戏,ARPG等等,比我写那个四叉树管理器强大多了。

此外,游戏蛮好玩。
作者: feizhaodan    时间: 2013-3-27 18:54
正好在做像素移动和碰撞的东西。学习了。
但是为什么每次出现让我很想研究的东西的时候都是有那么多作业的时候。。。
作者: hanzixiang    时间: 2013-4-21 06:33
有些看懂了 有些没看懂  本人 还处于 小白阶段 希望 楼主 可以讲解下 还有就是 可以吧脚本注释写详细些么
作者: 沉滞的剑    时间: 2013-4-21 09:35
仔细拜读了一遍,说一下自己的理解,还不是很充分请指正
首先是创建物体类,它们由中心定位。
然后创建四叉树,首先是整张地图,然后把每个区域按象限分成四个subtree,然后再继续分subtree直到深度达到预设为止。
然后遍历物体中心坐标,先判断他在supertree的象限,如果有subtree的话就就分给相对的subtree然后一直分到不可再分为止
找物体删除也是同样的方法
但是有几个地方还是不太清楚,
  1. def collide_targets_of(obj)
  2.     if @objects.include?(obj)
  3.       all_inside_objects - [obj]
  4.     else # 如果物体不属于该区域,则在其子区域中寻找碰撞目标
  5.       @objects + @sub_areas[in_which_area(obj)].collide_targets_of(obj)
  6.     end
  7.   end
复制代码
判断依据没有搞清楚,能解释下cache的用法么?

还有就是每新建1个碰撞对象类,就要写和其他所有类型匹配的函数对么?
那有没有可能有检测不规则像素块?比如说几个正方形对象的集合?会不会影响效率,怎么判断中心点?

作者: 6rp    时间: 2013-4-21 11:17
简单学习了一下四叉树的原理。 分割在很小的区块内,检测内部是否碰撞这点很好说,但是问题是,如果跨界的碰撞怎么办? 两个区块物理位置是相邻的,可是逻辑位置可能要在父辈、祖父辈等等才能联系起来,这个细节怎么处理的?
作者: Sion    时间: 2013-4-21 11:42
本帖最后由 Sion 于 2013-4-21 13:00 编辑
沉滞的剑 发表于 2013-4-21 09:35
仔细拜读了一遍,说一下自己的理解,还不是很充分请指正
首先是创建物体类,它们由中心定位。
然后创建四叉 ...


0、拜读不敢当,这些东西基本都是百度就能找到的...

1、如果不是最小子区域,区域的 @objects 就代表处于分割该区域十字上的物体。
因为物体是有体积的,位于区域十字上的物体被认为是有可能与该区域内的任何物体发生碰撞。

2、cache?是那个bitmap的缓存吗?就是默认系统提供的那个- -b

3、最好根据需要来建立模型,我现在做ARPG,人物模型都是全部用圆形,好处理,效果也不差。横版的话,我觉得用椭圆或者矩形比较好。计算两个不规则模型的碰撞太复杂,如果非要用复杂的模型,与它相碰撞的模型最好用简单的。两个椭圆的碰撞处理就已经非常复杂了。说实话这个玩意比较适合的是弹幕游戏,基本上只用计算点跟面的碰撞。如果进行面与面之间的碰撞检测,要消耗很多资源,随着物体数量的增加呈平方增长。一堆物体挤在一块的话,再优化也要卡- -b。当然,只是处理很少几个物体的话,模型复杂一点也不会卡的。

这个范例里因为是弹幕游戏,所以我偷懒了,每次判断都直接重置区域管理器,再把物体放进去。
后来做别的测试,因为物体碰撞以后又进行位置移动处理,然后再进行碰撞计算。像这样处理的话不但不精确,还变得很卡。
所以还是建议不要重置区域管理器,逐个对需要移动的物体进行 remove — 处理移动 — insert 这样的处理。
作者: 1073401157    时间: 2013-8-22 11:58
谢谢鸟!




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1