2009-04-12 7 views
4

Pour une raison quelconque, la méthode LoadContent n'est pas appelée dans mes composants. Par exemple, j'ai la classe de jeu dans lequel je fais:LoadContent ne fonctionne pas dans mes composants

//Game.cs 
protected override void LoadContent() { 
    editor = new Editor(...); 
    Components.Add(editor); 
} 

//Editor.cs 
public class Editor : DrawableGameComponent{ 
    Game game; 
    public Editor(Game game, ...):base(game){ 
    this.game = game; 
    } 

    //THIS method never gets called! 
    protected override void LoadContent() { 
      background = game.Content.Load<Texture2D>("background"); 
      base.LoadContent(); 
    } 
} 

Des conseils?

EDIT: Lorsque vous gardez à l'esprit l'ordre de Initialize et LoadContent tout fonctionne bien!

Répondre

13

Je suppose que votre problème est dû à la fonction Initialize. LoadContent est appelée par Initialize. Il y a deux choses que vous devez vérifier:

  1. Vérifiez que vous créez et en ajoutant votre composant de jeu drawable dans Game.cs avant base.Initialize() est appelé. Dans le code ci-dessus, vous créez et ajoutez le composant dans la fonction LoadContent de Game.cs, qui se produit après Initialize.
  2. Vérifiez que la fonction Initialize dans votre classe Editor appelle la fonction de base Initialize:

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

Vérifiez cette blog post par Nick Gravelyn pour plus d'informations. Particulièrement pertinent pour votre question, dans son article, Nick écrit ceci:

  1. Vous commencerez par appeler Initialize. C'est ici que vous mettez généralement un code d'initialisation non graphique pour votre jeu *. Vous devez également vous assurer que vous appelez base.Initialize(). Lorsque vous le faites, le jeu fait quelques opérations:
    1. Appels Initialisez sur chaque composant de jeu dans la collection Composants.
    2. Crée le GraphicsDevice.
    3. Appelle LoadContent sur le jeu.
    4. Appelle LoadContent pour chaque DrawableGameComponent de la collection Components.
+0

Merci, vous m'avez amené à découvrir mon problème. Je mets la solution dans ma question! – drozzy

+0

Nouveau lien vers un blog inactif à [Archives Internet] (https://web.archive.org/web/20111107064918/http://blog.nickgravelyn.com/2008/11/life-of-an-xna-game/). – Marlos

4

LoadContent ne sera pas appelé si un GraphicsDeviceManager n'a pas été enregistré avant base.Initialize est appelé. Le code suivant enregistre correctement un GraphicsDeviceManager pour le jeu.

public class Game1 : Microsoft.Xna.Framework.Game 
{ 
    GraphicsDeviceManager graphics; 

    public Game1() 
    { 
     graphics = new GraphicsDeviceManager(this); 
    } 

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

Merci beaucoup !!! Les commentaires de tout le monde sur ce problème semblent être "Assurez-vous d'appeler base.Initialize()", mais c'est un point absolument critique. J'ai essayé de traquer ce problème pendant un bon moment, et vous m'avez finalement aidé. –

+0

Curieusement, il semble que vous n'ayez même pas besoin d'assigner GraphicsDeviceManager à quelque chose. Vous pouvez simplement appeler magiquement 'new GraphicsDeviceManager (this);' et ça marche très bien. Évidemment, comme c'est le cas, vous avez l'avantage d'avoir une référence, mais il semble juste "cliquer" et travailler indépendamment. –