我正在做一个简单的固定射击游戏,类似于“ Galaga”,),这是我正在做的演示的一部分。我想知道人们会使用什么策略和数据结构来跟踪弹丸,例如从飞船发射的激光。我以前使用的一种超级简单的实现方式是将每个弹丸表示为一个点,并检查是否与场景中的所有对象发生碰撞。
但是,在有许多弹丸的大型场景中,这似乎很昂贵。我想知道这种用例还使用了哪些其他类型的策略或实现。FPS之类的游戏用于跟踪弹丸(子弹,坦克炮弹等)有什么作用?
我正在做一个简单的固定射击游戏,类似于“ Galaga”,),这是我正在做的演示的一部分。我想知道人们会使用什么策略和数据结构来跟踪弹丸,例如从飞船发射的激光。我以前使用的一种超级简单的实现方式是将每个弹丸表示为一个点,并检查是否与场景中的所有对象发生碰撞。
但是,在有许多弹丸的大型场景中,这似乎很昂贵。我想知道这种用例还使用了哪些其他类型的策略或实现。FPS之类的游戏用于跟踪弹丸(子弹,坦克炮弹等)有什么作用?
Answers:
对于非常快的弹丸(例如激光或子弹),可以使用Ray。
射线具有起点和终点。射线的(非常少的)数据结构是:
struct Ray
{
Vector3f start, end ;
} ;
看起来像这样:
(您也可以缓存方向矢量和长度,但是我在上面使用了一个非常简单的defn)。
如果射线是以光速传播的激光束,则只需将其保留(如从喷枪喷嘴处开始到墙的某处结束)几帧。每帧与射线相交的任何东西都会受到损害。
如果射线是较慢的射弹(例如,子弹),则射线对子弹在一个时间步上的行进距离进行建模。起点是射线在帧开始处的位置,终点是射线在帧完成后的位置。子弹射线中的任何东西都会被子弹损坏。
光线可以有效地与球体,aabbs,凸包等碰撞。检查我的Hullinator项目以获取实际运行的程序(CTRL +单击以发射光线)