当安装好了VS 2008和XNA GameStudio 3.0后,我们就可以开始学习XNA了。
首先,在VS 2008中新建一个XNA GameStudio 3.0项目(选择Windows Game类型),会生成一个最简单的、可运行的游戏模板。
接下来我们将注意力转移到我们要剖析的重点—— 从Microsoft.Xna.Framework.Game继承的Game1类,其代码如下:
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager ( this );
Content .RootDirectory = " Content " ;
}
protected override void Initialize()
{
base .Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch (GraphicsDevice);
}
protected override void UnloadContent()
{
}
protected override void Update( GameTime gameTime)
{
if ( GamePad .GetState(PlayerIndex.One).Buttons.Back == ButtonState .Pressed)
this .Exit();
base .Update(gameTime);
}
protected override void Draw( GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
base .Draw(gameTime);
}
}
我们简单解释一下该类中所用到的重要类型。
GraphicsDeviceManager 图形设备管理器,用于访问图形设备的通道。
GraphicsDevice 图形设备。
Sprite 精灵,绘制在屏幕上的的 2D 或 3D 图像,比如游戏场景中的一个怪兽就是一个 Sprite 。
SpriteBatch 它使用同样的方法来渲染 一组 Sprite 对象。
而Microsoft.Xna.Framework. Game 这个基类就像是一个基础框架,它把整个游戏流程串联了起来,即,整个游戏会按如下流程运转。
该图中的五个方法正好对应着Game1类中的五个方法,它们的作用解释如下。
Initialize 方法用于初始化与游戏相关的对象,比如初始化图形设备、游戏环境设置等。
LoadContent 方法在 Initialize 方法之后调用,它用于加载游戏所需要的图形或其它素材,比如模型、图片、声音等。
Update 和 Draw 方法构成了 游戏循环 。
Update 方法用于改变和控制游戏的状态,主导着游戏逻辑的进行。
Draw 方法用于在屏幕上绘制我们的场景、 Sprite 。要注意的是,我们应该尽可能少的在 Draw 方法中处理游戏逻辑——它们应该在 Update 方法中被处理。 Draw 方法仅仅负责绘制。
Update 和 Draw 方法都接受一个 GameTime 类型的参数, GameTime 有什么作用了?这个参数可以帮助我们依据实际的游戏时间而不是处理器的速度来决定动画或其它事件的发生时刻。
在这个最简单的例子中,游戏将以默认的 60fps ( Frame/Second )运行。
UnloadContent 方法在游戏结束时被调用,该方法用于卸载在 LoadContent 方法中所加载的素材和那些需你要进行特别处理的善后事宜。
状态轮询与事件监听
写过 Windows 应用程序的朋友都知道,当用鼠标点击 Form 上的一个 Button 时,会触发一个 Click 事件,而我们的应用程序通过监听到事件的发生进而来处理事件。
而在游戏开发中,我们需要将我们的这种“事件”思维切换到“轮询”思维。也就是说,游戏中,用户的鼠标、键盘操作并不会触发相关的事件。如果是这样的话,那我们该如何知道用户是否按下了鼠标了?答案是我们需要在游戏循环中(确切的说是在 Update 方法中)不断地检测输入设备(比如鼠标)的状态来进行判断。
这就是轮询机制与事件机制的区别,也是游戏开发和普通 windows 应用开发需要转换思路的地方。
归根到底, windows 事件机制也是对轮询机制(即Windows消息循环)的一个封装 。
今天的介绍就到这里,下一节我们将介绍与渲染相关的基础知识。
最后,附上XNA GameStudio 3.0的下载地址: http://creators.xna.com/en-us/xnags_islive