2012-07-21 77 views
0

我正在用XNA編碼我的第一款遊戲,而且我有點困惑。如何加載和卸載關卡

該遊戲是一個2D平臺遊戲,以像素爲完美,不是基於瓷磚。

目前,我的代碼看起來像這樣

public class Game1 : Microsoft.Xna.Framework.Game 
{ 
//some variables 
Level currentLevel, level1, level2; 

protected override void Initialize() 
{ 
base.Initialize(); 
} 

protected override void LoadContent() 
{ 
spriteBatch = new SpriteBatch(GraphicsDevice); 

//a level contains 3 sprites (background, foreground, collisions) 
//and the start position of the player 
level1 = new Level(
new Sprite(Content.Load<Texture2D>("level1/intro-1er-plan"), Vector2.Zero), 
new Sprite(Content.Load<Texture2D>("level1/intro-collisions"), Vector2.Zero), 
new Sprite(Content.Load<Texture2D>("level1/intro-decors-fond"), Vector2.Zero), 
new Vector2(280, 441)); 

level2 = new Level(
new Sprite(Content.Load<Texture2D>("level2/intro-1er-plan"), Vector2.Zero), 
new Sprite(Content.Load<Texture2D>("level2/intro-collisions"), Vector2.Zero), 
new Sprite(Content.Load<Texture2D>("level2/intro-decors-fond"), Vector2.Zero), 
new Vector2(500, 250)); 

...//etc 
} 


protected override void UnloadContent() {} 


protected override void Update(GameTime gameTime) 
{ 

if(the_character_entered_zone1()) 
{ 
ChangeLevel(level2); 
} 
//other stuff 

} 

protected override void Draw(GameTime gameTime) 
{ 
//drawing code 
} 

private void ChangeLevel(Level _theLevel) 
{ 
currentLevel = _theLevel; 
//other stuff 
} 

從一開始每個精靈被加載,所以它不是計算機的RAM是個好主意。

好了,這裏是我的問題:

  • 我怎樣才能保存自己的數字精靈,它們的事件和對象的水平?
  • 如何加載/卸載這些級別?

回答

5

給每個級別的它自己的ContentManager,並用它來代替Game.Content(每級內容)。

(通過傳遞Game.Services給構造函數創建新ContentManager實例。)

一個ContentManager將分享它加載(因此,如果您「MyTexture」內容的所有實例兩次,您將獲得它的兩個實例都是相同的)。由於這個事實,卸載內容的唯一方法是卸載整個內容管理器(使用.Unload())。

通過使用多個內容管理器,您可以獲得更多的卸載粒度(因此您可以將內容卸載到單個級別)。

只需注意,不同ContentManager的實例彼此不瞭解,不會共享內容。例如,如果您在兩個不同的內容管理器上加載「MyTexture」,則會得到兩個單獨的實例(因此您使用兩次內存)。

解決這個問題的最簡單方法是使用Game.Content加載所有「共享」內容,並將所有級別的內容加載到單獨的內容級別管理器中。

如果仍然不能提供足夠的控制權,您可以從ContentManager中派生一個類並實施您自己的加載/卸載策略(example in this blog post)。雖然這很少值得付出努力。

請記住,這是一個優化(內存) - 所以不要花太多時間,直到它變成實際問題。

我推薦閱讀this answer(在gamedev網站上),它提供了一些提示和進一步解答的鏈接,以更深入地解釋ContentManager的工作原理。

+0

你說得對,我不應該浪費太多時間。但總是很高興知道。 Thx對於所有這些信息都很重要。 – Sharpnel 2012-07-21 12:25:04

+0

獎勵:在遊戲關卡文件中,您應該保密和完整。前者爲了避免用戶在文件內部偷看以在實際播放它之前知道該級別,後者避免用戶改變級別數據以便在玩它時獲得一些益處 – 2014-04-17 21:17:36