我在XNA的第一场比赛(小问题)

时间:2011-08-05 13:16:32

标签: c# xna

到目前为止这是我的代码: 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。 参数名称:texture 在那一部分:

public void Draw(SpriteBatch spriteBatch)
    {
       spriteBatch.Begin();
       spriteBatch.Draw(Texture, Positon, Color.White);
       spriteBatch.End();
    }
顺便说一句,我想问一下我是否可以更好地制作这些代码或类似的东西。 非常感谢!

5 个答案:

答案 0 :(得分:3)

看起来你在加载Ball内容之前创建了Player对象,因此,玩家持有null而不是纹理,但游戏中的Ball字段是真正的纹理

在您分配Ball之后,我会将Player的创建移动到LoadContent。

Ball = Content.Load<Texture2D>("Images/ball");
MyPlayer = new Player(Ball, new Vector2(100, 100), Vector2.Zero);

答案 1 :(得分:2)

我将在我的回答前言说你应该在你的Game1.cs Draw函数中调用spriteBatch.begin()和spriteBatch.end()而不是你的Player.cs Draw函数。这是昂贵的,你不应该每个画框多做一次,除非绝对必要(在这种情况下不是这样)。

关于您的实际问题,您需要在LoadContent方法而不是Initialize方法中加载播放器。

答案 2 :(得分:1)

在加载纹理之前正在进行初始化。

尝试移动MyPlayer = new Player(Ball, new Vector2(100, 100), Vector2.Zero);

将纹理加载到Ball后,将

加载到LoadContent方法中。

答案 3 :(得分:1)

看起来你在用“NULL”球纹理初始化myPlayer后加载球纹理

答案 4 :(得分:1)

这是因为在LoadContent之前调用Initialize,并且在创建Player时,Ball纹理仍为null。

在加载球后,在LoadContent中创建Player对象,或允许Player加载自己的内容。