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|