1

Windows Phone 8 で Monogame を学習しています。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);
    }

問題は、車のスプライトが 2 回描画されることです。外すと

batch.Draw(texture, Position, color);

DrawクラスのメソッドからSprite、ボタンの背景のように他のスプライトが描画されません。

私の質問は、存在するが存在しない場合にのみオーバーライドメソッドを呼び出す方法だと思います

batch.Draw(texture, Position, color);

    public void Draw(SpriteBatch batch)
    {
        batch.Draw(texture, Position, color);
        DrawSprite(batch);
    }
4

2 に答える 2

0

問題は、クラスがメソッドではなくメソッドをCarオーバーライドする必要があることです。DrawDrawSprite

したがって、メソッドを削除し、メソッドを virtualとして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# の型システムが実行時に呼び出すメソッドを推測する方法によるものです。たとえば、型を as として宣言するSpriteとデフォルトDrawメソッドが呼び出されますが、それを as として宣言すると、代わりCarにオーバーライドされたDrawメソッドが呼び出されます。

var sprite = new Sprite();
sprite.Draw(batch);

var car = new Car();
car.Draw(batch);

幸運を!:)

于 2013-09-11T10:49:06.803 に答える