回 帖 发 新 帖 刷新版面

主题:碰撞的问题

因为开始学windows编程了. 
我兴致勃勃的想试试编一个小型的RPG游戏.但遇到一个问题了.

假如有"多个"NPC人物(游戏里的由电脑控制的人), 怎么检测他们之间的碰撞呢?
我想到的方法有三个, 
1 建立一个二维数组, 有人物的坐标则标为1,无则标为0;
但有面临两个问题, 首先数组大小要和屏幕一样长宽, 不然人物行走就会一格格移动的感觉不流畅.其次走一次就得先把原地位置标0,再把目的地标1. (空间量挺大的,那如果是魔兽游戏,一次一群小兵出现的,这样一擦一写,最后还得判断,似乎挺麻烦的)

2 建立一维数组,该数组直接就只存贮那些NPC人物的坐标, 然后每次只需循环一次,判断数组里的坐标是否相碰.n个NPC共只需(n^2)/2次检验. 这样虽免去了"擦写"步骤,但只适用于少量的NPC. 如果像飞机那样的,不是....

3 不用数组了, 就用现在老师讲的一个对一个碰撞的函数, 其坐标以参数形式输入.但这样似乎就得一个个手写函数...(要是有函数数组...就...嘻...)

大家有没有什么好意见啊,或是其它好思路,请指教一下啊.
多谢大家.

回复列表 (共2个回复)

沙发

首先所有需要判断碰撞的对象生成包围盒。
把包围盒在轴上的投影排序,得到
A---+
| B-+--+
| | |  |    C---+
+-+-+  |    |   |
  |    |    +---+
  +----+
x方向的标记:
A开始, B开始, A结束, B结束, C开始, C结束
于是可以得到集合
{A,B}, {C}
不同集合内的2个元素是不相交的。C不可能与A,B相交。
同集合内的再按另一轴判断。
最终得到若干个小集合,它们之间是否碰撞用O(n^2)的也可以接受
这样使得整体复杂度降低为O(n logn)

另,参考
http://www.codercorner.com/Opcode.htm

板凳

2D用边界线就是预先些好边界数组。在那个坐标如果不能越过就设置一个值。移动得时候线检查是否是那个值在决定是否一定。
3D方法很多。不过最常用得是包围盒。盒提前预测。从目前移动方向你得到一个方向。检查所算一侦,如果下一针可能会撞到包围盒。那么不移动。反之移动,。很多得方法。自己多看看把

我来回复

您尚未登录,请登录后再回复。点此登录或注册