我编写了一个简单的类来管理位图的绘制。
这是实现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();
}
答案 0 :(得分:1)
似乎是在Win2D上开始构建抽象的合理方法。
如果您有开始/结束对,我通常希望看到具有IDisposable的内容,因此您可以使用"使用"。类似的东西:
public void Draw(IDrawingService MyDrawingService)
{
using (var session = MyDrawingService.Begin())
{
_background.Draw(session);
...
}
}
这种事情允许您轻松地从开始/结束对中返回或抛出异常,而不必担心错过结束。
答案 1 :(得分:1)
我认为这是一个很好的起点。
如果你包装更多的Win2D东西,我可以看到更多的优势,让我们说使用你自己的Sprite实体而不是使用CanvasBitmap。 您还可以添加的另一件事是能够创建多个Sprite批次,而不是使用单个Sprite批次。
我即将为一个小项目做类似的事情,我会在完成后更新我的版本。