我在Windows Phone 8上学习Monogame。在我的Sprite
类中,它是sprite对象的基类,我有以下方法
public void Draw(SpriteBatch batch)
{
batch.Draw(texture, Position, color);
DrawSprite(batch);
}
protected virtual void DrawSprite(SpriteBatch batch)
{
}
我有一个来自Car
班级的Sprite
班级。在其中我有
protected override void DrawSprite(SpriteBatch batch)
{
batch.Draw(texture, Position, null, Color.White, MathHelper.ToRadians(rotateAngle),
new Vector2(texture.Width / 2, texture.Height / 2), 1.0f,
SpriteEffects.None, 0.0f);
}
然后在我的MainGame
课程中,我使用以下方法绘制屏幕
protected override void DrawScreen(SpriteBatch batch, DisplayOrientation displayOrientation)
{
road.Draw(batch);
car.Draw(batch);
hazards.Draw(batch);
scoreText.Draw(batch);
}
问题是汽车精灵被画了两次。如果我删除
batch.Draw(texture, Position, color);
来自Draw
类的Sprite
方法,其他一些精灵不像按钮背景那样绘制。
我想我的问题是如何仅在存在而不是
时才调用覆盖方法batch.Draw(texture, Position, color);
在
public void Draw(SpriteBatch batch)
{
batch.Draw(texture, Position, color);
DrawSprite(batch);
}
答案 0 :(得分:0)
当您致电car.Draw(batch)
时,您正在绘图:
batch.Draw(texture, Position, color);
和
batch.Draw(texture, Position, null, Color.White, MathHelper.ToRadians(rotateAngle),
new Vector2(texture.Width / 2, texture.Height / 2), 1.0f,
SpriteEffects.None, 0.0f);
在Car
课程中,您不必覆盖DrawSprite
,而是覆盖Draw
。这样你只会绘制你需要的精灵。我想这对所有其他课程来说都是一个好主意。
答案 1 :(得分:0)
你差不多了,问题是Car
类应该覆盖Draw
方法,而不是DrawSprite
方法。
所以摆脱DrawSprite
方法并将Draw
方法虚拟标记为:
public virtual void Draw(SpriteBatch batch)
{
batch.Draw(texture, Position, color);
}
然后覆盖Draw
类中的Car
方法,如下所示:
public override void Draw(SpriteBatch batch)
{
batch.Draw(texture, Position, null, Color.White, MathHelper.ToRadians(rotateAngle),
new Vector2(texture.Width / 2, texture.Height / 2), 1.0f,
SpriteEffects.None, 0.0f);
}
这个工作的原因是因为C#中的类型系统推断出在运行时调用哪个方法。例如,将类型声明为Sprite
会调用默认的Draw
方法,但将其声明为Car
会调用覆盖的Draw
方法。
var sprite = new Sprite();
sprite.Draw(batch);
var car = new Car();
car.Draw(batch);
祝你好运! :)