Центрирование текста в Госу

У меня были проблемы с центрированием текста в библиотеке 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. Теперь это, похоже, работает при выравнивании по вертикали.

Тем не менее, по горизонтали это отдельная история... Кажется, она берет верхний левый угол текста и центрирует его, как я и ожидал, вместо середины текста.

Кто-нибудь получил формулу для этого? Я перепробовал кучу вещей, и только подошел близко.

3 ответа

Решение
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 должен работать для вас, как только вы нашли центр кадра.

Я знаю, что это старый вопрос, но у меня была эта проблема сегодня утром, и я нашел это решение.

  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" или любой другой шрифт в вашей системе. Тем не менее, оставьте 0 для x-позиции (первый параметр draw()), так как текстовое изображение по центру имеет такую ​​же ширину, что и ширина окна.

Смотрите ссылки ниже для получения дополнительной информации о 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
Другие вопросы по тегам