Class: RetroRender::Dialbox
- Inherits:
-
Object
- Object
- RetroRender::Dialbox
- Defined in:
- lib/dialbox.rb
Instance Method Summary collapse
- #button_down(id) ⇒ Object
- #cut_text(text) ⇒ Object
- #done? ⇒ Boolean
- #draw(x = 0.0, y = 0.0, z = 0.0) ⇒ Object
- #draw_word(text, x, y, z) ⇒ Object
-
#initialize(window, opts = {}) ⇒ Dialbox
constructor
A new instance of Dialbox.
- #pixel_length(word) ⇒ Object
- #set_text(text) ⇒ Object
Constructor Details
#initialize(window, opts = {}) ⇒ Dialbox
Returns a new instance of Dialbox.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/dialbox.rb', line 3 def initialize(window, opts = {}) pointor_size = opts.has_key?(:pointor_size) ? opts[:pointor_size] : [24, 36] dialbox_size = opts.has_key?(:dialbox_size) ? opts[:dialbox_size] : [12, 12] font_size = opts.has_key?(:font_size) ? opts[:font_size] : [16, 16] # setup @step_duration = opts.has_key?(:step_duration) ? opts[:step_duration] : 5 # milliseconds @pointor_duration = opts.has_key?(:pointor_duration) ? opts[:pointor_duration] : 200 # milliseconds @max_lines = opts.has_key?(:max_lines) ? opts[:max_lines] : 4 @padding = opts.has_key?(:padding) ? opts[:padding] : 24 @space = opts.has_key?(:space) ? opts[:space] : 16 @line_jump = opts.has_key?(:line_jump) ? opts[:line_jump] : font_size[1] @window = window @gfx = { :pointor => Gosu::Image.load_tiles('gfx/dialbox/pointor.png', pointor_size[0], pointor_size[1], :retro=>true) } @dialbox_window = Gosu::Image.load_tiles('gfx/dialbox/base.png', dialbox_size[0], dialbox_size[1], :retro=>true) @font = Gosu::Image.load_tiles('gfx/dialbox/font.png', font_size[0], font_size[1], :retro=>true) index = 0 signs = ['!', '?', ':', '/', '-', '.', ',', "'"] @letters = Hash.new ((('a'..'z').to_a) + ('A'..'Z').to_a + ('0'..'9').to_a + signs).each do |letter| @letters[letter] = index index += 1 end @done = true @step = 0 @step_tick = Gosu::milliseconds @pointor_frame = 0 @pointor_tick = Gosu::milliseconds end |
Instance Method Details
#button_down(id) ⇒ Object
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/dialbox.rb', line 38 def (id) if id == Gosu::KbReturn if (@current_line == @first_line + @max_lines - 1 or @current_line == @lines_to_display.size - 1) and @step == @lines_to_display[@current_line].size # the total rows were displayed, we change @first_line += @max_lines @current_line += 1 @step = 0 else # let's force the three lines... immediate Display if @first_line + @max_lines - 1 < @lines_to_display.size - 1 @current_line = @first_line + @max_lines - 1 else @current_line = @lines_to_display.size - 1 end @step = @lines_to_display[@current_line].size end end end |
#cut_text(text) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'lib/dialbox.rb', line 70 def cut_text(text) @lines_to_display = Array.new @lines_to_display.push "" text.split(/ /).each do |word| if pixel_length(@lines_to_display.last) + pixel_length(word) <= @window.width - 2 * @padding @lines_to_display[@lines_to_display.size - 1] += word + " " if word.include?("\n") @lines_to_display.push "" end else @lines_to_display.push word + " " end end end |
#done? ⇒ Boolean
34 35 36 |
# File 'lib/dialbox.rb', line 34 def done? return @done end |
#draw(x = 0.0, y = 0.0, z = 0.0) ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/dialbox.rb', line 93 def draw(x = 0.0, y = 0.0, z = 0.0) # DIALBOX window content_height = ((@max_lines - 1) * @line_jump + @max_lines * @font.first.height).to_f + @padding * 2 - @dialbox_window[1].height - @dialbox_window[7].height @dialbox_window[0].draw(x, y, z) # top left corner @dialbox_window[1].draw(x + @dialbox_window[0].width, y, z, (@window.width - 2 * @dialbox_window[0].width).to_f / @dialbox_window[1].width, 1) # top border @dialbox_window[2].draw(@window.width - @dialbox_window[2].width, y, z) # top right corner @dialbox_window[3].draw(x, y + @dialbox_window[0].height, z, 1, (content_height / @dialbox_window[3].height)) # left border @dialbox_window[4].draw(x + @dialbox_window[3].width, y + @dialbox_window[1].height, z, (@window.width - @dialbox_window[3].width - @dialbox_window[5].width).to_f / @dialbox_window[4].width, content_height / @dialbox_window[4].height) # main fill @dialbox_window[5].draw(@window.width - @dialbox_window[5].width, y + @dialbox_window[1].height, z, 1, (content_height / @dialbox_window[5].height)) # right border @dialbox_window[6].draw(x, y + content_height + @dialbox_window[1].height, z) # bottom left corner @dialbox_window[7].draw(x + @dialbox_window[6].width, y + content_height + @dialbox_window[1].height, z, (@window.width - @dialbox_window[3].width - @dialbox_window[5].width).to_f / @dialbox_window[7].width, 1) # bottom border @dialbox_window[8].draw(@window.width - @dialbox_window[8].width, y + content_height + @dialbox_window[1].height, z) # bottom right corner # TEXT x, y = @padding, @padding for line in @first_line...@first_line + @max_lines if line < @lines_to_display.size if line <= @current_line text_to_draw = @lines_to_display[line] if line == @current_line text_to_draw = text_to_draw.slice(0, @step) end text_to_draw.split(' ').each do |word| draw_word(word, x, y, z) x += pixel_length(word) + @space end x = @padding; y += @line_jump + @font.first.height end end end if @current_line <= @lines_to_display.size - 1 # text step handling if Gosu::milliseconds - @step_tick >= @step_duration if @step >= @lines_to_display[@current_line].size and @current_line + 1 < @first_line + @max_lines @step = 0; @current_line += 1 if @current_line > @lines_to_display.size - 1 @current_line = @lines_to_display.size - 1 @step = @lines_to_display.last.size end else @step_tick = Gosu::milliseconds @step += 1 if @step < @lines_to_display[@current_line].size end end # pointor drawing if @current_line <= @lines_to_display.size - 1 if @step == @lines_to_display[@current_line].size and (@current_line == @first_line + @max_lines - 1 or @current_line == @lines_to_display.size - 1) if Gosu::milliseconds - @pointor_tick >= @pointor_duration @pointor_frame = (@pointor_frame == 0 ? 1 : 0) @pointor_tick = Gosu::milliseconds end @gfx[:pointor][@pointor_frame].draw(@window.width - @dialbox_window[8].width * 3, content_height - 12, 0) end end else @done = true end end |
#draw_word(text, x, y, z) ⇒ Object
85 86 87 88 89 90 91 |
# File 'lib/dialbox.rb', line 85 def draw_word(text, x, y, z) text.split('').each do |letter| raise("the letter \"#{letter}\" doesn't exist in this Font") if !@letters.has_key?(letter) @font[@letters[letter]].draw(x, y, z) x += @font.first.width end end |
#pixel_length(word) ⇒ Object
66 67 68 |
# File 'lib/dialbox.rb', line 66 def pixel_length(word) return word.size * 16 end |
#set_text(text) ⇒ Object
57 58 59 60 61 62 63 64 |
# File 'lib/dialbox.rb', line 57 def set_text(text) @done = false @step = 0 @first_line = 0 @current_line = 0 @step_tick = Gosu::milliseconds cut_text(text) end |