【发布时间】:2016-01-13 18:59:38
【问题描述】:
在使用 BmFont 绘图时,有没有办法使文本居中?我正在使用这里的代码:Using a BMP image as font in Monogame
我所做的唯一代码更改是我在DrawText 中添加了一个_TextWidth int,它使用DX - X 来获取文本长度,然后是一个函数GetTextLength 将它返回给按钮类,然后它需要((button width - text width) / 2) 获取文本的起点,使其居中。但是,似乎存在一些问题,文本没有使用自己的文本宽度居中,而是使用下一个按钮的文本宽度。返回文本宽度很好,但由于某种原因,当它在屏幕上绘制时,它总是错误的值。
添加/更改代码:
Public Sub DrawText(ByVal spritebatch As SpriteBatch, ByVal X As Integer, ByVal Y As Integer, ByVal Text As String)
Dim DX As Integer = X
Dim DY As Integer = Y
For Each C As Char In Text
Dim FC As New FontChar
If _CharacterMap.TryGetValue(C, FC) Then
Dim sourceRectangle = New Rectangle(FC.X, FC.Y, FC.Width, FC.Height)
Dim position = New Vector2(DX + FC.XOffset, DY + FC.YOffset)
spritebatch.Draw(_Texture, position, sourceRectangle, Color.White)
DX += FC.XAdvance
End If
Next
_TextWidth = DX - X
End Sub
Public Function GetTextLength() As Integer
Return _TextWidth
End Function
截图:
Uncentered text, which could be centered if the right values were used for each button
【问题讨论】:
-
我认为你在 draw 中缺少原点,
origin也应该在文本的中心。FC.Width/2和FC.Height/2 -
@DavorMlinaric 它在这里绘制文本的方式是逐个字符,而不是一次全部绘制。那么有没有办法在绘制一次之前先将所有内容绘制到缓冲区?这样我就可以使用原点来居中。
-
啊,是的,没错。您可以通过
SpriteBatch.DrawString绘制全文 -
@DavorMlinaric 我不能,因为我没有使用
SpriteFont。我正在使用自定义BmFont类(OP 中的链接),它可以使用自定义字体。