- 最后登录
- 2022-10-8
- 注册时间
- 2010-12-6
- 阅读权限
- 100
- 积分
- 14150
- 纳金币
- 76544
- 精华
- 23
|
步骤 4:添加互动功能和定义光线方向
YellowPlanet_04.as 包含本节描述的代码。
在本节中,你将学习一些用于将互动性引入到游戏的概念。
首先,让我们探讨一下游戏如何管理用户的输入。 Flare3D 包含一些你可以使用的工具,它们能够在游戏播放过程中快速地管理键盘和鼠标输入信息。
在该类中,Input3D.keyDown() 方法可以用于检测按下的键。该方法在按下一个键时将返回一个 ***e 值。此外,该工具还包含 Input3D.keyHit() 方法,它类似于keyDown,但只返回一次 ***e 值。
本范例项目中的另一个值得研究的有趣概念是光线的使用。光线是虚拟的并且长度无限,它可以从任一点开始沿着某个方向无限延伸。
在无限延伸之前,光线能够测试游戏中的一个对象是否相交。 如果测试的结果是可靠的,则光线将提供关于碰撞的附加信息,其中包括 mesh、碰撞的确切点、被碰撞面部的法线等信息。
本范例项目将使用光线效果,因为宇航员在保持与球形地面对齐的同时需要不断地在球形地面上奔跑。 光线用于完成两个任务(参见图9)。
图9. 光线能够将宇航员角色与 3D 环境的地面对齐
在本例中,环境的 stage 基本上是一个球体。 如有必要,你可以使用其它方法让宇航员保持与该球体对齐,但光线的作用很大,因为它们能够用于不均匀的表面。
使用 new RayCollision() 方法创建光线
使用下行代码创建一个新的 RayCollision:ray = new RayCollision();
使用 ray.addCollisionWith( object ) 方法添加对象以便对光线进行测试
下面代码将添加行星的地面以便利用光线测试碰撞效果:ray.addCollisionWith( planet.getChildByName( "floor" ), false );
第二个参数("false")表示只能利用地面检测碰撞(丢弃地面的child)。 使用 ray.test( from, direction ) 方法测试光线碰撞通过在光线起始的位置设置一个点开始测试。 这一位置应该不会与宇航员的位置完全一致,因为它与地面如此靠近,以致光线无法与任何物体相交。 相反,设置一个位置稍高的点,例如 (0,100,0),然后使用 localToGlobal 将该点转换为世界坐标(world coordinate)。在定义光线起始点之后,下一个任务是为它提供方向。 该方向应该向下指向宇航员的方向。 你可以使用 Pivot3D 的 getDown() 方法获取该矢量。
//define ray’s start pointvar from:Vector3D = container.localToGlobal( newVector3D( 0, 100, 0 ) );//define ray’s directionvar dir:Vector3D = container.getDown();// Test the ray.if ( ray.test( from, dir ) ){ // ray collision is ***e. …使用收到的碰撞信息在上节中,你已经了解如何测试何时光线碰撞返回 ***e 值。 光线碰撞信息已经可用并且你可以将它用于游戏逻辑。 该信息是以特定的结构储存的。 你可以使用 CollisionInfo 对象来解析收到的信息。在下面代码中,注意一下你如何才能获取位置 (info.point.x、info.point.y、info.point.z) 和标准方位 (info.normal) 信息。
// Test the ray.if ( ray.test( from, dir ) ){ // Get the info of the first collision. var info:CollisionInfo = ray.data[0]; // Set the astronaut container at thecollision point. container.setPosition( info.point.x,info.point.y, info.point.z ); // Align the astronaut container to thecollision normal. container.setNormalOrientation( info.normal,0.05 );
|
|