精灵画了两次monogame

时间:2013-09-11 07:16:53

标签: c# windows-phone-8 xna sprite monogame

我在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);
    }

2 个答案:

答案 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);
祝你好运! :)