[心得] 高效的格子碰撞检测算法
以这段程序为例,从数组改为 vector 差不多使运行效率翻了一倍。 drawGrid 函数一点没变,它依旧用来画出网格。 check 函数是这个类对外交互的主要函数。其接收参数的类型是元素类型为 DisplayObject 的 vector。 选择 Displayobject 的原因是因为碰撞检测通常用于 Sprite,MovieClip,Shape 和Bitmap, 而这些类都继承自 Displayobject。Displayobject 也有x和y 两个位置属性。 所以要用自定义的对象时,请确保继承自 Displayobject。 函数一开始定义了一个名为_grid 的 vector,还有一个名为_checks 的 vector。 _grid 应该不陌生,但在实现上有点不同,这里用一维 vector 加索引技巧取代了二维数组。 因为这么做,可以使访问元素速度更快并减少了循环。等下会有详细介绍。 _checks 用来保存需要进行碰撞检测的对象。注意 CollisionGrid 类不处理具体的碰撞检测,它只 用来创建网格,分配对象,以及生成一组需要被检测的对象。具体的碰撞检测算法由你而定。 接着,check 函数对给定的 vector 进行遍历,把其中每个 Displayobject 都分配进网格。 |