Моя первая игра в XNA (Маленькая проблема) - PullRequest
1 голос
/ 05 августа 2011

Это мой код: Game1.cs Класс:

 public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Player MyPlayer;
    Texture2D Ball;
    int GraphicsWidth,GraphicsHeight;
    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {
        GraphicsWidth = graphics.PreferredBackBufferWidth;
        GraphicsHeight= graphics.PreferredBackBufferHeight;
        MyPlayer = new Player(Ball, new Vector2(100, 100), Vector2.Zero);
        base.Initialize();
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        Ball = Content.Load<Texture2D>("Images/ball");

    }

    protected override void UnloadContent()
    {
    }

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


        base.Update(gameTime);
    }

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

        MyPlayer.Draw(spriteBatch);

        base.Draw(gameTime);
    }
}

Класс игрока (мяч):

class Player
{
    Texture2D Texture;
    Vector2 Positon,Velocity;
    public int Height
    {
        get { return this.Texture.Height; }
    }
    public int Width
    {
        get { return this.Texture.Width; }
    }


    public Player(Texture2D tex, Vector2 position,Vector2 velocity)
    {
        this.Texture = tex;
        this.Positon = position;
        this.Velocity = velocity;
    }
    public void Draw(SpriteBatch spriteBatch)
    {
       spriteBatch.Begin();
       spriteBatch.Draw(Texture, Positon, Color.White);
       spriteBatch.End();
    }
}

Когда я пытаюсь отладить игру, у меня естьследующая ошибка:

Этот метод не принимает значение NULL для этого параметра.Имя параметра: текстура В этой части:

public void Draw(SpriteBatch spriteBatch)
    {
       spriteBatch.Begin();
       spriteBatch.Draw(Texture, Positon, Color.White);
       spriteBatch.End();
    }

Кстати, я хотел бы спросить, могу ли я улучшить этот код или что-то в этом роде.Большое спасибо!

Ответы [ 5 ]

3 голосов
/ 05 августа 2011

Похоже, вы создали объект Player до того, как загрузили содержимое Ball, и, таким образом, игрок держит null вместо текстуры, но поле Ball в игре - это настоящая текстура.

Я бы переместил создание Player в LoadContent после того, как вы присвоили Ball.

Ball = Content.Load<Texture2D>("Images/ball");
MyPlayer = new Player(Ball, new Vector2(100, 100), Vector2.Zero);
2 голосов
/ 05 августа 2011

Я собираюсь предсказать мой ответ, сказав, что вы должны вызывать spriteBatch.begin () и spriteBatch.end () в вашей функции Game1.cs Draw вместо вашей функции Player.cs Draw.Это дорого, и вы не должны делать это более одного раза за кадр дро, если только это не является абсолютно необходимым (это не в данном случае).

Что касается вашего фактического вопроса, вам нужно загрузить свой плеер в LoadContentметод, а не ваш метод Initialize.

1 голос
/ 05 августа 2011

Это потому, что Initialize вызывается до LoadContent, и в тот момент, когда вы создаете Player, текстура Ball по-прежнему нулевая.

Либо создайте объект Player в LoadContent после загрузки мяча, либо разрешите Player загружать свой собственный контент.

1 голос
/ 05 августа 2011

Похоже, что вы загружаете текстуру шара после того, как вы уже инициализировали myPlayer с текстурой шара "NULL"

1 голос
/ 05 августа 2011

Инициализация происходит до загрузки вашей текстуры.

попробуйте переместить MyPlayer = new Player(Ball, new Vector2(100, 100), Vector2.Zero);

в метод LoadContent после загрузки текстуры в Ball.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...