12.3 从游戏引擎(GameBase)开始
首先创建游戏引擎,然后是游戏玩法。先创建一个叫做XNA TPS的Windows Game项目,在这个项目中,建立GameBase,GameLogic和Helpers文件夹,这些文件夹能将你的代码分成不同的部分。除了代码,还要将游戏素材导入到Content中。
你已经在第9,10,11章完成了游戏引擎的大部分工作,只需将这些类添加到GameBase 命名空间即可。
12.3.1 相机,灯光和变换
你已在第9章创建了Cameras,Lights和Transformation类。要将这些类添加到项目中,你需要在GameBase目录中创建Cameras和Lights目录,并将camera和light类放至对应的目录中,而Transformation类放至GameBase目录。
12.3.2 地形
你已经在第10章创建了Terrain类和它的effect和material类。要将这些类添加到项目中,你需要建立Shapes,Materials和Effects目录,然后将Terrain类添加到Shapes目录,TerrainEffect 类添加到Effects目录,所有material类添加到Materials目录。你还需将Terrain类用到的VertexPositionTangentBinormal类添加到Helpers目录。
最后添加地形素材(高度图,纹理和effects)到Content中。要添加这些素材,你需要创建一些文件夹:Terrains文件夹用来存储高度图;Textures文件夹用来存储纹理;Effects文件夹用来存储effects。在添加完这些素材之后,别忘了将高度图的属性中的Build Action从None和Copy to Output Directory变成Copy if Newer。
12.3.3 Animated Model
你已经在第11章创建了动画模型处理器、content library、runtime类和effects。不过无需将动画模型处理器和content library添加到XNA TPS解决方案,只需添加对它们的引用。要做到这点,你需要在XNA TPS项目中添加content library的引用,找到AnimatedModelContentWin binary (在AnimatedModelContentWin/bin/x86/Release/AnimatedModelContentWin.dll)。在Content中 (在XNA TPS项目中)添加对动画模型处理器的引用,找到AnimatedModelProcessorWin binary (在AnimatedModelProcessorWin/ bin/x86/Release/AnimatedModelProcessorWin.dll)。之后将AnimatedModel和AnimatedModelEffect类添加到XNA TPS项目中,将AnimatedModel类放入Shapes文件夹,AnimatedModelEffect类放入Effects文件夹。
最后你需要将动画模型素材 (模型,纹理和effects)添加到XNA TPS Content中project。在Content中,你只需新建一个叫做Models的文件夹放置所有的动画模型文件。将effect文件放入Effects文件夹,纹理文件放入Textures文件夹。最后别忘了将模型动画的处理器改成 animated model processor。
12.3.4 天空
在游戏中,天空用于创建覆盖场景的背景,而且天空盒还能帮助玩家的定位。注意这里我们谈论的天空盒是指玩家周围的所有场景。创建场景的一个办法是绘制不同的对象,并把它们放置在离玩家很远的地方。但是,在实时环境下绘制这些物体非常耗费资源,而且这些物体放在如此远的地方也无法表现出细节。
游戏设计师通常采用的方法是创建一个覆盖全部场景的模型,这个模型可以是一个立方体,叫做天空盒SkyBox;或一个半球,叫做SkyDome;或其他任何形状的模型。围绕在玩家周围的场景存储在纹理中。为了实现无限远的效果,相机总是放置在天空的中心。
天空盒(SkyBox)
在天空盒中,天空盒是一个盒子,包含六个面,每个面具有不同的纹理。这个盒子覆盖所有场景,所有面都指向立方体内部——因为你是从内部观察立方体而不是外部。图12-2显示了天空盒的构造。
图12-2 天空盒
注意天空盒使用的纹理必须连续否则玩家很容易觉察到盒子的边缘。
使用天空盒的优点是它很容易构建,只用到12个三角形。
天空球(SkyDome)
在天空球中,天空是一个使用了一张纹理的半球,位于场景上方。图12-3显示了天空球的网格模型。
图12-3 一个天空球的网格模型
使用天空球的优点是它易于产生纹理动画。例如,你可以使用两个纹理,第一张用于背景,第二张用于层效果,例如移动的云。天空球的缺点是它使用的多边形比天空球多。
12.3.5 创建一个SkyDome类
本游戏实用天空球绘制场景。SkyDome是一个3D模型,事先在建模工具中制作好并导入到素材管道。这个模型使用XNA的Model类加载和处理。注意也可以动态生成天空模型而不是事先加载。
本节你将新建一个类加载,更新,绘制天空模型:SkyDome类,你应在Shapes目录中放置这个类。
加载天空球
因为SkyDome是一个XNA Model,所以只需实用素材管理器加载即可。下面的代码是 SkyDome类的Load方法:
public void Load(string modelFileName) { model = Content.Load<Model>(GameAssetsPath.MODELS_PATH+ modelFileName); }
更新天空球
当天空更新时,你需要将它的中心位置移至相机位置,保证相机处在天空球的中心。你也可以让天空模型绕着Y轴平滑旋转,产生围绕玩家水平移动的效果。下面的代码是SkyDome 类的Update方法:
public override void Update(GameTime time) { BaseCamera camera = cameraManager.ActiveCamera; // Center the camera in the SkyDome transformation.Translate = new Vector3(camera.Position.X, 0.0f, camera.Position.Z); // Rotate the SkyDome slightly transformation.Rotate += new Vector3(0, (float)time.ElapsedGameTime.TotalSeconds * 0.5f, 0); base.Update(time); }
绘制天空球
SkyDome模型使用BasicEffect绘制,但在绘制模型之前,你需要设置它的effect。首先,设置纹理(这是必须的,因为天空模型没有包含纹理)。然后,设置世界矩阵和相机的视矩阵和投影矩阵。最后,绘制模型。注意在绘制模型前必须关闭深度缓冲,因为天空是最远的物体所以你没有必要存储它的深度值。如果你没有关闭深度缓冲,那么在绘制较远的物体时会出现错误。下面是SetEffectMaterial和Draw方法的代码:
private void SetEffectMaterial(BasicEffect basicEffect) { BaseCamera activeCamera = cameraManager.ActiveCamera; // Texture Material basicEffect.Texture = textureMaterial.Texture; basicEffect.TextureEnabled = true; // Transformation basicEffect.World = transformation.Matrix; basicEffect.View = activeCamera.View; basicEffect.Projection = activeCamera.Projection; }
public override void Draw(GameTime time) { GraphicsDevice.RenderState.DepthBufferEnable = false; foreach (ModelMesh modelMesh in model.Meshes) { // We are only rendering models with BasicEffect foreach (BasicEffect basicEffect in modelMesh.Effects) SetEffectMaterial(basicEffect); modelMesh.Draw(); } GraphicsDevice.RenderState.DepthBufferEnable = true; base.Draw(time); }
发布时间:2009/5/20 下午1:17:15 阅读次数:6572