FNA 環境搭建
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,但是我個人並不推薦在你不熟悉的時候就拿這些框架來用。
我比較喜歡的方式是先看程式碼,覺得合適的再把那一部分過來(有些時候只需要精簡版)。在符合自己需求下用程式碼會比較符合程式碼複用。你會發現這些框架很多互相借鑑。
程式碼複用應該儘量保持程式碼量小而精,一下子加一堆可能永遠也用不上的程式碼也沒什麼用處。
最後,希望本文對你有幫助,也希望你能享受寫程式碼做遊戲的樂趣^_^
來源:indienova
原文:https://indienova.com/indie-game-development/fna-engine-set-up/
相關文章
- FNA環境搭建
- 環境搭建
- gogs環境搭建Go
- App環境搭建APP
- mac搭建環境Mac
- Kubernetes環境搭建
- swoft 環境搭建
- Flutter環境搭建Flutter
- 搭建Java環境Java
- Supervisor 環境搭建
- react環境搭建React
- Maven 環境搭建Maven
- Dubbo環境搭建
- Vagrant 環境搭建
- LNMP 環境搭建LNMP
- OpenGL 環境搭建
- keil環境搭建
- python環境搭建Python
- 搭建lnmp環境LNMP
- 搭建gym環境
- Linuxg環境搭建Linux
- JDK環境搭建JDK
- Angular環境搭建Angular
- anaconda 環境搭建
- ReactNative環境搭建React
- window環境下testlink環境搭建(xammp)
- Windows環境下的Nginx環境搭建WindowsNginx
- 以太坊-Win環境下remix環境搭建REM
- GPU 環境搭建指南:使用 GPU Operator 加速 Kubernetes GPU 環境搭建GPU
- 【環境搭建】RocketMQ叢集搭建MQ
- Rust 之環境搭建Rust
- vue的環境搭建Vue
- 【Kotlin】Kotlin環境搭建Kotlin
- 搭建程式碼環境
- 虛擬環境搭建
- Flutter 系列 - 環境搭建Flutter
- docker搭建lnmp環境DockerLNMP
- Vagrant 搭建 CentOS 環境CentOS