FNA環境搭建

sadi發表於2020-09-25

簡介

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

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

為什麼選擇XNA

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

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

下載

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

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

enter image description here

HelloWorld

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

選擇FNA專案點確定

enter image description here

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

enter image description here

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

using Microsoft.Xna.Framework;

namespace HelloFNA
{
    class AwasomeGame : Game
    {
        private GraphicsDeviceManager graphicsMgr;
        public AwasomeGame()
        {
            graphicsMgr = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
    }
}

之後在Program.cs中呼叫如下程式碼:

namespace HelloFNA
{
    class Program
    {
        static void Main(string[] args)
        {
            var game = new AwasomeGame();
            game.Run();
        }
    }
}

然後按下F5執行,不出意料你會遇到如下錯誤

enter image description here

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

enter image description here

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

enter image description here

載入和顯示圖片

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

enter image description here

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

enter image description here

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

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

enter image description here

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

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

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

private Texture2D texture2D;
private SpriteBatch spriteBatch;

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

protected override void Initialize()
{
    base.Initialize();
    spriteBatch = new SpriteBatch(GraphicsDevice);
}

protected override void LoadContent()
{
    base.LoadContent();
    texture2D = Content.Load<Texture2D>("penguin");
}

protected override void Draw(GameTime gameTime)
{
    base.Draw(gameTime);
    spriteBatch.Begin();
    Vector2 screenPos = new Vector2(0, 0);
    spriteBatch.Draw(texture2D, screenPos, Color.White);
    spriteBatch.End();
}

這個時候按下F5執行即可看到我們的圖片顯示出來了。

enter image description here

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

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

對第三方庫保持謹慎態度

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

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

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

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

Sadi

2020年9月25日

參考

AwasomeMonogame

2D Graphics Programming for Games

FNA From Scratch