梦想成真 XNA (1) - Hello XNA
作者:webabcd
介绍
XNA: 从 Hello XNA 开始
示例
1、为了方便在一个 XNA 程序里演示各种知识点,所以写了如下代码,通过键盘按键加载对应的 Demo
Game1.cs
/*
* 项目上单击右键 -> 属性 -> XNA Game Studio,其中可以选择 HiDef 标准或 Reach 标准
* HiDef 标准 - 全集(一般用于 Xbox 360 或 GPU 可支持 DirectX 10 以上的 PC)
* Reach 标准 - HiDef 的子集,用于显卡不济时(一般用于 Windows Phone 手机)
*/
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 XNA.Component.Sprite;
namespace XNA
{
// 启动时先 Initialize,再 LoadContent,退出时 UnloadContent
public class Game1 : Microsoft.Xna.Framework.Game
{
// 图形设备(显卡)管理器,XNA 在游戏窗口上做的所有事情都要通过此对象
GraphicsDeviceManager _graphics;
// 快捷键及其对应的 Demo 类全名的关系字典
Dictionary<Keys, string> _demos;
public Game1()
{
_graphics = new GraphicsDeviceManager(this);
_graphics.PreferredBackBufferWidth = 1280; // 游戏窗口的宽
_graphics.PreferredBackBufferHeight = 720; // 游戏窗口的高
// Content.RootDirectory - 编译后,内容资源的保存路径
Content.RootDirectory = "Content";
}
protected override void Initialize()
{
// 显示鼠标指针(默认值为 false)
// this.IsMouseVisible = true;
// 每一个 Demo 演示都对应一个按键,按对应的按键即可加载对应的 Demo
_demos = new Dictionary<Keys, string>();
_demos.Add(Keys.A, "XNA.Component.Sprite.Hello");
_demos.Add(Keys.B, "XNA.Component.Sprite.DrawDemo");
_demos.Add(Keys.C, "XNA.Component.Sprite.DrawString");
_demos.Add(Keys.D, "XNA.Component.Sprite.SpriteSortModeDemo");
_demos.Add(Keys.E, "XNA.Component.Sprite.BlendStateDemo");
_demos.Add(Keys.F, "XNA.Component.Sprite.Animation");
_demos.Add(Keys.G, "XNA.Component.Sprite.AnimatingSprite");
_demos.Add(Keys.H, "XNA.Component.Control.KeyboardControl");
_demos.Add(Keys.I, "XNA.Component.Control.MouseControl");
_demos.Add(Keys.J, "XNA.Component.Control.GamePadControl");
_demos.Add(Keys.K, "XNA.Component.Audio.XACT");
_demos.Add(Keys.L, "XNA.Component.Audio.SoundEffectDemo");
_demos.Add(Keys.M, "XNA.Component.Audio.SongDemo");
...
...
...
...
...
...
...
...
base.Initialize();
}
protected override void LoadContent()
{
}
protected override void UnloadContent()
{
}
private Keys _prevKey = Keys.None;
protected override void Update(GameTime gameTime)
{
IGameComponent component;
// 获取当用户的按键信息
Keys[] keys = Keyboard.GetState().GetPressedKeys();
if (keys.Length > 0 && keys[0] != _prevKey)
{
// 加载用户按键所对应的 Demo
if (_demos.ContainsKey(keys[0]))
{
component = (IGameComponent)Activator.CreateInstance(Type.GetType(_demos[keys[0]]), this);
Components.Clear();
Components.Add(component);
}
_prevKey = keys[0];
}
// 在 base.Update(gameTime) 中的其中一个逻辑就是调用 Components 集合中的所有 IGameComponent 对象的 Update() 方法
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
base.Draw(gameTime);
}
}
}
2、Hello XNA(按键盘 A 键加载此 Demo)
Component/Sprite/Hello.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;
namespace XNA.Component.Sprite
{
// 启动时先 Initialize,再 LoadContent,退出时 UnloadContent
public class Hello : Microsoft.Xna.Framework.DrawableGameComponent
{
// 精灵绘制器
SpriteBatch _spriteBatch;
// 2D 纹理对象
Texture2D _texture2D;
public Hello(Game game)
: base(game)
{
}
/// <summary>
/// 游戏运行前的一些初始化工作
/// </summary>
public override void Initialize()
{
base.Initialize();
}
/// <summary>
/// 加载游戏所需用到的资源,如图像和音效等
/// </summary>
protected override void LoadContent()
{
// 实例化 SpriteBatch
_spriteBatch = new SpriteBatch(Game.GraphicsDevice);
/*
* 解决方案中的 XNAContent 项目为内容管道(Content Pipeline),其用于管理如图像、音乐之类的游戏资源
* 每一个资源文件的属性中的 Asset Name 字段用于标识其在内容管道中的资源名称(没有文件扩展名,同文件夹内不能同名)
* 本质上,内容管道会把诸如 .jpg .png .mp3 之类的游戏资源文件在编译时转换成一种 XNA 很容易使用的内部格式
*/
// 将图片 Image/Son 加载到 Texture2D 对象中
_texture2D = Game.Content.Load<Texture2D>("Image/Son");
}
/// <summary>
/// 手工释放对象,游戏退出时会自动调用此方法
/// 注:XNA 会自动进行垃圾回收
/// </summary>
protected override void UnloadContent()
{
}
/// <summary>
/// Draw 之前的逻辑计算
/// </summary>
/// <param name="gameTime">游戏的当前时间对象</param>
public override void Update(GameTime gameTime)
{
base.Update(gameTime);
}
/// <summary>
/// 在游戏窗口上进行绘制
/// </summary>
/// <param name="gameTime">游戏的当前时间对象</param>
public override void Draw(GameTime gameTime)
{
// 清除游戏窗口上的所有对象,然后并以 CornflowerBlue 颜色作为背景
Game.GraphicsDevice.Clear(Color.CornflowerBlue);
// SpriteBatch.Draw() - 用于绘制图像,其应在 SpriteBatch.Begin() 和 SpriteBatch.End() 之间调用
_spriteBatch.Begin();
_spriteBatch.Draw(_texture2D, new Vector2((Game.Window.ClientBounds.Width - _texture2D.Width) / 2, (Game.Window.ClientBounds.Height - _texture2D.Height) / 2), Color.White);
_spriteBatch.End();
base.Update(gameTime);
}
}
}
OK
[源码下载]