更好的方式来加载在XNA级别的内容?

目前我在XNA的主游戏类中加载了我所有的资源。 我后来想要实现的是我只加载特定资产的特定级别(游戏将包括许多级别)。 下面是我如何加载我的主要资产到主类:

protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); plane = new Player(Content.Load<Texture2D>(@"Player/playerSprite"), 6, 8); plane.animation = "down"; plane.pos = new Vector2(400, 500); plane.fps = 15; Global.currentPos = plane.pos; lvl1 = new Level1(Content.Load<Texture2D>(@"Levels/bgLvl1"), Content.Load<Texture2D>(@"Levels/bgLvl1-other"), new Vector2(0, 0), new Vector2(0, -600)); CommonBullet.LoadContent(Content); CommonEnemyBullet.LoadContent(Content); } protected override void UnloadContent() { } protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); plane.Update(gameTime); lvl1.Update(gameTime); foreach (CommonEnemy ce in cel) { if (ce.CollidesWith(plane)) { ce.hasSpawn = false; } foreach (CommonBullet b in plane.commonBulletList) { if (b.CollidesWith(ce)) { ce.hasSpawn = false; } } ce.Update(gameTime); } LoadCommonEnemy(); base.Update(gameTime); } private void LoadCommonEnemy() { int randY = rand.Next(-600, -10); int randX = rand.Next(0, 750); if (cel.Count < 3) { cel.Add(new CommonEnemy(Content.Load<Texture2D>(@"Enemy/Common/commonEnemySprite"), 7, 2, "left", randX, randY)); } for (int i = 0; i < cel.Count; i++) { if (!cel[i].hasSpawn) { cel.RemoveAt(i); i--; } } } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(); lvl1.Draw(spriteBatch); plane.Draw(spriteBatch); foreach (CommonEnemy ce in cel) { ce.Draw(spriteBatch); } spriteBatch.End(); base.Draw(gameTime); } 

我想加载我的玩家,敌人,都在Level1级。 但是,当我将玩家和敌方代码移动到Level1类中时,gameTime返回null。 这是我的Level1类:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Media; using Microsoft.Xna.Framework.Input; using SpaceShooter_Beta.Animation.PlayerCollection; using SpaceShooter_Beta.Animation.EnemyCollection.Common; namespace SpaceShooter_Beta.Levels { public class Level1 { public Texture2D bgTexture1, bgTexture2; public Vector2 bgPos1, bgPos2; public float speed = 5f; Player plane; public Level1(Texture2D texture1, Texture2D texture2, Vector2 pos1, Vector2 pos2) { this.bgTexture1 = texture1; this.bgTexture2 = texture2; this.bgPos1 = pos1; this.bgPos2 = pos2; } public void LoadContent(ContentManager cm) { plane = new Player(cm.Load<Texture2D>(@"Player/playerSprite"), 6, 8); plane.animation = "down"; plane.pos = new Vector2(400, 500); plane.fps = 15; Global.currentPos = plane.pos; } public void Draw(SpriteBatch sb) { sb.Draw(bgTexture1, bgPos1, Color.White); sb.Draw(bgTexture2, bgPos2, Color.White); plane.Draw(sb); } public void Update(GameTime gt) { bgPos1.Y += speed; bgPos2.Y += speed; if (bgPos1.Y >= 600) { bgPos1.Y = -600; } if (bgPos2.Y >= 600) { bgPos2.Y = -600; } plane.Update(gt); } } } 

当然,当我这样做的时候,我删除了主游戏类中所有玩家的代码。 所有这些工作正常(没有错误),除了游戏无法启动。 debugging器说, plane.Update(gt); 在Level 1类中GameTime ,与Level类中的Draw方法一样。

请帮助,我欣赏的时间。

[编辑]我知道在主类使用switch可以是一个解决scheme。 但我更喜欢比这更干净的解决scheme,因为使用开关仍然意味着我需要通过主类加载所有的资产,代码将是后来每个级别很多

也许你应该看看

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.gamecomponent.aspx

要么

http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.drawablegamecomponent.aspx

游戏组件类是类游戏类,你添加一个游戏组件到你的游戏

 MyLevel1GameComponent level1 = new MyLevel1GameComponent(); Components.Add(level1); 

游戏组件的loadcontent会自动调用

 Components.Add(level1); 

只有当你这样做。 因此,只有在需要的时候才能在程序中加载内容。 在执行完上一条指令后,绘图和更新会自动调用每一帧(只有属性level1.Enabled为Update,level1.Visible for Draw为true)。

这意味着你不需要在任何地方放置level1.LoadContent(),level1.Update或level1.Draw(),游戏会为你处理这个问题。