class MiniGL::TextHelper

This class provides methods for easily drawing one or multiple lines of text, with control over the text alignment and coloring.

Public Class Methods

new(font, line_spacing = 0, scale_x = 1, scale_y = 1) click to toggle source

Creates a TextHelper.

Parameters:

font

A Gosu::Font or ImageFont that will be used to draw the text.

line_spacing

When drawing multiple lines, the default distance, in pixels, between each line.

scale_x

The default horizontal scale of the font.

scale_y

The default vertical scale of the font.

# File lib/minigl/text.rb, line 135
def initialize(font, line_spacing = 0, scale_x = 1, scale_y = 1)
  @font = font
  @line_spacing = line_spacing
  @scale_x = scale_x
  @scale_y = scale_y
end

Public Instance Methods

write_breaking(text, x, y, width, mode = :left, color = 0, alpha = 0xff, z_index = 0, scale_x = nil, scale_y = nil, line_spacing = nil) click to toggle source

Draws text, breaking lines when needed and when explicitly caused by the “n” character.

Parameters:

text

The text to be drawn. Line breaks are allowed. You can use the ‘<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.

x

The horizontal reference for drawing the text. Works like in write_line for the :left, :right and :center modes. For the :justified mode, works the same as for :left.

y

The vertical reference for drawing the text. All text will be drawn from this point down.

width

The maximum width for the lines of text. Line is broken when this width is exceeded.

mode

The alignment of the text. Valid values are :left, :right, :center and :justified.

color

The color of the text, in hexadecimal RRGGBB format.

alpha

The opacity of the text. Valid values vary from 0 (fully transparent) to 255 (fully opaque).

z_index

The z-order to draw the object. Objects with larger z-orders will be drawn on top of the ones with smaller z-orders.

scale_x

The horizontal scaling of the text. If nil, this instance’s +@scale_x+ value will be used.

scale_y

The vertical scaling of the text. If nil, this instance’s +@scale_y+ value will be used.

line_spacing

The spacing between lines, in pixels. If nil, this instance’s +@line_spacing+ value will be used.

# File lib/minigl/text.rb, line 252
def write_breaking(text, x, y, width, mode = :left, color = 0, alpha = 0xff, z_index = 0, scale_x = nil, scale_y = nil, line_spacing = nil)
  line_spacing = @line_spacing if line_spacing.nil?
  scale_x = @scale_x if scale_x.nil?
  scale_y = @scale_y if scale_y.nil?
  color = (alpha << 24) | color
  text.split("\n").each do |p|
    if mode == :justified
      y = write_paragraph_justified p, x, y, width, color, z_index, scale_x, scale_y, line_spacing
    else
      rel =
        case mode
        when :left then 0
        when :center then 0.5
        when :right then 1
        else 0
        end
      y = write_paragraph p, x, y, width, rel, color, z_index, scale_x, scale_y, line_spacing
    end
  end
end
write_line(text, x = nil, y = nil, mode = :left, color = 0, alpha = 0xff, effect = nil, effect_color = 0, effect_size = 1, effect_alpha = 0xff, z_index = 0, scale_x = nil, scale_y = nil) click to toggle source

Draws a single line of text.

Parameters:

text

The text to be drawn. No line breaks are allowed. You can use the ‘<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.

x

The horizontal reference for drawing the text. If mode is :left, all text will be drawn from this point to the right; if mode is :right, all text will be drawn from this point to the left; and if mode is :center, the text will be equally distributed to the left and to the right of this point.

y

The vertical reference for drawing the text. All text will be drawn from this point down.

mode

The alignment of the text. Valid values are :left, :right and :center.

color

The color of the text, in hexadecimal RRGGBB format.

alpha

The opacity of the text. Valid values vary from 0 (fully transparent) to 255 (fully opaque).

effect

Effect to add to the text. It can be either nil, for no effect, :border for bordered text, or :shadow for shadowed text (the shadow is always placed below and to the right of the text).

effect_color

Color of the effect, if any.

effect_size

Size of the effect, if any. In the case of :border, this will be the width of the border (the border will only look good when effect_size is relatively small, compared to the size of the font); in the case of :shadow, it will be the distance between the text and the shadow.

effect_alpha

Opacity of the effect, if any. For shadows, it is usual to provide less than 255.

z_index

