使用內容管道可以讓你與你的二進制文件,從而節省了空間,加載時間編譯你的紋理,如果你關心從編輯/未經授權的使用保護您的資產關於那個。另一方面,如果你想要一個資產是可編輯的(如紋理包),FromFile()
是有效的。該文件必須存在於正常使用的預期目錄中。
這是一種很好的做法,但最終決定您選擇何處加載內容。請記住,內容加載需要從磁盤讀取數據,這並不是你想要的每一幀都要做的事情,並不是我們在遊戲過程中所做的事情。您需要設置您的遊戲狀態管理,以便在加載屏幕或遊戲啓動期間而不是在遊戲本身期間完全加載內容。當然,這正是什麼級別的加載屏幕!如果你非常聰明,你可以在暫停遊戲時偷偷裝載,這是Metroid Prime的'門裝'。但是,根據遊戲的範圍和資產,您不需要像這樣動態加載。
最後,關於傾銷資產:答案是面向對象編程的偉大之處:抽象。如果您在組織成員時遇到麻煩,請根據需要將它們移到繼承的類或子類中(並且只有在合理時)。在我的遊戲設計中,我很少有超過2個Texture2D
s,1個SoundBank
,也許每個類都有一個VertexBuffer
/IndexBuffer
。如果我設計得很好,這些都存儲在一個基類中,如任何可視對象繼承的「Sprite」。在我最新的一套工具中,我已經深入了一層,所以現在看起來像「Player.base
(這是Sprite).Animation.Texture
」,如果你想訪問實際的紋理......但你不需要,因爲所有的動畫/繪圖由Animation
類完全處理,並通過與雪碧Position
,Rotation
,Scale
,Bounding
一起更新等
所以,你的遊戲分解成對象。如果您將Texture2D PlayerTex
和Vector2 PlayerPos
存儲在您的Game
類和Draw
中,則您正在繪製PlayerTex
的PlayerPos
,但是您沒有充分利用OO編程。將PlayerTex
和PlayerPos
存儲在Player
類中,該類還定義了玩家的每個其他方面和行爲(方法)。現在,您在Game
中所需的全部數字是Player myPlayer
,而在Draw
中,您可以撥打myPlayer.Draw(SpriteBatch .. etc)
。你可以更進一步!以下是幾乎每個遊戲都有的類:Entity
(所有動態對象的基類),Level
(存儲每個級別的風景和Entities
並處理它們的交互),GameScreen
(每個完成時存儲和增加其Level
成員), ScreenManager
(存儲要更新的Screen
的堆棧,如GameScreen
,還有MenuScreen
,PauseScreen
,LoadingScreen
)......這個列表還在繼續。此時,您所有的Game1
類都會更新ScreenManager
,並且如果從IDrawableGameComponent
繼承ScreenManager
,則不需要那麼做。
我希望我沒有深入OO 101的深處,但是如果您無法跟蹤主要班級的所有成員,則應該開始分解。這是一項基本的面向對象技能。
如果一切都失敗,請學會寬泛地使用#region <name>
/#endregion
標籤。老實說,無論如何都要使用它們,它們會讓一切變得更好。
謝謝你的迴應。儘管我使用了區域,但它在一個地方看起來像是很多很多的代碼。我發現了一個名爲screenmanager的東西,看起來像我應該看看它。 –