1

我正在用 XNA 编写我的第一个游戏,我有点困惑。

该游戏是一款 2D 平台游戏,像素完美,基于 Tiles。

目前,我的代码看起来像这样

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 来说不是一个好主意。

好吧,这是我的问题:

  • 我如何用他自己的精灵数量、它们的事件和对象来保存关卡?
  • 我如何加载/卸载这些关卡?
4

1 回答 1

6

给每个级别自己的ContentManager,并使用它来代替Game.Content(对于每个级别的内容)。

(通过传递给构造函数来创建新ContentManager实例。)Game.Services

单个 ContentManager将共享它加载的所有内容实例(因此,如果您两次加载“MyTexture”,您将获得两次相同的实例。由于这个事实,卸载内容的唯一方法是卸载整个内容管理器(使用.Unload())。

通过使用多个内容管理器,您可以获得更精细的卸载(因此您可以仅卸载单个级别的内容)。

请注意,不同的实例ContentManager彼此不了解,也不会共享内容。例如,如果您在两个不同的内容管理器上加载“MyTexture”,您将获得两个单独的实例(因此您使用了两倍的内存)。

处理此问题的最简单方法是使用 加载所有“共享”内容Game.Content,并使用单独的级别内容管理器加载所有每个级别的内容。

如果这仍然不能提供足够的控制,您可以从中派生一个类ContentManager并实现您自己的加载/卸载策略(本博文中的示例)。尽管这很少值得付出努力。

请记住,这是一种优化(针对内存) - 所以在它成为实际问题之前不要花太多时间。

我建议阅读这个答案(在 gamedev 网站上),它提供了一些提示和链接,以更深入地解释如何ContentManager工作的进一步答案。

于 2012-07-21T04:11:01.167 回答