0

我编写了一个简单的类来管理位图的绘制。

这是实现的好方法吗Begin()-End()从不同对象绘制多个精灵的方法(如在 XNA 的 omonime 方法中)?

public class Caravaggio : IDrawingService
{
    private CanvasDrawingSession _ds = null;
    private CanvasSpriteBatch _sb = null;

    private CanvasImageInterpolation _interpolation = CanvasImageInterpolation.Linear;
    private CanvasSpriteOptions _options = CanvasSpriteOptions.ClampToSourceRect;
    private CanvasSpriteSortMode _sortMode = CanvasSpriteSortMode.None;

    public bool EnableDebugDrawing { get; set; } = false;

    // This is being set from outside each CanvasAnimatedControl Draw event.
    // I made this because I'd like to pass only a "Caravaggio" parameter to my draw functions.
    public void SetDrawingEntity(CanvasDrawingSession DrawingEntity)
    {
        _ds = DrawingEntity;
    }

    public void Begin()
    {
        _sb = _ds.CreateSpriteBatch(_sortMode, _interpolation, _options);
    }

    public void End()
    {
        _sb.Dispose();
        _sb = null;
    }

    public void DrawBitmap(
        CanvasBitmap Bitmap,
        Rect SourceRect,
        Vector2 Position,
        Color OverlayColor,
        Vector2 Origin,
        float Rotation,
        Vector2 Scale,
        bool FlipHorizontally)
    {
        if (_ds == null)
        {
            throw new System.Exception("CanvasDrawingSession not set");
        }

        if (_sb == null)
        {
            throw new System.Exception("CanvasSpriteBatch not set. Did you forget to call Begin()?");
        }

        _sb.DrawFromSpriteSheet(
            Bitmap,
            Position, SourceRect,
            ColorToVector4(OverlayColor),
            Origin, Rotation, Scale,
            FlipHorizontally ? CanvasSpriteFlip.Horizontal : CanvasSpriteFlip.None);

        if (EnableDebugDrawing)
        {
            _ds.DrawRectangle(Position.X, Position.Y, (float)SourceRect.Width, (float)SourceRect.Height, Colors.Red);
        }
    }

我知道这很简单,但这只是出于“爱好”的目的。

如果您不想为每个绘制的实体创建一个新的 SpriteBatch 对象,我认为这种方法是一种改进,例如当您以这种方式绘制对象时:

// GameManager
public void Draw(IDrawingService MyDrawingService)
{
    MyDrawingService.Begin();

    _background.Draw(MyDrawingService);    

    foreach (Player p in _players)
       p.Draw(MyDrawingService);

    _score.Draw(MyDrawingService);

    MyDrawingService.End();
}
4

2 回答 2

1

似乎是在 Win2D 之上开始构建抽象的合理方式。

在你有开始/结束对的地方我通常希望看到 IDisposable 的东西,所以你可以将它与“使用”一起使用。就像是:

public void Draw(IDrawingService MyDrawingService)
{
    using (var session = MyDrawingService.Begin())
    {

        _background.Draw(session);    

        ...
    }
}

这类事情使您可以轻松地从 Begin/End 对中返回或抛出异常,而不必担心错过 End。

于 2016-01-08T20:38:07.467 回答
1

我认为这是一个很好的起点。

如果你包装更多的 Win2D 东西,我可以看到更多的优势,比如说你使用自己的 Sprite 实体而不是使用 CanvasBitmap。您还可以添加的另一件事是能够创建多个 Sprite 批次,而不是使用单个批次。

我即将为一个小项目做类似的事情,完成后我会更新我的版本。

于 2016-01-17T17:48:08.420 回答