【WP7进阶】——XNA游戏初探
2011-03-20 13:21 Terry_龙 阅读(3505) 评论(5) 编辑 收藏 举报之前一直在做Android 的软件应用,包括现在学习Wp7 开发也一直未接触过游戏方面的开发。这几天对XNA开发粗略的看了一下,也找了相关的文档,觉得对于学习XNA方式开发WP7游戏应用应该是一件很酷的事。也是对自己本身职业技能的提高吧。
学习XNA开发游戏需要的工具
- Visual Studio 2010 前提是安装了Developer Tools 套件 或Express for Windows Phone
- Microsoft Cross-Platform Audio Creation Tool 3 (XACT3):XACT 是一个由 Microsoft 开发的跨平台的音效建立工具,可以协助您建立游戏程序需要使用的音效资源。
- XNA Framework Remote Performance Monitor:XNA Framework Remote Performance Monitor 是一个可以在游戏运行时间分析游戏效能的工具,协助程序设计师分析游戏程序的执行效能。
XNA 游戏程序架构的属性和方法
使用IDE创建一个Windows Phone Game (4.0)的解决方案。这里主要学习的是Game1.cs 这个文件,该文件默认为游戏的程序入口,而且该类默认继承自 Microsoft.Xna.Framework.Game,该模板会预设为我们重写几个游戏运行需要的方法,方法列表如下:
- public Game1() 构造函数
- protected override void Initialize() 负责初始化动作
- protected override void LoadContent() 负责加载资源
- protected override void UnloadContent() 负责释放资源动作
- protected override void Update(GameTime gameTime)负责更新游戏的状态,但不负责更新游戏的画面
- protected override void Draw(GameTime gameTime)跟update 相反。Draw 负责更新游戏的画面
其中Game1 还有两个比较常用的方法没有默认为我们重写,这两个方法也是比较常用,分别为:
- protected override bool BeginDraw() 开始绘图的动作
- protected override void EndDraw() 绘图动作结束
Game1比较常用的属性,可见下表:
属性名称 | 说明 |
Components | 管理所有 GameComponent 的集合 |
Content | 取得 ContentManager 对象的属性 |
GraphicsDevice | 取得图型装置对象的属性 |
IsActive | 判断游戏程序的窗口目前是否在作用中 |
IsFixedTimeStep | 控制游戏程序要使用固定更新模式或是可变更新模式 |
TargetElapsedTime | 当 IsFixedTimeStep 属性的内容值为 true 时,控制 Update 方法被呼叫的频率的属性 |
继续查看Game1 文件生成的代码,最上方默认声明了两个变量:
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch; //SpriteBatch 主要显示2D图像,包括游戏背景、游戏人物、游戏的状态和菜单
在Gamer1 的构造函数中可以通过如下代码创建一个GraphicsDeviceManager 对象
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.PreferredBackBufferHeight = 480; //创建一个画面高度为480的屏幕
graphics.PreferredBackBufferWidth = 800; //创建一个画面宽度为800的屏幕
//负责控制游戏程序更新状态及显示内容的频率
TargetElapsedTime = TimeSpan.FromTicks(333333); //设定游戏每秒更新30次,这里并不一定适合PC机或XBOX
}
GraphicsDeviceManager 对象常用的属性可见下表:
属性名称 | 说明 |
IsFullScreen | 控制游戏程序的窗口是否要以全屏幕的方式显示 |
PreferredBackBufferFormat | 屏幕缓冲区的格式 |
PreferredBackBufferHeight | 屏幕缓冲区的高度 |
PreferredBackBufferWidth | 屏幕缓冲区的宽度 |
GraphicsDeviceManager 对象常用的方法:
方法名称 | 说明 |
ToggleFullScreen | 在窗口模式和全屏幕模式中切换 |
Demo 演示
下面通过一个小DEMO来了解XNA for Windows Phone 的游戏框架,先看下图演示:
整个过程的代码量并不多,大部分都由XNA模板为我们生成,全部代码如下:
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch; //SpriteBatch 主要显示2D图像,包括游戏背景、游戏人物、游戏的状态和菜单
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
graphics.PreferredBackBufferHeight = 480; //创建一个画面高度为480的屏幕
graphics.PreferredBackBufferWidth = 800; //创建一个画面宽度为800的屏幕
//负责控制游戏程序更新状态及显示内容的频率
TargetElapsedTime = TimeSpan.FromTicks(333333); //设定游戏每秒更新30次,这里并不一定适合PC机或XBOX
}
/// <summary>
/// Allows the game to perform any initialization it needs to before starting to run.
/// This is where it can query for any required services and load any non-graphic
/// related content. Calling base.Initialize will enumerate through any components
/// and initialize them as well.
/// 负责游戏的初始化动作
/// </summary>
protected override void Initialize()
{
// TODO: Add your initialization logic here
base.Initialize();
}
Texture2D user = null; //声明一个可加载图像素材的Texture2D
/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
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
user = Content.Load<Texture2D>("user"); //通过Content 项目将user的图片加载进来
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// 负责执行释放资源的动作
/// 以XNA为基础的应用程序只需要释放非 ContentManager 管理的资源即可,
/// 即未通过ContentManager的Add 方法加入到ContentManager 进行管理的资源
/// 才有需要在此方法执行翻译资源的动作
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}
int pos = 0; //记录人物当前的位置
//负责更新游戏的状态,但不负责更新游戏的画面
/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
//如果在游戏中按下BACK键则结束游戏
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
if (pos <= 300)
{
pos++;
}
// TODO: Add your update logic here
base.Update(gameTime);
}
//Vector2 2维空间坐标
//跟update 相反。Draw 负责更新游戏的画面
/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
spriteBatch.Begin(); //给spriteBatch下命令准备开始动作
Vector2 vect = new Vector2(pos, 10);//创建一个x为用户所在位置,y为10的Vector2对象
//将user 按Vector2指定的位置开始画图
spriteBatch.Draw(user, vect, Color.White);
//停止时打印出stop
spriteBatch.End();//给spriteBatch下命令结束动作
base.Draw(gameTime);
}
}
2D与坐标
Texture2D是用来管理2D图形资源,常用属性为:
属性名称 | 说明 |
Bounds | 代表图形资源的大小 |
Format | 代表图形资源的格式 |
GraphicsDevice | 取得游戏程序使用的绘图装置的属性 |
Height | 图形资源的高度(单位:pixel) |
Width | 图形资源的宽度(单位:pixel) |
Vector2是用来加载2D图像资源显示到游戏界面时定义的空间坐标
引用之Windows Phone 官网
Vector2 的结构数据成员为
数据成员名称 | 说明 |
X | 代表坐标点的X轴的位置 |
Y | 代表坐标点的Y轴的位置 |
常用到的方法列表:
方法名称 | 说明 |
Add | 对坐标点执行加法运算 |
Clamp | 限制坐标内容值必须落在指定的范围之间 |
Distance | 计算两个坐标点之间的距离 |
DistanceSquared | 计算两个坐标点之间的距离的平方 |
Divide | 对坐标点执行除法运算 |
Equals | 判断坐标点是否等于指定的坐标点 |
Lerp | 计算两个坐标点之间的线性内插 |
Max | 计算坐标点的最大值 |
Min | 计算坐标点的最小值 |
Multiply | 对坐标点执行乘法运算 |
Negate | 对坐标点执行反运算 |
Subtract | 对坐标点执行减法运算 |
Transform | 对坐标点执行转置 (Transform) 运算 |
总体上来说XNA游戏开发,可以同时向多个平台延伸,只要注意好尺寸的不同和微调下代码即可。
DEMO下载:源码
本文参考自Windows Phone 7 官方教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架