- 最后登录
- 2022-10-8
- 注册时间
- 2010-12-6
- 阅读权限
- 100
- 积分
- 14150
- 纳金币
- 76544
- 精华
- 23
|
步骤5: 检测与障碍物之间的冲突
YellowPlanet_05.as 包含本节描述的代码。
SphereCollision 是一款用于处理复杂几何图形碰撞的工具。 它本质上是一个与一个或多个 mesh 对象碰撞和相互作用的虚拟球体(参见图10)。
图10. SphereCollision 在游戏中碰撞 mesh 对象
本范例游戏使用 SphereCollisions 以便使得宇航员能够与行星周围的墙和障碍物碰撞。 通过使用 SphereCollision,你可以将宇航员包裹于虚拟球体之后以便与游戏环境碰撞。
此外,该 SphereCollision 工具在碰撞发生时还能够提供一段平滑的位移,这一情形被称为滑块(slider)。
下面步骤描述如何使用 SphereCollision 类:
1.创建一个 SphereCollision 实例,然后将球体目标和一个半径值传递给它。
2.使用 collisions.addCollisionWith( object ) 方法添加对象以便对球体进行测试。
3.通过调用 collisions.slider()、collisions.fixed() 或collisions.intersect() 方法更新碰撞。
4.在碰撞发生之后,你可以根据需要访问和使用相应的碰撞信息。
注: RayCollision 和 SphereCollision 均是计算强度很大的数学算法,因此最好尽可能与较少多边形对象一起使用。 由于这些工具需要完成如此复杂的数学公式计算,所以你必须注意到在以调试模式或发布模式下运行项目时存在的显著性能差异。
此外,SphereCollision 不能处理缩放的对象,因此在游戏中处理它们之前,必须对你的碰撞对象进行标准化处理。 使用 SphereCollision (source, radius, offset) 方法创建球体碰撞效果
首先,必须声明相应的碰撞对象,如下所示:
// The instance for the SphereCollision.private var collisions:SphereCollision;
其次,你可以通过将宇航员用作一个半径为 3 个单位的目标创建相应的 SphereCollision 。 记住,在步骤 3 中,宇航员被放置于一个名称为 "container" 的 Pivot3D 对象中(参见图11)。
图11. SphereCollision 球体将宇航员角色包裹起来
在默认情形下,虚拟球体将位于坐标轴的中心。 在本范例中,宇航员的坐标是在他的脚上,因此你需要为虚拟球体提供一个偏移量,它是位于 (0,3,0) 的第三个 Vector3D 参数,如图11所示。
collisions = new SphereCollision( container, 3,new Vector3D( 0, 3, 0 ) );
如果你记得步骤 3 的"查看宇航员(Astronaut)容器",你知道宇航员角色是包裹于一个容器之中的。 现在,该是说明原因的时候了。宇航员具有跳跃的能力。 因此,在某些情形下,该角色能够跳过风扇以避免一次必然的死亡。 但宇航员不一定能够跳过大楼等障碍物。此时,你可以检测到宇航员和障碍物之间的碰撞。 如果宇航员跳过障碍物,则绝不会下发碰撞事件。 因此,SphereCollision 将被添加到容器中,而不是宇航员。 之后,当宇航员跳起时,球体仍然处于底部并且能够检测到碰撞事件(参见图12)。 图12. 当宇航员跳起时,SphereCollision 仍然在容器中保持不变以便允许利用
其它元素进行碰撞检测—即使该角色位于元素之上添加与障碍物的碰撞一旦创建相应的碰撞,你必须指定需要核查的对象。 在本范例游戏中,这些对象(Pivot3D 对象)的每个对象均被称为 "obstacle",因此你需要为每个对象添加一个碰撞事件。
if ( pivot.name == "obstacle" ){ // If the object is an obstacle, add it tothe collisions list. collisions.addCollisionWith( pivot, false );}
一旦你移动宇航员,所有的碰撞事件均被测试。 updateEvent() 函数包含下面代码行:collisions.slider();
如果宇航员与一个障碍物发生碰撞,则该方法将产生一段位移以便确定相应的交点并且将宇航员重新定位到 scene 的正确位置。 这样可以避免出现导致宇航员被粘连在一个单一位置以及看似被冻结在scene 中的问题。
|
|