XNA那些事(一) 框架工作原理
一直想写一部有关XNA的全面性介绍的博客,前些日子比较忙,正好最近我有一定自己的时间可以写点东西,那么就开始了。
之所以把这个系列名的名字定为XNA那些事,是因为从我这段学习XNA的过程中我感觉他是目前为止相当简明易懂容易入门的游戏开发框架,如果你愿意从事游戏开发那么接下来的内容你肯定不容错过。如果你没有正版VS2010的话那么下面的体验版或者你可以考虑http://www.microsoft.com/express/vcsharp/
还有就是XNA的CREATOR地址为 http://creators.xna.com/en-US/downloads至于版安装我就不介绍了。非常简单NEXT就可以。
一 首先介绍一下XNA相关的资料,在这里我必须说目前有关XNA的中文资料少之又少,这是个难点但也是个机会,以XNA的发展势头在国内流行势不可挡,如果你现在可以切入那么对于你今后的发展也是一个非常好的机会。
http://blogs.msdn.com/b/xna/ XNA TEAM的官方博客非常的精典。
http://msdn.microsoft.com/en-us/aa937791 MSDN的业界动态
再推荐两位微软MVP的BLOG
http://blogs.msdn.com/b/shawnhar/
http://blogs.msdn.com/b/nicgrave/
二 然后比较下XNA与DX之间的异同:
1.XNA把软件开发人员从复杂的C/C++特性当中解放出来
2.XNA与DX在建模与渲染的思想上没有任何本质变化
三 XNA的工作机制
§1.所有游戏需要从GAME类继承,并在构造函数内做基本对象初始化的工作
§2.在重载的LoadContent函数内载入声音、图像等资源。
§3.框架会不断的调用Update和Draw函数。
§4.Update函数会传递玩家的按键及游戏的运行状态等信息,而Draw函数会根据Update更新后的状态绘制整个场景。
在这里用这个流程图表就是这样
在这里我必须要解析一下这个框架的工作原理,XNA与WINFORM等应用框架最大的不同就是他不是驱动中断的方式来处理用户输入而是轮循用户输入等事件,换句话说在UPDATE当中你需要自行取得目前用户的输入信息而不是等着直到有了输入再处理,这个原因很简单,因为游戏制作其实是在做电影,要一帧帧的做,那么对不起不管用户有没有输入这个电影还是要不断的DRAW下去,所以这也就不难解释框架轮循的意义了。
其实学习这个框架很简单,只要你新建一个工程选择XNA GAME STUDIO 4.0的项目那么VS2010自动生成的代码其实就把这个框架的工作原理说得比较清楚了。
Program.csGame1的新对象,并且执行了它的Run()方法。
Game1.cs当中代码:
public class Game1 : Microsoft.Xna.Framework.Game////首先从GAME类继承
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);//GraphicsDeviceManager代表了机器上实际的图形设备,类似于WIN32当中的DC。
Content.RootDirectory = "Content";
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
public Game1()
{
graphics = new GraphicsDeviceManager(this);//GraphicsDeviceManager代表了机器上实际的图形设备,类似于WIN32当中的DC。
Content.RootDirectory = "Content";
protected override void LoadContent()//重要的函数用于调入资源,
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);//这是一个您将用来绘制精灵所必须的对象
// TODO: use this.Content to load your game content here
}
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);//这是一个您将用来绘制精灵所必须的对象
// TODO: use this.Content to load your game content here
}
protected override void Update(GameTime gameTime)//轮循用户输入状态,gameTime变量传入游戏运行的时间信息
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();//这行代码的意义就是当用户按下了BACK键,那么游戏退出
base.Update(gameTime);
}
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();//这行代码的意义就是当用户按下了BACK键,那么游戏退出
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)//更新游戏的画面
{
GraphicsDevice.Clear(Color.CornflowerBlue);//这行代码就是用Color.CornflowerBlue这个颜色清理整个背景
// TODO: Add your drawing code here
base.Draw(gameTime);
}
你可以运行一下游戏,当然只有一个背景在这上面,如果按下BACK键那么就退出了,虽然程序很简单但是对于框架的学习还是很好的例子。以上就是有关XNA框架的工作原理了,我基本能保证一周一次的博客更新,下周咱们就深入一下2D的游戏开发从精灵开始讲起。