Gosu 中的居中文本

Centering text in Gosu

我一直无法将 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。现在这似乎在垂直对齐时起作用了。

然而,横向是另一回事......似乎 将文本的左上角置于我期望的居中位置,而不是文本的中间位置。

有人知道这个的公式吗?我尝试了一大堆东西,只差一点。

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

您的 @messageGosu::Image

的实例

据我所知,class有一个方法可以让你将图像的旋转中心对准指定的点,draw_rot

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

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

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

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

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

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

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

迟到总比不到好...

无需将文本转换为图像。只需使用 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