Как мне написать текст на WriteableBitmap? - PullRequest
0 голосов
/ 02 февраля 2020

Сейчас я пишу код игры, и мне нужно нарисовать текст на WriteableBitmap; Как мне сделать это без преобразования WritableBitmap в Bitmap в WriteableBitmap? Я уже искал решения, но все они замедляют мою игру или требуют что-то вроде Silverlight для работы.

что-то вроде этого:

public class ResourceCounter : UIElement
{

    public ResourceCounter()
    {
        RenderBounds = new Bound(new Point(0, 0),
                                 new Point(600, 30));
    }

    private string goldAmt;
    private string woodAmt;
    private string stoneAmt;

    public override void Tick()
    {
        goldAmt = GlobalResources.Gold.ToString();
        woodAmt = GlobalResources.Wood.ToString();
        stoneAmt = GlobalResources.Stone.ToString();
    }

    public override void Draw(WriteableBitmap bitmap)
    {
        bitmap.FillRectangle(RenderBounds.A.X,
        Renderbounds.A.Y,
        Renderbounds.B.X,
        Renderbounds.B.Y,
        Colors.DarkSlateGray);
        bitmap.DrawString("text", other parameters...");
    }

}

1 Ответ

1 голос
/ 02 февраля 2020

Вы можете разделить буфер пикселей между растровым изображением и источником растрового изображения

var writeableBm1 = new WriteableBitmap(200, 100, 96, 96, 
    System.Windows.Media.PixelFormats.Bgr24, null);

var w = writeableBm1.PixelWidth;
var h = writeableBm1.PixelHeight;
var stride = writeableBm1.BackBufferStride;
var pixelPtr = writeableBm1.BackBuffer;

// this is fast, changes to one object pixels will now be mirrored to the other 
var bm2 = new System.Drawing.Bitmap(
    w, h, stride, System.Drawing.Imaging.PixelFormat.Format24bppRgb, pixelPtr);

writeableBm1.Lock();

// you might wanna use this in combination with Lock / Unlock, AddDirtyRect, Freeze
// before you write to the shared Ptr
using (var g = System.Drawing.Graphics.FromImage(bm2))
{
    g.DrawString("MyText", new Font("Tahoma", 14), System.Drawing.Brushes.White, 0, 0);
}

writeableBm1.AddDirtyRect(new Int32Rect(0, 0, 200, 100));
writeableBm1.Unlock();
...