现在你已准备好去飞行,那让我们做一些过去小的游戏的变化,然后看看它的外观。
ResetGame方法创建纸飞机对象并存储它到一个称为_plane类级变量中,为了以后能方便的访问。创建相机后,在初始化后,是没有追踪对象的。因此,相机位置服从手动提供的转换而不是跟随飞机。
当工程运行后,初始化配置就出现了。房屋和飞机是可见的,但相机缓慢围绕场景。在游戏的CameraObject.Update函数中使用简单的旋转和转化矩阵来处理相机移动路径。
当玩家轻拍下屏幕,然而,我们激活了追踪摄像机。游戏类的Update方法中检查屏幕的轻拍,每一次发现,它都将增加下一次的4个相机配置。以下代码将描述如何激活追踪相机。
// Follow the plane from behind
Camera.ChaseObject = _plane;
Camera.ChaseDistance = 1;
Camera.ChaseElevation = 0.3f;
事实上所有所需的都将用这个方法设置给相机。唯一的变化是需要我们的CameraObject.Update函数:如果它检测到追逐相机是活动状态的(相机的ChaseObject不等于null),它简单调用基类,然后返回。任何相机代码的进一步的转换会干扰或整个代替相机自己的视角设置转换。
一旦如果你运行工程并轻拍屏幕,你将看到完全效果的追逐相机。在这个模式下的工程运行后的截图,如图所示。
第二次轻拍屏幕,相机就会回到飞机的前面,向后看。这是通过设置相机的ChaseDistance为负值来简单的实现(这个情况下为-1)。请记住,虽然飞机知道它的飞行路径并且在它的未来可以计算出坐标,但相机并不知道它的未来坐标,却任然正确的位于它前面位置。能够没有未来信息却能设置它的坐标是重要的,如果对象是玩家控制的,它将不可能预测出未来的移动。
第三次轻拍屏幕来激活最后的模式,它显示第一个人称相机,通过设置ChaseDistance为0来激活。这是一个我们必须要做的很小的改变为了将这个做的更好:直接将这个相机放到飞行位置导致一个飞行的前半部分的剪辑图片被渲染,这看起来很奇怪—对于第一人称相机,我们根本并不想去渲染飞行。
为了解决这个第一人称渲染问题,我们在PaperPlaneObject.Draw方法中做了小的改变。如果它检测到它是相机的ChaseObject并且相机的ChaseDistance为0时,它不会绘制而返回。
为了好玩些,我们可以添加一些其它的飞行物到场景中。