2012-05-08 86 views
0

我是XNA的新手,這是一個哲學問題。在我見過的大多數例子中,遊戲資產被定義爲私有類變量,加載到LoadContent方法中,然後用Draw方法繪製。如果我有一個大屏幕的大型遊戲,那麼這個類的頂部可能會有相當多的聲明。xna /內容管道/資產和屏幕管理

隨着中說,這裏是我的問題

  1. 我應該使用過Texture2D.FromFile內容管道()。

  2. 除了更快的加載之外,還有哪些優點。

  3. 我應該在LoadContent()子類外調用Content.Load(Of T)([某個資產名稱])。

你是如何處理不同屏幕的加載資產?你是否宣佈所有資產在頂部?

在先進的感謝,

埃裏克

回答

1

使用內容管道可以讓你與你的二進制文件,從而節省了空間,加載時間編譯你的紋理,如果你關心從編輯/未經授權的使用保護您的資產關於那個。另一方面,如果你想要一個資產是可編輯的(如紋理包),FromFile()是有效的。該文件必須存在於正常使用的預期目錄中。

這是一種很好的做法,但最終決定您選擇何處加載內容。請記住,內容加載需要從磁盤讀取數據,這並不是你想要的每一幀都要做的事情,並不是我們在遊戲過程中所做的事情。您需要設置您的遊戲狀態管理,以便在加載屏幕或遊戲啓動期間而不是在遊戲本身期間完全加載內容。當然,這正是什麼級別的加載屏幕!如果你非常聰明,你可以在暫停遊戲時偷偷裝載,這是Metroid Prime的'門裝'。但是,根據遊戲的範圍和資產,您不需要像這樣動態加載。

最後,關於傾銷資產:答案是面向對象編程的偉大之處:抽象。如果您在組織成員時遇到麻煩,請根據需要將它們移到繼承的類或子類中(並且只有在合理時)。在我的遊戲設計中,我很少有超過2個Texture2D s,1個SoundBank,也許每個類都有一個VertexBuffer/IndexBuffer。如果我設計得很好,這些都存儲在一個基類中,如任何可視對象繼承的「Sprite」。在我最新的一套工具中,我已經深入了一層,所以現在看起來像「Player.base(這是Sprite).Animation.Texture」,如果你想訪問實際的紋理......但你不需要,因爲所有的動畫/繪圖由Animation類完全處理,並通過與雪碧PositionRotationScaleBounding一起更新等

所以,你的遊戲分解成對象。如果您將Texture2D PlayerTexVector2 PlayerPos存儲在您的Game類和Draw中,則您正在繪製PlayerTexPlayerPos,但是您沒有充分利用OO編程。將PlayerTexPlayerPos存儲在Player類中,該類還定義了玩家的每個其他方面和行爲(方法)。現在,您在Game中所需的全部數字是Player myPlayer,而在Draw中,您可以撥打myPlayer.Draw(SpriteBatch .. etc)。你可以更進一步!以下是幾乎每個遊戲都有的類:Entity(所有動態對象的基類),Level(存儲每個級別的風景和Entities並處理它們的交互),GameScreen(每個完成時存儲和增加其Level成員), ScreenManager(存儲要更新的Screen的堆棧,如GameScreen,還有MenuScreen,PauseScreenLoadingScreen)......這個列表還在繼續。此時,您所有的Game1類都會更新ScreenManager,並且如果從IDrawableGameComponent繼承ScreenManager,則不需要那麼做。

我希望我沒有深入OO 101的深處,但是如果您無法跟蹤主要班級的所有成員,則應該開始分解。這是一項基本的面向對象技能。

如果一切都失敗,請學會寬泛地使用#region <name>/#endregion標籤。老實說,無論如何都要使用它們,它們會讓一切變得更好。

+0

謝謝你的迴應。儘管我使用了區域,但它在一個地方看起來像是很多很多的代碼。我發現了一個名爲screenmanager的東西,看起來像我應該看看它。 –