lib/minigl/text.rb in minigl-1.3.10 vs lib/minigl/text.rb in minigl-2.0.0
- old
+ new
@@ -1,16 +1,16 @@
-module AGL
+module MiniGL
# This class provides methods for easily drawing one or multiple lines of
# text, with control over the text alignment and coloring.
class TextHelper
# Creates a TextHelper.
#
# Parameters:
# [font] A <code>Gosu::Font</code> that will be used to draw the text.
# [line_spacing] When drawing multiple lines, the distance, in pixels,
# between each line.
- def initialize font, line_spacing = 0
+ def initialize(font, line_spacing = 0)
@font = font
@line_spacing = line_spacing
end
# Draws a single line of text.
@@ -25,23 +25,51 @@
# [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.
+ # [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.
# [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.
- def write_line text, x, y, mode = :left, color = 0, alpha = 0xff, z_index = 0
+ def write_line(text, x, y, mode = :left, color = 0,
+ effect = nil, effect_color = 0, effect_size = 1, effect_alpha = 0xff,
+ alpha = 0xff, z_index = 0)
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_rel text, x - effect_size, y - effect_size, z_index, rel, 0, 1, 1, effect_color
+ @font.draw_rel text, x, y - effect_size, z_index, rel, 0, 1, 1, effect_color
+ @font.draw_rel text, x + effect_size, y - effect_size, z_index, rel, 0, 1, 1, effect_color
+ @font.draw_rel text, x + effect_size, y, z_index, rel, 0, 1, 1, effect_color
+ @font.draw_rel text, x + effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
+ @font.draw_rel text, x, y + effect_size, z_index, rel, 0, 1, 1, effect_color
+ @font.draw_rel text, x - effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
+ @font.draw_rel text, x - effect_size, y, z_index, rel, 0, 1, 1, effect_color
+ elsif effect == :shadow
+ @font.draw_rel text, x + effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
+ end
+ end
@font.draw_rel text, x, y, z_index, rel, 0, 1, 1, color
end
# Draws text, breaking lines when needed and when explicitly caused by the
# "\n" character.
@@ -60,11 +88,11 @@
# [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.
- def write_breaking text, x, y, width, mode = :left, color = 0, alpha = 0xff, z_index = 0
+ def write_breaking(text, x, y, width, mode = :left, color = 0, alpha = 0xff, z_index = 0)
color = (alpha << 24) | color
text.split("\n").each do |p|
if mode == :justified
y = write_paragraph_justified p, x, y, width, color, z_index
else
@@ -80,29 +108,29 @@
end
end
private
- def write_paragraph text, x, y, width, rel, color, z_index
- line = ""
+ def write_paragraph(text, x, y, width, rel, color, z_index)
+ line = ''
line_width = 0
text.split(' ').each do |word|
w = @font.text_width word
if line_width + w > width
@font.draw_rel line.chop, x, y, z_index, rel, 0, 1, 1, color
- line = ""
+ line = ''
line_width = 0
y += @font.height + @line_spacing
end
line += "#{word} "
line_width += @font.text_width "#{word} "
end
@font.draw_rel line.chop, x, y, z_index, rel, 0, 1, 1, color unless line.empty?
y + @font.height + @line_spacing
end
- def write_paragraph_justified text, x, y, width, color, z_index
- space_width = @font.text_width " "
+ def write_paragraph_justified(text, x, y, width, color, z_index)
+ space_width = @font.text_width ' '
spaces = [[]]
line_index = 0
new_x = x
words = text.split(' ')
words.each do |word|