2013-11-15 6 views
0

Я относительный новичок в XNA и пытаюсь создать screenManager для игры C# XNA. Все в моем коде, кажется, работает нормально, пока не достигнет метода LoadContent в моем классе MainMenu, который происходит от Screen, который является обычным автономным классом. Здесь я получаю свой компонент GraphicsDevice не найден ContentLoad исключение.xna Загрузка содержимого из класса, отличного от GameComponent

Об этом заявлении: texture = c.Load<Texture2D>("Textures/Start"); , где c - ContentManager.

Это заявление и программа работают нормально, если я помещаю его в метод Update моего класса. Тем не менее, я хочу только загрузить эту текстуру один раз, а не при каждом вызове Update(GameTime). Я думаю, что я должен называть нагрузку до того, как какая-то информация о содержимом будет инициализирована, но я не уверен, что. В MainMenu.LoadContent есть несколько прокомментированных заявлений, которые делают почти то же самое, и все они вызывают такую ​​же ошибку. Я размещаю весь свой код здесь. Надеюсь, это не наводнение форума. Вот Game1.cs:

namespace RoomGame 
{ 
    /// <summary> 
    /// This is the main type for your game 
    /// </summary> 
    public class Game1 : Microsoft.Xna.Framework.Game 
    { 
     public static GraphicsDeviceManager graphics; 
     SpriteBatch spriteBatch; 
     GameController gameController; 

     public Game1() 
     { 
      graphics = new GraphicsDeviceManager(this); 
      Content.RootDirectory = "Content"; 

      gameController = new GameController(this,this.Content); 
      this.Components.Add(gameController); 
     } 

    } 
} 

GameController.cs:

namespace RoomGame 
{ 
    public class GameController : DrawableGameComponent 
    { 
     public Game game; 
     public ContentManager content; 
     public ScreenController screenController; 
     public MainMenu menu; 
     public GameController(Game game,ContentManager c) 
      : base(game) 
     { 
      this.game = game; 
      content = c; 
      screenController = new ScreenController(this); 
      menu = new MainMenu(this,this.content); 
      screenController.AddScreen(menu); 
     } 

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

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

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

     public override void Update(GameTime gameTime) 
     { 
      screenController.Update(gameTime); 
      base.Update(gameTime); 
     } 

     public override void Draw(GameTime gameTime) 
     { 
      base.Draw(gameTime); 
      screenController.Draw(gameTime); 
     } 
    } 
} 

screenController.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 

namespace RoomGame 
{ 

    public class ScreenController 
    { 
     public List<Screen> screens = new List<Screen>(); 
     GameController gameController; 
     SpriteBatch spriteBatch; 

     public ScreenController(GameController gc) 
     { 
      this.gameController = gc; 
     } 

     public void Initialize() 
     { 

      spriteBatch = new SpriteBatch(this.gameController.GraphicsDevice); 
     } 

     public void Update(GameTime gameTime) 
     { 
      foreach (Screen screen in screens) 
      { 
       if (screen.isUpdating) 
        screen.Update(gameTime); 
      } 
     } 

     public void Draw(GameTime gameTime) 
     { 
      foreach (Screen screen in screens) 
      { 
       if (screen.isDrawn) 
       { 
        spriteBatch.Begin(); 
        screen.Draw(gameTime,spriteBatch); 
        spriteBatch.End(); 
       } 
      } 
     } 

     public void AddScreen(Screen screen) 
     { 
      if (!screens.Contains(screen)) 
      { 
       screen.LoadContent(this.gameController.game.Content); 
       screens.Add(screen); 
       //screen.Initialize(); 

      } 
     } 




    } 
} 

Screen.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Content; 

namespace RoomGame 
{ 
    public class Screen 
    { 
     public ScreenController screenController; 
     public bool isUpdating=true; 
     public bool isDrawn=true; 
     public GraphicsDeviceManager graphics; 

     /*public Screen(ScreenController sc) 
     { 
      this.screenController = sc; 
      this.isActive = true; 
     }*/ 

     public virtual void Initialize() 
     { } 

     public virtual void LoadContent(ContentManager c) 
     { } 


     public virtual void Update(GameTime gameTime) 
     { } 

     public virtual void Draw(GameTime gameTime,SpriteBatch sb) 
     { } 
    } 
} 

MainMenu.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 
using Microsoft.Xna.Framework.Content; 

namespace RoomGame 
{ 
    public class MainMenu : Screen 
    { 
     GameController gameController; 
     Texture2D texture; 
     Vector2 position; 
     ContentManager content; 
     //public GraphicsDeviceManager graphics; 

     public MainMenu(GameController gc,ContentManager c) 
     { 
      this.gameController = gc; 
      this.content = c; 
      this.isUpdating = true; 
      this.isDrawn = true; 
      //this.graphics = this.gameController.game.graphics; 
     } 

     public override void LoadContent(ContentManager c) 
     { 

      texture = c.Load<Texture2D>("Textures/Start"); 
      //texture = this.gameController.game.Content.Load<Texture2D>("Textures/Start"); 
      //texture=this.gameController.content.Load<Texture2D>("Textures/Start"); 
      //texture = this.gameController.Game.Content.Load<Texture2D>("Textures/Start"); 
     } 


     public override void Update(GameTime gameTime) 
     { 
      //texture = this.gameController.content.Load<Texture2D>("Textures/Start"); 
      position = new Vector2(100, 100); 
     } 

     public override void Draw(GameTime gameTime,SpriteBatch sb) 
     { 
      sb.Draw(texture, position, Color.White); 
     } 
    } 
} 

Заранее спасибо ....

EDIT
Я нашел ошибку. Я звонил ScreenController.Add до LoadContent в GameController. Я положил его после base.LoadContent в gameController, и он работает сейчас. Я надеюсь, что это может помочь кому-то, но если кто-нибудь знает лучший способ приблизиться, пожалуйста, дайте мне знать.

+0

Пожалуйста, не публикуйте все свой код в следующий раз. – pinckerman

ответ

0

Вы вызываете MainMenu.LoadContent из конструктора ScreenController, который, в свою очередь, вызывается конструктором Game's. LoadContent следует вызывать в соответствующее время. Поэтому переместите вызов на AddScreen на LoadContent метод GameController.

Смежные вопросы