The z-order to draw the object. Objects with larger z-orders will be drawn on top of the ones with smaller z-orders.

scale_x

The horizontal scaling of the text. If nil, this instance’s +@scale_x+ value will be used.

scale_y

The vertical scaling of the text. If nil, this instance’s +@scale_y+ value will be used.

Obs.: This method accepts named parameters, but text, x and y are mandatory.

# File lib/minigl/text.rb, line 179
def write_line(text, x = nil, y = nil, mode = :left, color = 0, alpha = 0xff,
               effect = nil, effect_color = 0, effect_size = 1, effect_alpha = 0xff,
               z_index = 0, scale_x = nil, scale_y = nil)
  if text.is_a? Hash
    x = text[:x]
    y = text[:y]
    mode = text.fetch(:mode, :left)
    color = text.fetch(:color, 0)
    alpha = text.fetch(:alpha, 0xff)
    effect = text.fetch(:effect, nil)
    effect_color = text.fetch(:effect_color, 0)
    effect_size = text.fetch(:effect_size, 1)
    effect_alpha = text.fetch(:effect_alpha, 0xff)
    z_index = text.fetch(:z_index, 0)
    scale_x = text.fetch(:scale_x, nil)
    scale_y = text.fetch(:scale_y, nil)
    text = text[:text]
  end

  scale_x = @scale_x if scale_x.nil?
  scale_y = @scale_y if scale_y.nil?
  color = (alpha << 24) | color
  rel =
    case mode
    when :left then 0
    when :center then 0.5
    when :right then 1
    else 0
    end
  if effect
    effect_color = (effect_alpha << 24) | effect_color
    if effect == :border
      @font.draw_markup_rel text, x - effect_size, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
      @font.draw_markup_rel text, x, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
      @font.draw_markup_rel text, x + effect_size, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
      @font.draw_markup_rel text, x + effect_size, y, z_index, rel, 0, scale_x, scale_y, effect_color
      @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
      @font.draw_markup_rel text, x, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
      @font.draw_markup_rel text, x - effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
      @font.draw_markup_rel text, x - effect_size, y, z_index, rel, 0, scale_x, scale_y, effect_color
    elsif effect == :shadow
      @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
    end
  end
  @font.draw_markup_rel text, x, y, z_index, rel, 0, scale_x, scale_y, color
end

Private Instance Methods

write_paragraph(text, x, y, width, rel, color, z_index, scale_x, scale_y, line_spacing) click to toggle source
# File lib/minigl/text.rb, line 275
def write_paragraph(text, x, y, width, rel, color, z_index, scale_x, scale_y, line_spacing)
  line = ''
  line_width = 0
  text.split(' ').each do |word|
    w = @font.markup_width(word)
    if line_width + w * scale_x > width
      @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, scale_x, scale_y, color
      line = ''
      line_width = 0
      y += (@font.height + line_spacing) * scale_y
    end
    line += "#{word} "
    line_width += @font.markup_width("#{word} ") * scale_x
  end
  @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, scale_x, scale_y, color unless line.empty?
  y + (@font.height + line_spacing) * scale_y
end
write_paragraph_justified(text, x, y, width, color, z_index, scale_x, scale_y, line_spacing) click to toggle source
# File lib/minigl/text.rb, line 293
def write_paragraph_justified(text, x, y, width, color, z_index, scale_x, scale_y, line_spacing)
  space_width = @font.text_width(' ') * scale_x
  spaces = [[]]
  line_index = 0
  new_x = x
  words = text.split(' ')
  words.each do |word|
    w = @font.markup_width(word)
    if new_x + w * scale_x > x + width
      space = x + width - new_x + space_width
      index = 0
      while space > 0
        spaces[line_index][index] += 1
        space -= 1
        index += 1
        index = 0 if index == spaces[line_index].size - 1
      end

      spaces << []
      line_index += 1

      new_x = x
    end
    new_x += @font.markup_width(word) * scale_x + space_width
    spaces[line_index] << space_width
  end

  index = 0
  spaces.each do |line|
    new_x = x
    line.each do |s|
      @font.draw_markup(words[index], new_x, y, z_index, scale_x, scale_y, color)
      new_x += @font.markup_width(words[index]) * scale_x + s
      index += 1
    end
    y += (@font.height + line_spacing) * scale_y
  end
  y
end