到目前为止这是我的代码: 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();
}
顺便说一句,我想问一下我是否可以更好地制作这些代码或类似的东西。
非常感谢!
答案 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);
加载到LoadContent方法中。
答案 3 :(得分:1)
看起来你在用“NULL”球纹理初始化myPlayer后加载球纹理
答案 4 :(得分:1)
这是因为在LoadContent之前调用Initialize,并且在创建Player时,Ball纹理仍为null。
在加载球后,在LoadContent中创建Player对象,或允许Player加载自己的内容。