打开初始化的项目后,可以明显看到一大堆文件,游戏的真正核心在于Game1.cs文件。这个文件里面有好几个初始定义函数,下面开始介绍。
文件的主要内容为:
namespace Game1
{
/// <summary>
/// 这是游戏的主类型
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
/// <summary>
/// 允许游戏在开始运行之前执行其所需的任何初始化。
/// 游戏能够在此时查询任何所需服务并加载任何非图形
/// 相关的内容。调用 base.Initialize 将枚举所有组件
/// 并对其进行初始化。
/// </summary>
protected override void Initialize()
{
// TODO: 在此处添加初始化逻辑
base.Initialize();
}
/// <summary>
/// 对于每个游戏会调用一次 LoadContent,
/// 用于加载所有内容。
/// </summary>
protected override void LoadContent()
{
// 创建新的 SpriteBatch,可将其用于绘制纹理。
spriteBatch = new SpriteBatch(GraphicsDevice);
// TODO: 在此处使用 this.Content 加载游戏内容
}
/// <summary>
/// 对于每个游戏会调用一次 UnloadContent,
/// 用于取消加载所有内容。
/// </summary>
protected override void UnloadContent()
{
// TODO: 在此处取消加载任何非 ContentManager 内容
}
/// <summary>
/// 允许游戏运行逻辑,例如更新全部内容、
/// 检查冲突、收集输入信息以及播放音频。
/// </summary>
/// <param name="gameTime">提供计时值的快照。</param>
protected override void Update(GameTime gameTime)
{
// 允许游戏退出
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
// TODO: 在此处添加更新逻辑
base.Update(gameTime);
}
/// <summary>
/// 当游戏该进行自我绘制时调用此项。
/// </summary>
/// <param name="gameTime">提供计时值的快照。</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: 在此处添加绘图代码
base.Draw(gameTime);
}
}
}
可以留意到代码中有好几个函数以及一些很有用的注释,而XNA中一个游戏的生命周期如下:
![](https://img-my.csdn.net/uploads/201303/04/1362370971_8733.png)
Initialize方法被用来初始化变量和其它与Game1对象相关的对象。
LoadContent方法在Initialize方法之后被调用,另外在任何需要重新载入游戏图形内容的时候也会被调用。在LoadContent中,将会载入游戏所需要的一切图形及其他内容,包括图像、模型和音效等。
Update和Draw方法在LoadContent方法之后被循环反复调用,进入游戏循环阶段。游戏运行需要的一切逻辑变化和实现都应该放在Update方法中实现,而Draw方法应该尽量做最少的事情,即仅包括图形的绘制。
UnloadContent用来卸载所有在LoadContent方法里加载且需使用特殊手段进行卸载的内容。Update被调用之后有两种结果,一个是在游戏中继续循环,然后调用Draw方法;而另一个是游戏结束,退出游戏循环,并调用UnloadContent方法。
游戏开发和程序开发之间存在的一个关键差异是轮询和事件注册。一般程序是采取事件驱动的方式来处理逻辑,即在用户操作(例如点击某个按钮)致使系统产生一个能够被程序捕获的事件之前,程序不会做任何事。而游戏则是由事件轮询驱动,即游戏并不是在等待并监听是否有事件被激活,而是会主动询问某些事件是否发生,同时游戏会一直运行。