XNA入门教程----(一)

写在前面:

前阵子看到cnblogs上的牛人用silverlight/WPF写游戏,不由心血来潮也尝试写个。

众所周知,虽说从silverlight2开始ms就提供了Isolated Storage的支持,但是,对于游戏这种大玩意儿,1M空间明显是不够的。于是乎,在silverlight中做游戏,别的不说,其资源的调度就严重依赖于服务器及网络了。

其次,WPF,由于其渲染本身基于directX,比起win32年代的winform更适合做form内的变换和刷新,但终究不非游戏框架,其本质是缺乏对界面消息循环的源生支持。虽说这对于windows app是简化了不少,但对游戏恐怕还不行。

偶然之间,发现ms的XNA,一款为dotnet爱好者准备的游戏开发框架。

 

何谓XNA:

XNA Framework 是建置于 .NET Framework 2.0上,另外还加入了一些专注于游戏开发上类别库,在指定的平台上使程式码重用达之最大效果。XNA Framework 在一个特别为有管理式游戏运行的通用语言执行层(Common Language Runtime)版本上运行。这个执行层支援Windows XP、Windows Vista和XBox 360。由于游戏是开发在执行层上,使得游戏能在所有支持XNA Framework 的平台上只要很少甚至不需要任何更改便能运行。现时所有在XNA Framework 上的游戏必需使用C #和XNA Game Studio Express IDE开发。

XNA Framework 把所有用作游戏编程的低阶技术包起来,由此,游戏开发员就可以专注于游戏内容开发而不用关心游戏移植至不同平台上的问题,游戏只要开发于XNA 的平台上,所有硬件只要支援XNA都能运行。XNA Framework 还内置一些工具,例如XACT以帮助游戏内容开发。这些工具还能帮助开发视觉和听觉效果和和像真度很高的模型制作。

XNA Framework 同时支持2D 和3D 的游戏开发也支援XBox 360 的控制器和震动效果。Xbox Live卖场可以升级开发者的XNA Game Studio Express 以使能把他们开发的游戏用于Xbox 360上。

由于XNA基于.NET 2.0,其开发效率比C++直接调用DirectX API 快了不少,对于我等业余的游戏开发者,是件好事。

 

 

XNA相关:

现在XNA最高版本已升级至3.1,并且加入了对Video的支持,并且需要在VS2008或其Express版本中安装。(至少理论上是,本人本地VS2008+2010+Win7屡次安装遭自动回滚,请教老外结果仍不理想,最终只能硬着头皮再安装个Express用于XNA)

其次,国内现在XNA的相关资源非常之少,严重依赖于相关英文参考。建议大家去看 Learning XNA 3.0-XNA 3.0 Game Development for the PC, Xbox 360, and Zune;XNA 3.0 Game Programming Recipes-A Problem-Solution Approach 和 Beginning XNA 3.0 Game Programming-From Novice to Professional相关的书,我看下来还是非常不错的。

貌似国内不少人正翻译或已经部分翻译此类文。

下载XNA

 

第一个XNA程序

 安装完XNA Framework后,在VS中即出现XNA的相关项目Template. 我们随便创建一个名曰 WindowsGame1的XNA项目。

编译后,出现蓝天白云一片
 

 现在,我们开始尝试在蓝天白云中,增加一些我们自己的元素。

插一句 

习惯于windows编程的朋友往往比较习惯对事件的监听或触发。其实,windows本身是基于消息队列的,事件就是不断监听消息并做出相应的处理。 不熟悉的朋友可以在dotnet winForm中重载WndProc即可知晓。

 在每个游戏中,都存在消息循环,即不断计算和控制界面不断刷新的循环。XNA也不例外,其Microsoft.Xna.Framework.Game以及我们以后说到的GameComponent都存在着自己的消息循环。

其中,

Initialize用于对游戏界面内一些对象的初始化。

LoadContent用于加载游戏内的一些资源,如图像,文件,声音等。

紧接着,Update和Draw 便开始游戏内的消息循环,前者主要用于相关计算,后者用于绘制。

XNA的默认刷新率是60fps(Frame/Second) 

 

我们首先在Content Directory下添加一张一存在的图片old english sheepdog.png 将其Content Importer和Processor 改为Texture - XNA Framework

请注意,XNA源生的API不支持GIF,如果需要导入则需要自己实现相应的Importer和Processor 

插一句

 Mircosoft.Xna.Framework.Content.Pipeline 是专门用于处理游戏资源的管道,无论是图像还是声音,3D资源或是XML的处理和编译都是在其之下处理编译的。

 编译后,任意资源都会被编译成.XNB(XNA二进制文件)。请注意,虽说XNA能同吃Windows和XBox,但其资源文件编译过程是不同的,不可通用,须重新编译。 

 

紧接着,导入图片后,我们可以紧接着LoadContent以及Update和Draw了

 

//新建变量img;用于存储图像
Texture2D img;

 

//在LoadContent中增加
 this.img = this.Content.Load<Texture2D>("old english sheepdog");

 

 其中"old english sheepdog"就是刚才加载的图像的Name属性。

这样,我们便可以直接在Draw方法中,让XNA的每次刷新都画出这样图片了 

代码
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
            spriteBatch.Draw(img, 
new Rectangle(005050), Color.White);
            spriteBatch.End();
            
base.Draw(gameTime);
        }

 简单解释下以上代码,

GraphicsDevice.Clear(Color.CornflowerBlue);用于擦除当前屏幕内的图像

 spriteBatch 通常用于绘制Sprite,即精灵。

请注意,在XNA的一个Game里请避免使用多个 spriteBatch ,并且所有图像的绘制都必须在spriteBatch 的Begin和End之间。

至于 spriteBatch.Draw 具有多个重载, 具体参考

 

 这样,我们第一个图像就诞生了

 

细心的你发现了吧,游戏界面内没有鼠标光标,那多简单,自己画个。

//声明全局变量p
Point p;
//在Update方法中增加
 MouseState ms=Mouse.GetState();
 p 
= new Point(ms.X, ms.Y);
//修改Draw方法
 spriteBatch.Draw(img, new Rectangle(p.X, p.Y, 5050), Color.White);

 

 这样,鼠标光标,便变成当前图像了。

当然,如果你只需要默认windows鼠标光标作为游戏光标,则不需要这么麻烦

//在Initialize中
 this.IsMouseVisible = true;

 即可。

 

这样,我们第一个XNA程序便完成了。 

 相关源代码

 To Be Continue....

本系列列表 

 

  1. XNA入门教程----(一) 

  2. XNA入门教程----(二) 移动控制

  3. XNA入门教程----(三) 简单的动画

 

 

posted @ 2010-01-15 16:03  Edwin Tai  阅读(12786)  评论(15编辑  收藏  举报