XNA是Microsoft为了简化游戏编程,而向公众推出的一个游戏开发框架。
详细的介绍以及教程请到
微软官方站点 http://creators.xna.com/en-US/
或者
不错的中文站点:http://xna.omgsoft.com.cn/ 了解。
本文假定读者已经对编程有了初步的了解,只讲解一下XNA相关的东西。
大家一步步跟我做:
先从官网下载 xna开发包,以及C# express 2008,安装好后就可以开始了。
我自己用的是 XNA Game Studio 3.1 和 C# express 版本。
一、新建工程
我们选择Windows Game(3.1),OK
打开项目工程,我们主要留意其中的Content文件夹以及Game1.cs和Program.cs文件。
Program.cs文件内容如下:
- using System;
- namespace WindowsGame3
- {
- static class Program
- {
- /// <summary>
- /// The main entry point for the application.
- /// </summary>
- static void Main(string[] args)
- {
- using (Game1 game = new Game1())
- {
- game.Run();
- }
- }
- }
- }
说明Program.cs文件只是个入口函数,这个是不用更改的,自己的编程还是放在Game1.cs中。 默认Game1.cs如下:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using Microsoft.Xna.Framework;
- using Microsoft.Xna.Framework.Audio;
- using Microsoft.Xna.Framework.Content;
- using Microsoft.Xna.Framework.GamerServices;
- using Microsoft.Xna.Framework.Graphics;
- using Microsoft.Xna.Framework.Input;
- using Microsoft.Xna.Framework.Media;
- using Microsoft.Xna.Framework.Net;
- using Microsoft.Xna.Framework.Storage;
- namespace WindowsGame3
- {
- public class Game1 : Microsoft.Xna.Framework.Game
- {
- GraphicsDeviceManager graphics;
- SpriteBatch spriteBatch;
- public Game1()
- {
- graphics = new GraphicsDeviceManager(this);
- Content.RootDirectory = "Content";
- }
- protected override void Initialize()
- {
- // TODO: Add your initialization logic here
- base.Initialize();
- }
- 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
- }
- protected override void UnloadContent()
- {
- // TODO: Unload any non ContentManager content here
- }
- 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);
- }
- }
- }
为了观察方便,我删去了大部分注释。
我们可以看到Game1 继承自 Microsoft.Xna.Framework.Game
我们可以发现重载的函数为 Initialize(), LoadContent(), UnloadContent(), Update(GameTime gameTime), Draw(GameTime gameTime)
我们先了解一下通常的游戏编程,
游戏与普通应用程序不用,游戏要时时刻刻有个东西在后台工作,计算,所以游戏中有一个主循环,
第一次启动的时候,要先加载资源,比如图片、声音什么的,
然后每一次刷新的时候,要先进行相关角色动画计算,碰撞检测等等,
最后再把图像渲染出来,
然后再次循环。
所以顾名思义,XNA的函数从名字上以及注释上,我们每个函数都可以非常清楚了。
需要注意一下的是GameTime gameTime这个传入参数实际上维护着系统时钟相关的东西,比如游戏执行事件,是否刷新完全等等。 Content文件夹用于存放各种游戏相关的资源,因为资源的读取使用方式多种,且格式多样,MS为了简便,于是将资源统一化,
所有的资源都先转换成xnb类型文件,然后统一调用,这样我们就不用关注各种不同资源的调用细节。这真是很方便呢!
二、Do it!
我们先来写一个最简单的Hello World
要让文字渲染显示出来,必须要建立相应的字体,还好这个过程比较简单:
我们在项目管理器的Content文件夹上点右键,新建项,然后选择上面的Sprite Font 类型项。
左键单击刚添加到Content文件夹里面的SpriteFont1.spritefont,我们发现属性栏中有Asset Name,这是非常重要的属性,
所有的Content资源调用的时候都是通过这个名字来识别,而不是通过文件名。
我们双击刚才的字体文件,打开了一个xml文件,一看很容易理解这就是字体的各种参数设置,比如字体大小什么的,这里我们把字体大小改成34或者其他数值,其他不动。
然后我们要想把它显示出来,所以我们应该在Draw函数添加代码,
- protected override void Draw(GameTime gameTime)
- {
- GraphicsDevice.Clear(Color.CornflowerBlue);
- // TODO: Add your drawing code here
- spriteBatch.Begin();
- spriteBatch.DrawString(Content.Load<SpriteFont>("SpriteFont1"),
- "Hello World", Vector2.Zero, Color.Yellow);
- spriteBatch.End();
- base.Draw(gameTime);
- }
其中spriteBatch的详细介绍自己去查相关资料,这里我们只用了解,我们所有的绘制都在这个上面进行就可以了。
绘制代码需要放到spriteBatch.Begin(); 和spriteBatch.End(); 之间,就像OpenGL中的Begin一样,
然后我们调用DrawString方法实现文本的绘制。其中第一个参数为字体,第三个参数为显示坐标。
我们再到构造函数中添加两行代码,改变一下窗体大小:
- public Game1()
- {
- graphics = new GraphicsDeviceManager(this);
- Content.RootDirectory = "Content";
- graphics.PreferredBackBufferWidth = 300;
- graphics.PreferredBackBufferHeight = 100;
- }
效果如下:
三、图像的绘制
看图说话,没什么好讲的。
在Draw添加一句,改成如下:
- protected override void Draw(GameTime gameTime)
- {
- GraphicsDevice.Clear(Color.CornflowerBlue);
- // TODO: Add your drawing code here
- spriteBatch.Begin();
- spriteBatch.DrawString(Content.Load<SpriteFont>("SpriteFont1"),
- "Hello World", Vector2.Zero, Color.Yellow);
- spriteBatch.Draw(Content.Load<Texture2D>("cat"),new Vector2(100f,30f), Color.White);
- spriteBatch.End();
- base.Draw(gameTime);
- }
四、进阶
至此,图像已经显示出来了,要进行什么动画之类的,也只用简单的改改绘制坐标就可以了,当然XNA中还有大量的东西等待读者自己去探索,
比如XACT声音的加载,游戏组件,碰撞检测,3d绘制,等等
这些就超过本文的范围了。
Good Luck~
winxos 2010-09-05