Центрирование текста в Госу
У меня были проблемы с центрированием текста в библиотеке 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