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-2 天空盒

注意天空盒使用的纹理必须连续否则玩家很容易觉察到盒子的边缘。

使用天空盒的优点是它很容易构建,只用到12个三角形。

天空球(SkyDome)

在天空球中,天空是一个使用了一张纹理的半球,位于场景上方。图12-3显示了天空球的网格模型。

图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

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号