|
为什么选择 XNA
FNA 是微软的 XNA 的重新实现,其与 MonoGame 较为类似,基本代码可通用。但是 FNA 更多的精确地重新实现,所以可能与 XNA 兼容,但 MonoGame 则有所拓展,并非 100%兼容。
相比 MonoGame,FNA 资料较少(中文则是更少了),这篇文章主要介绍是入门开发的拦路虎:环境搭建。
如果你喜欢 C# 的接口、封装、抽象,不喜欢庞大的 IDE,不喜欢庞大的引擎有一堆永远赘余的功能,如果你喜欢传统写代码方式自己控制流程而不是在引擎中写脚本来开发游戏,那么你可能会喜欢这个游戏框架。
我最大的感受是它在大包大揽的引擎和底层的 API 中达到一种平衡。你拥有很大程度的控制权,并且不必与底层系统纠缠。
下载
在官方 Github 可以下载,这里下载 FNA-2008,不要下载 FNA-2009(新版本用到了 FNA3D 渲染,对应 DLL 需要自己编译我们暂时也用不到),下载并解压
同时下载一些依赖的本地库,比如 SDL2,FAudio 等等,目前下载地址在这里:
http://fna.flibitijibibo.com/archive/fnalibs.tar.bz2
或者在官网(http://fna-xna.github.io/)的这里下载:
HelloWorld
准备好之后可以在 Visual Studio 中新建一个控制台工程:
然后选择你的项目名字(比如 HelloFNA),等待工程创建完成,再选择:解决方案->添加->现有项目
选择之前解压的 FNA.csproj 工程,之后的项目结构如下
之后在 HelloFNA 项目中引用 FNA 项目:
选择 FNA 项目点确定:
然后再 HelloFNA 的项目下新建一个类:
再取个名字,比如 AwasomeGame,然后这个类继承自 Microsoft.Xna.Framework.Game:
- <p>using Microsoft.Xna.Framework;</p><p>
- </p><p>namespace HelloFNA</p><p>{</p><p> class AwasomeGame : Game</p><p> {</p><p> private GraphicsDeviceManager graphicsMgr;</p><p> public AwasomeGame()</p><p> {</p><p> graphicsMgr = new GraphicsDeviceManager(this);</p><p> Content.RootDirectory = "Content";</p><p> }</p><p> }</p><p>}</p>
复制代码
之后在 Program.cs 中调用如下代码:
- <p>namespace HelloFNA</p><p>{</p><p> class Program</p><p> {</p><p> static void Main(string[] args)</p><p> {</p><p> var game = new AwasomeGame();</p><p> game.Run();</p><p> }</p><p> }</p><p>}</p>
复制代码
然后按下 F5 运行,不出意料你会遇到如下错误:
该提示为没有找到本地库(dll 文件),所以需要在项目的输出文件(HelloFNA/bin/Debug)中把之前下载的本地库拷贝进去,选择 x86 文件夹下的全部 dll 文件(不要拷贝文件夹,只拷贝文件),拷贝到 Debug 文件夹内
此时再运行就能看到窗口了!
加载和显示图片
只显示一个窗口很无聊,下面的代码将会显示一张图片.假设我们要显示这么一张图片
(来源自:https://kenney.nl/assets/animal-pac):
我们先在项目中新建一个 Content 文件夹,并把这个图片放进去
然后在 Visual Studio 中当前项目中:新建文件夹->添加项->选择全部文件->选择图片,这里注意文件格式要选择所有文件:
下面是最重要也是一开始最容易忽略的一点,我们要在工程中设置图片属性为复制到输出目录,点击图片右键选择属性:
在 XNA 中的 Game 类中有几个方法需要注意
- LoadContent:加载资源
- Initialize:初始化
- Update:更新逻辑
- Draw:游戏的绘制
所以我们想要显示图片,第一件事就是加载图片,然后再 Draw 方法里面绘制出来即可。这里绘制图片需要有一个 SpriteBatch 对象,所以接着在 AwasomeGame.cs 中声明 Texture2D 对象和 SpriteBatch 对象
- <p>private Texture2D texture2D;</p><p>private SpriteBatch spriteBatch;</p>
复制代码
之后所需要的的就是加载,初始化和绘制的逻辑
- <p>protected override void Initialize()</p><p>{</p><p> base.Initialize();</p><p> spriteBatch = new SpriteBatch(GraphicsDevice);</p><p>}</p><p>
- </p><p>protected override void LoadContent()</p><p>{</p><p> base.LoadContent();</p><p> texture2D = Content.Load<Texture2D>("penguin");</p><p>}</p><p>
- </p><p>protected override void Draw(GameTime gameTime)</p><p>{</p><p> base.Draw(gameTime);</p><p> spriteBatch.Begin();</p><p> Vector2 screenPos = new Vector2(0, 0);</p><p> spriteBatch.Draw(texture2D, screenPos, Color.White);</p><p> spriteBatch.End();</p><p>}</p>
复制代码
这个时候按下 F5 运行即可看到我们的图片显示出来了。
如果你对 MonoGame 有所了解可能会了解 MGCB 软件,使用这个软件可以将资源导出给 MonoGame 使用,同时 FNA 也可以使用。一般比较简单的资源是不需要使用这个软件导出给 FNA 使用(一般也不推荐用,感觉多了一个步骤,本来修改导出就很简单),只要你遇到比较复杂比如 SpriteFont 和 3d 模型 时候可能需要,不然一般自己读取即可。
至此这篇文章的任务就达成了,我们搭建成了 FNA 的环境,有了这个基础,你可以继续看其他 XNA / Monogame / FNA 书籍教程来学习并继续探索。
对第三方库保持谨慎态度
在 XNA 也有一些框架可供使用,比如 NEZ 和 MonoGameExtend,但是我个人并不推荐在你不熟悉的时候就拿这些框架来用。
我比较喜欢的方式是先看代码,觉得合适的再把那一部分过来(有些时候只需要精简版)。在符合自己需求下用代码会比较符合代码复用。你会发现这些框架很多互相借鉴。
代码复用应该尽量保持代码量小而精,一下子加一堆可能永远也用不上的代码也没什么用处。
最后,希望本文对你有帮助,也希望你能享受写代码做游戏的乐趣^_^
文/Sadi
来源:indienova
原文:https://indienova.com/indie-game-development/fna-engine-set-up/
|
|