XNA基础(01) —— 游戏循环
当安装好了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