FNA 環境搭建

Sadi發表於2020-10-14
為什麼選擇 XNA

FNA 是微軟的 XNA 的重新實現,其與 MonoGame 較為類似,基本程式碼可通用。但是 FNA 更多的精確地重新實現,所以可能與 XNA 相容,但 MonoGame 則有所擴充,並非 100%相容。

相比 MonoGame,FNA 資料較少(中文則是更少了),這篇文章主要介紹是入門開發的攔路虎:環境搭建。

如果你喜歡 C# 的介面、封裝、抽象,不喜歡龐大的 IDE,不喜歡龐大的引擎有一堆永遠贅餘的功能,如果你喜歡傳統寫程式碼方式自己控制流程而不是在引擎中寫指令碼來開發遊戲,那麼你可能會喜歡這個遊戲框架。

我最大的感受是它在大包大攬的引擎和底層的 API 中達到一種平衡。你擁有很大程度的控制權,並且不必與底層系統糾纏。

下載

在官方 Github 可以下載,這裡下載 FNA-2008,不要下載 FNA-2009(新版本用到了 FNA3D 渲染,對應 DLL 需要自己編譯我們暫時也用不到),下載並解壓

FNA 環境搭建

同時下載一些依賴的本地庫,比如 SDL2,FAudio 等等,目前下載地址在這裡:
http://fna.flibitijibibo.com/archive/fnalibs.tar.bz2

或者在官網(http://fna-xna.github.io/)的這裡下載:

FNA 環境搭建

HelloWorld

準備好之後可以在 Visual Studio 中新建一個控制檯工程:

FNA 環境搭建

然後選擇你的專案名字(比如 HelloFNA),等待工程建立完成,再選擇:解決方案->新增->現有專案

FNA 環境搭建

選擇之前解壓的 FNA.csproj 工程,之後的專案結構如下

FNA 環境搭建

之後在 HelloFNA 專案中引用 FNA 專案:

FNA 環境搭建

選擇 FNA 專案點確定:

FNA 環境搭建

然後再 HelloFNA 的專案下新建一個類:

FNA 環境搭建

再取個名字,比如 AwasomeGame,然後這個類繼承自 Microsoft.Xna.Framework.Game:

  1. <p>using Microsoft.Xna.Framework;</p><p>
  2. </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 中呼叫如下程式碼:

  1. <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 執行,不出意料你會遇到如下錯誤:

FNA 環境搭建

該提示為沒有找到本地庫(dll 檔案),所以需要在專案的輸出檔案(HelloFNA/bin/Debug)中把之前下載的本地庫拷貝進去,選擇 x86 資料夾下的全部 dll 檔案(不要拷貝資料夾,只拷貝檔案),拷貝到 Debug 資料夾內

FNA 環境搭建

此時再執行就能看到視窗了!

FNA 環境搭建

載入和顯示圖片

只顯示一個視窗很無聊,下面的程式碼將會顯示一張圖片.假設我們要顯示這麼一張圖片
(來源自:https://kenney.nl/assets/animal-pac):

FNA 環境搭建



我們先在專案中新建一個 Content 資料夾,並把這個圖片放進去

FNA 環境搭建

然後在 Visual Studio 中當前專案中:新建資料夾->新增項->選擇全部檔案->選擇圖片,這裡注意檔案格式要選擇所有檔案:

FNA 環境搭建

下面是最重要也是一開始最容易忽略的一點,我們要在工程中設定圖片屬性為複製到輸出目錄,點選圖片右鍵選擇屬性:

FNA 環境搭建

在 XNA 中的 Game 類中有幾個方法需要注意

  • LoadContent:載入資源
  • Initialize:初始化
  • Update:更新邏輯
  • Draw:遊戲的繪製

所以我們想要顯示圖片,第一件事就是載入圖片,然後再 Draw 方法裡面繪製出來即可。這裡繪製圖片需要有一個 SpriteBatch 物件,所以接著在 AwasomeGame.cs 中宣告 Texture2D 物件和 SpriteBatch 物件

  1. <p>private Texture2D texture2D;</p><p>private SpriteBatch spriteBatch;</p>
複製程式碼

之後所需要的的就是載入,初始化和繪製的邏輯

  1. <p>protected override void Initialize()</p><p>{</p><p>  base.Initialize();</p><p>  spriteBatch = new SpriteBatch(GraphicsDevice);</p><p>}</p><p>
  2. </p><p>protected override void LoadContent()</p><p>{</p><p>  base.LoadContent();</p><p>  texture2D = Content.Load<Texture2D>("penguin");</p><p>}</p><p>
  3. </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 執行即可看到我們的圖片顯示出來了。

FNA 環境搭建

如果你對 MonoGame 有所瞭解可能會了解 MGCB 軟體,使用這個軟體可以將資源匯出給 MonoGame 使用,同時 FNA 也可以使用。一般比較簡單的資源是不需要使用這個軟體匯出給 FNA 使用(一般也不推薦用,感覺多了一個步驟,本來修改匯出就很簡單),只要你遇到比較複雜比如 SpriteFont 和 3d 模型 時候可能需要,不然一般自己讀取即可。

至此這篇文章的任務就達成了,我們搭建成了 FNA 的環境,有了這個基礎,你可以繼續看其他 XNA / Monogame / FNA 書籍教程來學習並繼續探索。

對第三方庫保持謹慎態度

在 XNA 也有一些框架可供使用,比如 NEZ 和 MonoGameExtend,但是我個人並不推薦在你不熟悉的時候就拿這些框架來用。

我比較喜歡的方式是先看程式碼,覺得合適的再把那一部分過來(有些時候只需要精簡版)。在符合自己需求下用程式碼會比較符合程式碼複用。你會發現這些框架很多互相借鑑。

程式碼複用應該儘量保持程式碼量小而精,一下子加一堆可能永遠也用不上的程式碼也沒什麼用處。

最後,希望本文對你有幫助,也希望你能享受寫程式碼做遊戲的樂趣^_^


來源:indienova
原文:https://indienova.com/indie-game-development/fna-engine-set-up/