XNA入门/框架介绍

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 版本。

一、新建工程

XNA入门/框架介绍_第1张图片

我们选择Windows Game(3.1),OK

打开项目工程,我们主要留意其中的Content文件夹以及Game1.cs和Program.cs文件。
Program.cs文件内容如下:

 

  
  
  
  
  1. using System; 
  2.  
  3. namespace WindowsGame3 
  4.     static class Program 
  5.     { 
  6.         /// <summary> 
  7.         /// The main entry point for the application. 
  8.         /// </summary> 
  9.         static void Main(string[] args) 
  10.         { 
  11.             using (Game1 game = new Game1()) 
  12.             { 
  13.                 game.Run(); 
  14.             } 
  15.         } 
  16.     } 

说明Program.cs文件只是个入口函数,这个是不用更改的,自己的编程还是放在Game1.cs中。 默认Game1.cs如下:

 

  
  
  
  
  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.Linq; 
  4. using Microsoft.Xna.Framework; 
  5. using Microsoft.Xna.Framework.Audio; 
  6. using Microsoft.Xna.Framework.Content; 
  7. using Microsoft.Xna.Framework.GamerServices; 
  8. using Microsoft.Xna.Framework.Graphics; 
  9. using Microsoft.Xna.Framework.Input; 
  10. using Microsoft.Xna.Framework.Media; 
  11. using Microsoft.Xna.Framework.Net; 
  12. using Microsoft.Xna.Framework.Storage; 
  13.  
  14. namespace WindowsGame3 
  15.     public class Game1 : Microsoft.Xna.Framework.Game 
  16.     { 
  17.         GraphicsDeviceManager graphics; 
  18.         SpriteBatch spriteBatch; 
  19.  
  20.         public Game1() 
  21.         { 
  22.             graphics = new GraphicsDeviceManager(this); 
  23.             Content.RootDirectory = "Content"
  24.         } 
  25.         protected override void Initialize() 
  26.         { 
  27.             // TODO: Add your initialization logic here 
  28.             base.Initialize(); 
  29.         } 
  30.         protected override void LoadContent() 
  31.         { 
  32.             // Create a new SpriteBatch, which can be used to draw textures. 
  33.             spriteBatch = new SpriteBatch(GraphicsDevice); 
  34.             // TODO: use this.Content to load your game content here 
  35.         } 
  36.         protected override void UnloadContent() 
  37.         { 
  38.             // TODO: Unload any non ContentManager content here 
  39.         } 
  40.         protected override void Update(GameTime gameTime) 
  41.         { 
  42.             if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) 
  43.                 this.Exit(); 
  44.             base.Update(gameTime); 
  45.         } 
  46.         protected override void Draw(GameTime gameTime) 
  47.         { 
  48.             GraphicsDevice.Clear(Color.CornflowerBlue); 
  49.             base.Draw(gameTime); 
  50.         } 
  51.     } 

为了观察方便,我删去了大部分注释。
我们可以看到Game1 继承自 Microsoft.Xna.Framework.Game
我们可以发现重载的函数为 Initialize(), LoadContent(), UnloadContent(), Update(GameTime gameTime), Draw(GameTime gameTime)
我们先了解一下通常的游戏编程,
游戏与普通应用程序不用,游戏要时时刻刻有个东西在后台工作,计算,所以游戏中有一个主循环,
第一次启动的时候,要先加载资源,比如图片、声音什么的,
然后每一次刷新的时候,要先进行相关角色动画计算,碰撞检测等等,
最后再把图像渲染出来,
然后再次循环。
所以顾名思义,XNA的函数从名字上以及注释上,我们每个函数都可以非常清楚了。
需要注意一下的是GameTime gameTime这个传入参数实际上维护着系统时钟相关的东西,比如游戏执行事件,是否刷新完全等等。 Content文件夹用于存放各种游戏相关的资源,因为资源的读取使用方式多种,且格式多样,MS为了简便,于是将资源统一化,
所有的资源都先转换成xnb类型文件,然后统一调用,这样我们就不用关注各种不同资源的调用细节。这真是很方便呢!

二、Do it!
我们先来写一个最简单的Hello World
要让文字渲染显示出来,必须要建立相应的字体,还好这个过程比较简单: x2

我们在项目管理器的Content文件夹上点右键,新建项,然后选择上面的Sprite Font 类型项。

x3

左键单击刚添加到Content文件夹里面的SpriteFont1.spritefont,我们发现属性栏中有Asset Name,这是非常重要的属性,
所有的Content资源调用的时候都是通过这个名字来识别,而不是通过文件名。
我们双击刚才的字体文件,打开了一个xml文件,一看很容易理解这就是字体的各种参数设置,比如字体大小什么的,这里我们把字体大小改成34或者其他数值,其他不动。
然后我们要想把它显示出来,所以我们应该在Draw函数添加代码,


  
  
  
  
  1. protected override void Draw(GameTime gameTime) 
  2.     GraphicsDevice.Clear(Color.CornflowerBlue); 
  3.  
  4.     // TODO: Add your drawing code here 
  5.     spriteBatch.Begin(); 
  6.     spriteBatch.DrawString(Content.Load<SpriteFont>("SpriteFont1"), 
  7.         "Hello World", Vector2.Zero, Color.Yellow); 
  8.     spriteBatch.End(); 
  9.     base.Draw(gameTime); 

其中spriteBatch的详细介绍自己去查相关资料,这里我们只用了解,我们所有的绘制都在这个上面进行就可以了。
绘制代码需要放到spriteBatch.Begin(); 和spriteBatch.End(); 之间,就像OpenGL中的Begin一样,
然后我们调用DrawString方法实现文本的绘制。其中第一个参数为字体,第三个参数为显示坐标。
我们再到构造函数中添加两行代码,改变一下窗体大小:


  
  
  
  
  1. public Game1() 
  2.     graphics = new GraphicsDeviceManager(this); 
  3.     Content.RootDirectory = "Content"
  4.     graphics.PreferredBackBufferWidth = 300; 
  5.     graphics.PreferredBackBufferHeight = 100; 

效果如下:

x4

三、图像的绘制

看图说话,没什么好讲的。

x5

x6

在Draw添加一句,改成如下:


  
  
  
  
  1. protected override void Draw(GameTime gameTime) 
  2.     GraphicsDevice.Clear(Color.CornflowerBlue); 
  3.     // TODO: Add your drawing code here 
  4.     spriteBatch.Begin(); 
  5.     spriteBatch.DrawString(Content.Load<SpriteFont>("SpriteFont1"), 
  6.         "Hello World", Vector2.Zero, Color.Yellow); 
  7.     spriteBatch.Draw(Content.Load<Texture2D>("cat"),new Vector2(100f,30f), Color.White); 
  8.     spriteBatch.End(); 
  9.     base.Draw(gameTime); 

x7

 

四、进阶

至此,图像已经显示出来了,要进行什么动画之类的,也只用简单的改改绘制坐标就可以了,当然XNA中还有大量的东西等待读者自己去探索,
比如XACT声音的加载,游戏组件,碰撞检测,3d绘制,等等
这些就超过本文的范围了。

Good Luck~

winxos 2010-09-05

你可能感兴趣的:(框架,入门,游戏开发,休闲,XNA)