2011-06-02 2 views
1
public class Dirt : Tile 
{ 
    Vector2 position; 
    Texture2D texture; 

    public Dirt(Game game, Vector2 Position) 
     : base(game) 
    { 
     type = "dirt"; 
     textureName = "Textures/Dirt"; 

     position = Position; 
    } 

    public override void Initialize() 
    { 

     base.Initialize(); 
    } 

    protected override void LoadContent() 
    { 
     texture = Salvage.contentManager.Load<Texture2D>("Textures/Dirt"); // This doesnt work 

     base.LoadContent(); 
    } 

    public override void Update(GameTime gameTime) 
    { 
     if (InputHandler.KeyDown(Keys.W)) 
     { 
      position.Y -= 1; 
     } 
     else if (InputHandler.KeyDown(Keys.S)) 
     { 
      position.Y += 1; 
     } 

     if (InputHandler.KeyDown(Keys.D)) 
     { 
      position.X += 1; 
     } 
     else if (InputHandler.KeyDown(Keys.A)) 
     { 
      position.X -= 1; 
     } 

     Camera.DesiredPosition = position; 

     base.Update(gameTime); 
    } 

    public override void Draw(GameTime gameTime) 
    { 
     Salvage.spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, null, null, null, null, Camera.Transformation); 
     Salvage.spriteBatch.Draw(texture, position, Color.White); 
     Salvage.spriteBatch.End(); 


     base.Draw(gameTime); 
    } 
} 

Загрузка, кажется, работает нормально, если я загрузить его в классе Поврежденного (Основной игровой класс)Cant нагрузка Содержания Когда не в основной игре класс

Edit:

И.М. ошибки получает:

Salvage.spriteBatch.Draw (текстура, положение, цвет. Белый); Этот метод не принимает значение null для этого параметра. Имя Параметр: текстура

Вот код класса Поврежденный:

public class Salvage : Microsoft.Xna.Framework.Game 
{ 

    public static GraphicsDeviceManager graphics; 
    public static SpriteBatch spriteBatch; 
    public static ContentManager contentManager; 
    public static SpriteFont spriteFont; 
    public GameStateManager stateManager; 
    public Rectangle ScreenRectangle = new Rectangle(0, 0, 1024, 768); 

    public Salvage() 
    { 
     graphics = new GraphicsDeviceManager(this); 
     graphics.PreferredBackBufferHeight = ScreenRectangle.Height; 
     graphics.PreferredBackBufferWidth = ScreenRectangle.Width; 

     Content.RootDirectory = "Content"; 
     contentManager = Content; 

    } 

    protected override void Initialize() 
    { 

     base.Initialize(); 
    } 

    protected override void LoadContent() 
    { 
     spriteBatch = new SpriteBatch(GraphicsDevice); 
     spriteFont = Content.Load<SpriteFont>("Fonts/DefaultSpriteFont"); // This works fine 

     stateManager = new GameStateManager(this); 
     GameplayState gameplayState = new GameplayState(this, stateManager); 

     Components.Add(new InputHandler(this)); 
     Components.Add(new Camera(this, ScreenRectangle)); 
     Components.Add(stateManager); 

     stateManager.ChangeState(gameplayState); 

    } 


    protected override void UnloadContent() 
    { 

    } 

    protected override void Update(GameTime gameTime) 
    { 
     if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || InputHandler.KeyReleased(Keys.Escape)) 
      this.Exit(); 

     base.Update(gameTime); 
    } 

    protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.CornflowerBlue); 

     base.Draw(gameTime); 
    } 
} 

И код для плитки

public abstract class Tile : Microsoft.Xna.Framework.DrawableGameComponent 
{ 
    public string textureName; 
    public string type; 

    public Tile(Game game) 
     : base(game) 
    { 

    } 

    public override void Initialize() 
    { 

     base.Initialize(); 
    } 

    protected override void LoadContent() 
    { 

     base.LoadContent(); 
    } 

    public override void Update(GameTime gameTime) 
    { 

     base.Update(gameTime); 
    } 

    public override void Draw(GameTime gameTime) 
    { 

     base.Draw(gameTime); 
    } 
} 

Edit:

Вот класс GamePlayState

public class GameplayState : GameState 
{ 

    public GameplayState(Game game, GameStateManager manager) 
     : base(game, manager) 
    { 
     childGameComponents.Add(new Dirt(game, new Vector2(0, 0))); 
    } 

    public override void Initialize() 
    { 

     base.Initialize(); 
    } 

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

    public override void Update(GameTime gameTime) 
    { 

     base.Update(gameTime); 
    } 

    public override void Draw(GameTime gameTime) 
    { 

     base.Draw(gameTime); 
    } 
} 
+0

Информация не достаточна. Какую ошибку вы получаете? Можете ли вы предоставить соответствующий код для классов «Спасение» и «Плитка»? –

+0

Я думаю, что ошибка находится в классе GameState. Откуда это? –

ответ

2

Я видел вашу проблему. Вы объявляете переменную contentManager, но никогда не назначаете ее до LoadContent. Если вы загружаете Dirt до этого, у вас не будет действительной переменной ContentManager, что приведет к ее сбою.

В конструкторе вашего класса Salvage, добавьте следующую строку:

contentManager = Content;

Это должно решить проблему.

+0

Я по-прежнему получаю ту же ошибку, потому что я не создавал Dirt Tile до тех пор, пока не будет создан класс gameplayState. – Diddykonga

+0

@DiddyKonga: Можете ли вы указать, какой класс создается первым, чтобы я мог лучше понять, что это происходит? –

+0

K хорошо цепь в значительной степени похожа на это, Salvage (Main Class) делает GamePlayState, тогда GamePlayState делает грязевую плитку. – Diddykonga