5

我一直无法将 Gosu 库中的文本居中到屏幕的绝对中间。

require 'gosu'

class GameWindow < Gosu::Window
  def initialize (width=800, height=600, fullscreen=false)
    super
    self.caption = 'Hello'
    @message = Gosu::Image.from_text(
        self, 'HELLO WORLD', Gosu.default_font_name, 45)
  end

  def draw
    @message.draw(377.5,277.5,0)
  end
end

window = GameWindow.new
window.show 


我的第一种方法是取height屏幕的 ,减去文本的高度45,然后除以 2。现在垂直对齐时这似乎有效。

在此处输入图像描述

然而,水平是一个不同的故事......它似乎占据了文本的左上角并将其居中,这是我期望的,而不是文本的中间。

在此处输入图像描述

有人有这个公式吗?我尝试了一大堆东西,但都接近了。

4

3 回答 3

4
class GameWindow < Gosu::Window
  def initialize (width=800, height=600, fullscreen=false)
    super
    self.caption = 'Hello'
    @message = Gosu::Image.from_text(
        self, 'HELLO WORLD', Gosu.default_font_name, 45)
  end

  def draw
    @message.draw(377.5,277.5,0)
  end
end

@message是一个实例Gosu::Image

据我所见,该类有一个方法可以让您将图像的旋转中心与指定点对齐,draw_rot

一旦找到框架的中心,使用draw_rot而不是应该对您有用。draw

于 2015-08-23T18:42:28.027 回答
0

我知道这是一个老问题,但我今天早些时候遇到了这个问题并想出了这个解决方案。

  def draw_centered_text(text, size, font)
    centered_text = Gosu::Image.from_text(text, size, {:width => WIDTH, :align => :center, :font => font})
  end

上面的函数将传递的文本转换为宽度等于 WIDTH 的图像(在我的例子中是一个存储窗口宽度的常量)并且文本居中。然后,您可以像这样调用该函数:

draw_centered_text("Your text", 20, "Arial Bold").draw(0, 50, 0, 1, 1, Gosu::Color::WHITE)

您可以将 20 和 50 替换为您想要的任何行高(字体大小)和 y 位置,就像您可以将“Arial Bold”更改为“Arial”或系统上的任何其他字体一样。但是,将 x 位置(的第一个参数draw())保留为 0,因为居中的文本图像的宽度与窗口宽度相同。

from_text()有关和的更多信息,请参阅以下链接draw()

于 2018-10-07T10:55:11.133 回答
0

迟到总比不到好...

无需将文本转换为图像。只需使用 Font.draw_text_rel 方法中可用的两个参数使文本居中:rel_x 和 rel_y。请参阅下面的代码(稍作修改)。

见:https ://www.rubydoc.info/gems/gosu/Gosu%2FFont:draw_text_rel

require 'gosu'

class GameWindow < Gosu::Window
  def initialize (width=800, height=600, fullscreen=false)
    super
    self.caption = 'Hello'
    # @message = Gosu::Image.from_text(
    #     self, 'HELLO WORLD', Gosu.default_font_name, 45)
    @font = Gosu::Font.new(45)
    @message = "HELLO WORLD"
  end

  def draw
    @font.draw_text_rel(@message, width / 2, height / 2, 1, rel_x = 0.5, rel_y = 0.5)
  end
end

window = GameWindow.new
window.show
于 2021-10-25T19:11:00.263 回答