1

私は最初のゲームを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には適していません。

さて、ここに私の質問があります:

  • 彼自身の数のスプライト、それらのイベント、およびオブジェクトでレベルを保存するにはどうすればよいですか?
  • これらのレベルをロード/アンロードするにはどうすればよいですか?
4

1 に答える 1

6

各レベルに独自のを与え、 (レベルごとのコンテンツの)ContentManager代わりにそれを使用します。Game.Content

ContentManager(コンストラクターに渡して新しいインスタンスを作成しますGame.Services。)

シングル は、ロードするコンテンツのContentManagerすべてのインスタンスを共有します(したがって、「MyTexture」を2回ロードすると、両方の時間で同じインスタンスを取得します)。このため、コンテンツをアンロードする唯一の方法は、コンテンツマネージャ全体をアンロードすることです(を使用して.Unload())。

複数のコンテンツマネージャーを使用することで、アンロードをより細かくすることができます(したがって、単一レベルのコンテンツをアンロードできます)。

のさまざまなインスタンスがContentManagerお互いを知らず、コンテンツを共有しないことに注意してください。たとえば、2つの異なるコンテンツマネージャーに「MyTexture」をロードすると、2つの別々のインスタンスが取得されます(したがって、2倍のメモリを使用します)。

これに対処する最も簡単な方法は、すべての「共有」のものをでロードし、Game.Contentレベルごとのすべてのものを個別のレベルのコンテンツマネージャーでロードすることです。

それでも十分な制御ができない場合はContentManager、独自のロード/アンロードポリシーからクラスを派生させて実装できます(このブログ投稿の例)。これはめったに努力する価値がありませんが。

これは(メモリの)最適化であることを忘れないでください。実際の問題になるまで、あまり時間をかけないでください。

この回答(gamedevサイト)を読むことをお勧めします。この回答には、動作の詳細を説明するヒントと回答へのリンクが記載されていますContentManager

于 2012-07-21T04:11:01.167 に答える