minigl 2.2.5 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 17cfec4fd44f2a4796d2be16f7de9d19ab5be6d9d3dce59fb5e0154c9fb153ae
4
- data.tar.gz: 542db7203b4c9cec72be26037058ab9fec3487078da77c4099056ea0a96dace2
3
+ metadata.gz: e0362df674b485b64cd44d6b167377b2d46d6c33fd9b2d65428fe75e8de9e027
4
+ data.tar.gz: d91ae820bfc76cb9895f43227646028b23927cffe2e4b226f3b2b14779fe08a3
5
5
  SHA512:
6
- metadata.gz: 87bd0c8b076fa41be74210c657dd7eeaf90ce1d7768a211018de80d7c807b6b5a776b76c317998e660d60c09550b772f2dd6783f53556fd50c746c3c27f67fcf
7
- data.tar.gz: e47d4b80ec4979ca6e8b63c6b818d247a3ff9af939447d4b4bf68d2d01c0fb934211311ee2c1abb41014981703ef0d8cf72fc7bcaa313cadc9432b81fbd6fe93
6
+ metadata.gz: 70af1a521abd0f23110b62b2c88a1de5f1fd94aeb664fc8c9e4ca8cd414a024c0ac93037889b9b8431598c7e63cf11e62b00f657213f5eb68957da70ca4fdfc5
7
+ data.tar.gz: 685115af1a42dc3662af276580771b0be33eae0348fd54e1f11f679c2de26a10f8d158a9d00cf0e67ae42ae5bab2af4841adbf466aca38b46b6e75665ca3b773
data/README.md CHANGED
@@ -5,9 +5,9 @@ top of the [Gosu](http://www.libgosu.org/) gem.
5
5
 
6
6
  It provides the following features:
7
7
 
8
- * Resource management (images, sounds, ...)
9
- * Input manipulation (keyboard, mouse, ...)
10
- * UI (text, buttons, text fields, ...)
8
+ * Resource management (images, sound effects, songs, tilesets, fonts)
9
+ * Input manipulation (keyboard, mouse, joystick)
10
+ * UI (text, buttons, text fields, drop-down lists, progress bars)
11
11
  * Basic physics and collision checking
12
12
  * Animated objects
13
13
 
@@ -29,6 +29,12 @@ After installing the Gosu dependencies, you can just `gem install minigl`.
29
29
  * The [wiki](https://github.com/victords/minigl/wiki) is a work in progress with tutorials and examples.
30
30
  * Test package and examples aren't complete!
31
31
 
32
- ## Version 2.2.5
32
+ ## Version 2.3.0
33
33
 
34
- * Fixed `Sprite#animate_once` and added the possibility of passing a callback.
34
+ * Added the `ImageFont` class.
35
+ * Added scale and line spacing options to `TextHelper` methods.
36
+
37
+ ## Contributing
38
+
39
+ Contributions are very welcome. Feel free to fork and send pull requests.
40
+ Also, you can support my work by donating bitcoins to this wallet: bc1qsp7mypdqvkt88xtnarmaytt0etxfccxr5pt5tk
@@ -37,6 +37,9 @@ module MiniGL
37
37
  # The height of the component
38
38
  attr_reader :h
39
39
 
40
+ # The text of the component
41
+ attr_reader :text
42
+
40
43
  attr_reader :anchor, :anchor_offset_x, :anchor_offset_y # :nodoc:
41
44
 
42
45
  # Determines whether the control is enabled, i.e., will process user input.
@@ -52,6 +55,8 @@ module MiniGL
52
55
  # for each specific component class.
53
56
  attr_accessor :params
54
57
 
58
+ attr_accessor :panel # :nodoc:
59
+
55
60
  def initialize(x, y, font, text, text_color, disabled_text_color) # :nodoc:
56
61
  @x = x
57
62
  @y = y
@@ -127,6 +132,7 @@ module MiniGL
127
132
  controls.each do |c|
128
133
  _, x, y = FormUtils.check_anchor(c.anchor, c.anchor_offset_x, c.anchor_offset_y, c.w, c.h, @w, @h)
129
134
  c.set_position(@x + x, @y + y)
135
+ c.panel = self
130
136
  end
131
137
 
132
138
  if img
@@ -537,9 +543,6 @@ module MiniGL
537
543
 
538
544
  # This class represents a text field (input).
539
545
  class TextField < Component
540
- # The current text inside the text field.
541
- attr_reader :text
542
-
543
546
  # The current 'locale' used for detecting the keys. THIS FEATURE IS
544
547
  # INCOMPLETE!
545
548
  attr_reader :locale
@@ -1460,6 +1463,22 @@ module MiniGL
1460
1463
  super(x, y, font, text, text_color, disabled_text_color)
1461
1464
  end
1462
1465
 
1466
+ # Changes the label's text.
1467
+ #
1468
+ # Parameters:
1469
+ # [new_text] The new text to show in the label.
1470
+ def text=(new_text)
1471
+ @text = new_text
1472
+ @w = @font.text_width(@text) * @scale_x
1473
+ x = @anchor_offset_x; y = @anchor_offset_y
1474
+ _, x, y = FormUtils.check_anchor(@anchor, x, y, @w, @h, panel ? panel.w : G.window.width, panel ? panel.h : G.window.height)
1475
+ if panel
1476
+ set_position(panel.x + x, panel.y + y)
1477
+ else
1478
+ set_position(x, y)
1479
+ end
1480
+ end
1481
+
1463
1482
  # Draws the label.
1464
1483
  #
1465
1484
  # Parameters:
@@ -82,7 +82,10 @@ module MiniGL
82
82
  # [interval] The amount of frames between each change in the image index.
83
83
  # See +animate+ for details.
84
84
  def animate_once(indices, interval)
85
- return if @animate_once_control == 2
85
+ if @animate_once_control == 2
86
+ return if indices == @animate_once_indices && interval == @animate_once_interval
87
+ @animate_once_control = 0
88
+ end
86
89
 
87
90
  unless @animate_once_control == 1
88
91
  @anim_counter = 0
@@ -247,9 +247,7 @@ module MiniGL
247
247
  end
248
248
  end
249
249
 
250
- #class JSHelper
251
-
252
- # Exposes methods for controlling keyboard events.
250
+ # Exposes methods for controlling keyboard and gamepad events.
253
251
  module KB
254
252
  class << self
255
253
  # This is called by <code>GameWindow.initialize</code>. Don't call it
@@ -278,7 +276,27 @@ module MiniGL
278
276
  Gosu::KB_PAGE_UP, Gosu::KB_PERIOD, Gosu::KB_RETURN, Gosu::KB_RIGHT,
279
277
  Gosu::KB_RIGHT_ALT, Gosu::KB_RIGHT_BRACKET, Gosu::KB_RIGHT_CONTROL,
280
278
  Gosu::KB_RIGHT_META, Gosu::KB_RIGHT_SHIFT, Gosu::KB_SEMICOLON,
281
- Gosu::KB_SLASH, Gosu::KB_SPACE, Gosu::KB_TAB, Gosu::KB_UP
279
+ Gosu::KB_SLASH, Gosu::KB_SPACE, Gosu::KB_TAB, Gosu::KB_UP,
280
+ Gosu::GP_0_BUTTON_0, Gosu::GP_0_BUTTON_1, Gosu::GP_0_BUTTON_2, Gosu::GP_0_BUTTON_3,
281
+ Gosu::GP_0_BUTTON_4, Gosu::GP_0_BUTTON_5, Gosu::GP_0_BUTTON_6, Gosu::GP_0_BUTTON_7,
282
+ Gosu::GP_0_BUTTON_8, Gosu::GP_0_BUTTON_9, Gosu::GP_0_BUTTON_10, Gosu::GP_0_BUTTON_11,
283
+ Gosu::GP_0_BUTTON_12, Gosu::GP_0_BUTTON_13, Gosu::GP_0_BUTTON_14, Gosu::GP_0_BUTTON_15,
284
+ Gosu::GP_0_DOWN, Gosu::GP_0_LEFT, Gosu::GP_0_RIGHT, Gosu::GP_0_UP,
285
+ Gosu::GP_1_BUTTON_0, Gosu::GP_1_BUTTON_1, Gosu::GP_1_BUTTON_2, Gosu::GP_1_BUTTON_3,
286
+ Gosu::GP_1_BUTTON_4, Gosu::GP_1_BUTTON_5, Gosu::GP_1_BUTTON_6, Gosu::GP_1_BUTTON_7,
287
+ Gosu::GP_1_BUTTON_8, Gosu::GP_1_BUTTON_9, Gosu::GP_1_BUTTON_10, Gosu::GP_1_BUTTON_11,
288
+ Gosu::GP_1_BUTTON_12, Gosu::GP_1_BUTTON_13, Gosu::GP_1_BUTTON_14, Gosu::GP_1_BUTTON_15,
289
+ Gosu::GP_1_DOWN, Gosu::GP_1_LEFT, Gosu::GP_1_RIGHT, Gosu::GP_1_UP,
290
+ Gosu::GP_2_BUTTON_0, Gosu::GP_2_BUTTON_1, Gosu::GP_2_BUTTON_2, Gosu::GP_2_BUTTON_3,
291
+ Gosu::GP_2_BUTTON_4, Gosu::GP_2_BUTTON_5, Gosu::GP_2_BUTTON_6, Gosu::GP_2_BUTTON_7,
292
+ Gosu::GP_2_BUTTON_8, Gosu::GP_2_BUTTON_9, Gosu::GP_2_BUTTON_10, Gosu::GP_2_BUTTON_11,
293
+ Gosu::GP_2_BUTTON_12, Gosu::GP_2_BUTTON_13, Gosu::GP_2_BUTTON_14, Gosu::GP_2_BUTTON_15,
294
+ Gosu::GP_2_DOWN, Gosu::GP_2_LEFT, Gosu::GP_2_RIGHT, Gosu::GP_2_UP,
295
+ Gosu::GP_3_BUTTON_0, Gosu::GP_3_BUTTON_1, Gosu::GP_3_BUTTON_2, Gosu::GP_3_BUTTON_3,
296
+ Gosu::GP_3_BUTTON_4, Gosu::GP_3_BUTTON_5, Gosu::GP_3_BUTTON_6, Gosu::GP_3_BUTTON_7,
297
+ Gosu::GP_3_BUTTON_8, Gosu::GP_3_BUTTON_9, Gosu::GP_3_BUTTON_10, Gosu::GP_3_BUTTON_11,
298
+ Gosu::GP_3_BUTTON_12, Gosu::GP_3_BUTTON_13, Gosu::GP_3_BUTTON_14, Gosu::GP_3_BUTTON_15,
299
+ Gosu::GP_3_DOWN, Gosu::GP_3_LEFT, Gosu::GP_3_RIGHT, Gosu::GP_3_UP,
282
300
  ]
283
301
  @down = []
284
302
  @prev_down = []
@@ -360,17 +360,16 @@ module MiniGL
360
360
  # [speed] If the first argument is a forces vector, then this should be
361
361
  # +nil+. If it is a point, then this is the constant speed at which
362
362
  # the object will move (provided as a scalar, not a vector).
363
- # [obstacles] An array of obstacles to be considered in the collision
364
- # checking, and carried along when colliding from above.
365
- # Obstacles must be instances of Block (or derived classes),
366
- # or objects that <code>include Movement</code>.
367
- # [obst_obstacles] Obstacles that should be considered when moving objects
368
- # from the +obstacles+ array, i.e., these obstacles won't
369
- # interfere in the elevator's movement, but in the movement
370
- # of the objects being carried.
371
- # [obst_ramps] Ramps to consider when moving objects from the +obstacles+
372
- # array, as described for +obst_obstacles+.
373
- def move_carrying(arg, speed, obstacles, obst_obstacles, obst_ramps)
363
+ # [carried_objs] An array of objects that can potentially be carried by
364
+ # this object while it moves. The objects must respond to
365
+ # +x+, +y+, +w+ and +h+.
366
+ # [obstacles] Obstacles that should be considered for collision checking
367
+ # with the carried objects, if they include the +Movement+
368
+ # module, and with this object too, if moving with forces.
369
+ # [ramps] Ramps that should be considered for the carried objects, if they
370
+ # include the +Movement+ module, and for this object too, if moving
371
+ # with forces.
372
+ def move_carrying(arg, speed, carried_objs, obstacles, ramps)
374
373
  if speed
375
374
  x_d = arg.x - @x; y_d = arg.y - @y
376
375
  distance = Math.sqrt(x_d**2 + y_d**2)
@@ -382,18 +381,11 @@ module MiniGL
382
381
 
383
382
  @speed.x = 1.0 * x_d * speed / distance
384
383
  @speed.y = 1.0 * y_d * speed / distance
385
- else
386
- arg += G.gravity
387
- @speed.x += arg.x / @mass; @speed.y += arg.y / @mass
388
- @speed.x = 0 if @speed.x.abs < G.min_speed.x
389
- @speed.y = 0 if @speed.y.abs < G.min_speed.y
390
- @speed.x = (@speed.x <=> 0) * @max_speed.x if @speed.x.abs > @max_speed.x
391
- @speed.y = (@speed.y <=> 0) * @max_speed.y if @speed.y.abs > @max_speed.y
384
+ x_aim = @x + @speed.x; y_aim = @y + @speed.y
392
385
  end
393
386
 
394
- x_aim = @x + @speed.x; y_aim = @y + @speed.y
395
387
  passengers = []
396
- obstacles.each do |o|
388
+ carried_objs.each do |o|
397
389
  if @x + @w > o.x && o.x + o.w > @x
398
390
  foot = o.y + o.h
399
391
  if foot.round(6) == @y.round(6) || @speed.y < 0 && foot < @y && foot > y_aim
@@ -415,25 +407,30 @@ module MiniGL
415
407
  @y = y_aim
416
408
  end
417
409
  else
418
- @x = x_aim; @y = y_aim
410
+ move(arg, obstacles, ramps)
419
411
  end
420
412
 
421
413
  forces = Vector.new @x - prev_x, @y - prev_y
422
414
  prev_g = G.gravity.clone
423
415
  G.gravity.x = G.gravity.y = 0
424
416
  passengers.each do |p|
425
- prev_speed = p.speed.clone
426
- prev_forces = p.stored_forces.clone
427
- prev_bottom = p.bottom
428
- p.speed.x = p.speed.y = 0
429
- p.stored_forces.x = p.stored_forces.y = 0
430
- p.instance_exec { @bottom = nil }
431
- p.move forces * p.mass, obst_obstacles, obst_ramps
432
- p.speed.x = prev_speed.x
433
- p.speed.y = prev_speed.y
434
- p.stored_forces.x = prev_forces.x
435
- p.stored_forces.y = prev_forces.y
436
- p.instance_exec(prev_bottom) { |b| @bottom = b }
417
+ if p.class.included_modules.include?(Movement)
418
+ prev_speed = p.speed.clone
419
+ prev_forces = p.stored_forces.clone
420
+ prev_bottom = p.bottom
421
+ p.speed.x = p.speed.y = 0
422
+ p.stored_forces.x = p.stored_forces.y = 0
423
+ p.instance_exec { @bottom = nil }
424
+ p.move(forces * p.mass, obstacles, ramps)
425
+ p.speed.x = prev_speed.x
426
+ p.speed.y = prev_speed.y
427
+ p.stored_forces.x = prev_forces.x
428
+ p.stored_forces.y = prev_forces.y
429
+ p.instance_exec(prev_bottom) { |b| @bottom = b }
430
+ else
431
+ p.x += forces.x
432
+ p.y += forces.y
433
+ end
437
434
  end
438
435
  G.gravity = prev_g
439
436
  end
@@ -504,16 +501,32 @@ module MiniGL
504
501
  # of the objects being carried.
505
502
  # [obst_ramps] Ramps to consider when moving objects from the +obstacles+
506
503
  # array, as described for +obst_obstacles+.
507
- def cycle(points, speed, obstacles = nil, obst_obstacles = nil, obst_ramps = nil)
508
- @cur_point = 0 if @cur_point.nil?
509
- if obstacles
510
- move_carrying points[@cur_point], speed, obstacles, obst_obstacles, obst_ramps
511
- else
512
- move_free points[@cur_point], speed
504
+ # [stop_time] Optional stop time (in frames) when the object reaches each of
505
+ # the points.
506
+ def cycle(points, speed, obstacles = nil, obst_obstacles = nil, obst_ramps = nil, stop_time = 0)
507
+ unless @cycle_setup
508
+ @cur_point = 0 if @cur_point.nil?
509
+ if obstacles
510
+ move_carrying points[@cur_point], speed, obstacles, obst_obstacles, obst_ramps
511
+ else
512
+ move_free points[@cur_point], speed
513
+ end
513
514
  end
514
515
  if @speed.x == 0 and @speed.y == 0
515
- if @cur_point == points.length - 1; @cur_point = 0
516
- else; @cur_point += 1; end
516
+ unless @cycle_setup
517
+ @cycle_timer = 0
518
+ @cycle_setup = true
519
+ end
520
+ if @cycle_timer >= stop_time
521
+ if @cur_point == points.length - 1
522
+ @cur_point = 0
523
+ else
524
+ @cur_point += 1
525
+ end
526
+ @cycle_setup = false
527
+ else
528
+ @cycle_timer += 1
529
+ end
517
530
  end
518
531
  end
519
532
 
@@ -1,4 +1,100 @@
1
1
  module MiniGL
2
+ # This class represents a font and exposes most of the methods from +Gosu::Font+,
3
+ # but allows the font to be created from an image, allowing for better customization
4
+ # and also using the +retro+ option.
5
+ #
6
+ # The image used to load the font must meet these criteria:
7
+ # * The characters should be laid out in lines of the same height in pixels.
8
+ # * The full image must have a height that is a multiple of that line height.
9
+ # * The characters should occupy the maximum available space in each line, i.e.,
10
+ # if a character fits in the current line it must not be placed in the next
11
+ # one. In the last line there can be any amount of free space at the end.
12
+ class ImageFont
13
+ # The height of this font in pixels.
14
+ attr_reader :height
15
+
16
+ # Creates an +ImageFont+.
17
+ #
18
+ # Parameters:
19
+ # [img_path] Identifier of an image fitting the description in the class documentation,
20
+ # as used in +Res.img+.
21
+ # [chars] A string containing all characters that will be present in the image, in the
22
+ # same order as they appear in the image. Do not include white space.
23
+ # [widths] An integer representing the width of the chars in pixels, if this is a fixed
24
+ # width font, or an array containing the width of each char, in the same order
25
+ # as they appear in the +chars+ string.
26
+ # [height] The height of the lines in the image (see description above).
27
+ # [space_width] The width of the white space character in this font.
28
+ # [global] Parameter that will be passed to +Res.img+ when loading the image.
29
+ # [ext] Parameter that will be passed to +Res.img+ when loading the image.
30
+ # [retro] Parameter that will be passed to +Res.img+ when loading the image.
31
+ def initialize(img_path, chars, widths, height, space_width, global = true, ext = '.png', retro = nil)
32
+ retro = Res.retro_images if retro.nil?
33
+ img = Res.img(img_path, global, false, ext, retro)
34
+ @chars = chars
35
+ @images = []
36
+ @height = height
37
+ @space_width = space_width
38
+ wa = widths.is_a?(Array)
39
+ if wa && widths.length != chars.length
40
+ raise 'Wrong widths array size!'
41
+ end
42
+ x = y = 0
43
+ (0...chars.length).each do |i|
44
+ @images.push(img.subimage(x, y, wa ? widths[i] : widths, height))
45
+ new_x = x + (wa ? widths[i] : widths)
46
+ if i < chars.length - 1 && new_x + (wa ? widths[i+1] : widths) > img.width
47
+ x = 0
48
+ y += height
49
+ else
50
+ x = new_x
51
+ end
52
+ end
53
+ end
54
+
55
+ # Returns the width, in pixels, of a given string written by this font.
56
+ #
57
+ # Parameters:
58
+ # [text] The string to be measured
59
+ def markup_width(text)
60
+ text.chars.reduce(0) { |w, c| if c == ' '; w += @space_width; else; i = @chars.index(c); w += i ? @images[i].width : 0; end }
61
+ end
62
+
63
+ # See <code>Gosu::Font#draw_markup_rel</code> for details.
64
+ def draw_markup_rel(text, x, y, z, rel_x, rel_y, scale_x, scale_y, color)
65
+ text = text.to_s unless text.is_a?(String)
66
+ if rel_x == 0.5
67
+ x -= scale_x * markup_width(text) / 2
68
+ elsif rel_x == 1
69
+ x -= scale_x * markup_width(text)
70
+ end
71
+ if rel_y == 0.5
72
+ y -= scale_y * @height / 2
73
+ elsif rel_y == 1
74
+ y -= scale_x * @height
75
+ end
76
+ text.each_char do |c|
77
+ if c == ' '
78
+ x += scale_x * @space_width
79
+ next
80
+ end
81
+ i = @chars.index(c)
82
+ next if i.nil?
83
+ @images[i].draw(x, y, z, scale_x, scale_y, color)
84
+ x += scale_x * @images[i].width
85
+ end
86
+ end
87
+
88
+ # See <code>Gosu::Font#draw_markup</code> for details.
89
+ def draw_markup(text, x, y, z, scale_x, scale_y, color)
90
+ draw_markup_rel(text, x, y, z, 0, 0, scale_x, scale_y, color)
91
+ end
92
+
93
+ alias :draw_text_rel :draw_markup_rel
94
+ alias :draw_text :draw_markup
95
+ alias :text_width :markup_width
96
+ end
97
+
2
98
  # This class provides methods for easily drawing one or multiple lines of
3
99
  # text, with control over the text alignment and coloring.
4
100
  class TextHelper
@@ -8,9 +104,11 @@ module MiniGL
8
104
  # [font] A <code>Gosu::Font</code> that will be used to draw the text.
9
105
  # [line_spacing] When drawing multiple lines, the distance, in pixels,
10
106
  # between each line.
11
- def initialize(font, line_spacing = 0)
107
+ def initialize(font, line_spacing = 0, scale_x = 1, scale_y = 1)
12
108
  @font = font
13
109
  @line_spacing = line_spacing
110
+ @scale_x = scale_x
111
+ @scale_y = scale_y
14
112
  end
15
113
 
16
114
  # Draws a single line of text.
@@ -48,7 +146,7 @@ module MiniGL
48
146
  # mandatory.
49
147
  def write_line(text, x = nil, y = nil, mode = :left, color = 0, alpha = 0xff,
50
148
  effect = nil, effect_color = 0, effect_size = 1, effect_alpha = 0xff,
51
- z_index = 0)
149
+ z_index = 0, scale_x = nil, scale_y = nil)
52
150
  if text.is_a? Hash
53
151
  x = text[:x]
54
152
  y = text[:y]
@@ -60,9 +158,13 @@ module MiniGL
60
158
  effect_size = text.fetch(:effect_size, 1)
61
159
  effect_alpha = text.fetch(:effect_alpha, 0xff)
62
160
  z_index = text.fetch(:z_index, 0)
161
+ scale_x = text.fetch(:scale_x, nil)
162
+ scale_y = text.fetch(:scale_y, nil)
63
163
  text = text[:text]
64
164
  end
65
165
 
166
+ scale_x = @scale_x if scale_x.nil?
167
+ scale_y = @scale_y if scale_y.nil?
66
168
  color = (alpha << 24) | color
67
169
  rel =
68
170
  case mode
@@ -74,19 +176,19 @@ module MiniGL
74
176
  if effect
75
177
  effect_color = (effect_alpha << 24) | effect_color
76
178
  if effect == :border
77
- @font.draw_markup_rel text, x - effect_size, y - effect_size, z_index, rel, 0, 1, 1, effect_color
78
- @font.draw_markup_rel text, x, y - effect_size, z_index, rel, 0, 1, 1, effect_color
79
- @font.draw_markup_rel text, x + effect_size, y - effect_size, z_index, rel, 0, 1, 1, effect_color
80
- @font.draw_markup_rel text, x + effect_size, y, z_index, rel, 0, 1, 1, effect_color
81
- @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
82
- @font.draw_markup_rel text, x, y + effect_size, z_index, rel, 0, 1, 1, effect_color
83
- @font.draw_markup_rel text, x - effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
84
- @font.draw_markup_rel text, x - effect_size, y, z_index, rel, 0, 1, 1, effect_color
179
+ @font.draw_markup_rel text, x - effect_size, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
180
+ @font.draw_markup_rel text, x, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
181
+ @font.draw_markup_rel text, x + effect_size, y - effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
182
+ @font.draw_markup_rel text, x + effect_size, y, z_index, rel, 0, scale_x, scale_y, effect_color
183
+ @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
184
+ @font.draw_markup_rel text, x, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
185
+ @font.draw_markup_rel text, x - effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
186
+ @font.draw_markup_rel text, x - effect_size, y, z_index, rel, 0, scale_x, scale_y, effect_color
85
187
  elsif effect == :shadow
86
- @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, 1, 1, effect_color
188
+ @font.draw_markup_rel text, x + effect_size, y + effect_size, z_index, rel, 0, scale_x, scale_y, effect_color
87
189
  end
88
190
  end
89
- @font.draw_markup_rel text, x, y, z_index, rel, 0, 1, 1, color
191
+ @font.draw_markup_rel text, x, y, z_index, rel, 0, scale_x, scale_y, color
90
192
  end
91
193
 
92
194
  # Draws text, breaking lines when needed and when explicitly caused by the
@@ -94,7 +196,7 @@ module MiniGL
94
196
  #
95
197
  # Parameters:
96
198
  # [text] The text to be drawn. Line breaks are allowed. You can use the
97
- # `<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.
199
+ # `<b>` tag for bold, `<i>` for italic and `<c=rrggbb>` for colors.
98
200
  # [x] The horizontal reference for drawing the text. Works like in
99
201
  # +write_line+ for the +:left+, +:right+ and +:center+ modes. For the
100
202
  # +:justified+ mode, works the same as for +:left+.
@@ -109,11 +211,14 @@ module MiniGL
109
211
  # transparent) to 255 (fully opaque).
110
212
  # [z_index] The z-order to draw the object. Objects with larger z-orders
111
213
  # will be drawn on top of the ones with smaller z-orders.
112
- def write_breaking(text, x, y, width, mode = :left, color = 0, alpha = 0xff, z_index = 0)
214
+ 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)
215
+ line_spacing = @line_spacing if line_spacing.nil?
216
+ scale_x = @scale_x if scale_x.nil?
217
+ scale_y = @scale_y if scale_y.nil?
113
218
  color = (alpha << 24) | color
114
219
  text.split("\n").each do |p|
115
220
  if mode == :justified
116
- y = write_paragraph_justified p, x, y, width, color, z_index
221
+ y = write_paragraph_justified p, x, y, width, color, z_index, scale_x, scale_y, line_spacing
117
222
  else
118
223
  rel =
119
224
  case mode
@@ -122,40 +227,40 @@ module MiniGL
122
227
  when :right then 1
123
228
  else 0
124
229
  end
125
- y = write_paragraph p, x, y, width, rel, color, z_index
230
+ y = write_paragraph p, x, y, width, rel, color, z_index, scale_x, scale_y, line_spacing
126
231
  end
127
232
  end
128
233
  end
129
234
 
130
235
  private
131
236
 
132
- def write_paragraph(text, x, y, width, rel, color, z_index)
237
+ def write_paragraph(text, x, y, width, rel, color, z_index, scale_x, scale_y, line_spacing)
133
238
  line = ''
134
239
  line_width = 0
135
240
  text.split(' ').each do |word|
136
- w = @font.markup_width word
137
- if line_width + w > width
138
- @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, 1, 1, color
241
+ w = @font.markup_width(word)
242
+ if line_width + w * scale_x > width
243
+ @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, scale_x, scale_y, color
139
244
  line = ''
140
245
  line_width = 0
141
- y += @font.height + @line_spacing
246
+ y += (@font.height + line_spacing) * scale_y
142
247
  end
143
248
  line += "#{word} "
144
- line_width += @font.markup_width "#{word} "
249
+ line_width += @font.markup_width("#{word} ") * scale_x
145
250
  end
146
- @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, 1, 1, color unless line.empty?
147
- y + @font.height + @line_spacing
251
+ @font.draw_markup_rel line.chop, x, y, z_index, rel, 0, scale_x, scale_y, color unless line.empty?
252
+ y + (@font.height + line_spacing) * scale_y
148
253
  end
149
254
 
150
- def write_paragraph_justified(text, x, y, width, color, z_index)
151
- space_width = @font.text_width ' '
255
+ def write_paragraph_justified(text, x, y, width, color, z_index, scale_x, scale_y, line_spacing)
256
+ space_width = @font.text_width(' ') * scale_x
152
257
  spaces = [[]]
153
258
  line_index = 0
154
259
  new_x = x
155
260
  words = text.split(' ')
156
261
  words.each do |word|
157
- w = @font.markup_width word
158
- if new_x + w > x + width
262
+ w = @font.markup_width(word)
263
+ if new_x + w * scale_x > x + width
159
264
  space = x + width - new_x + space_width
160
265
  index = 0
161
266
  while space > 0
@@ -170,7 +275,7 @@ module MiniGL
170
275
 
171
276
  new_x = x
172
277
  end
173
- new_x += @font.markup_width(word) + space_width
278
+ new_x += @font.markup_width(word) * scale_x + space_width
174
279
  spaces[line_index] << space_width
175
280
  end
176
281
 
@@ -178,11 +283,11 @@ module MiniGL
178
283
  spaces.each do |line|
179
284
  new_x = x
180
285
  line.each do |s|
181
- @font.draw_markup words[index], new_x, y, z_index, 1, 1, color
182
- new_x += @font.markup_width(words[index]) + s
286
+ @font.draw_markup(words[index], new_x, y, z_index, scale_x, scale_y, color)
287
+ new_x += @font.markup_width(words[index]) * scale_x + s
183
288
  index += 1
184
289
  end
185
- y += @font.height + @line_spacing
290
+ y += (@font.height + line_spacing) * scale_y
186
291
  end
187
292
  y
188
293
  end
@@ -35,7 +35,7 @@ class MyGame < GameWindow
35
35
 
36
36
  @panel = Panel.new(10, 10, 720, 520, [
37
37
  Button.new(x: 5, y: 5, font: @font1, text: 'Teste', img: :btn),
38
- Label.new(0, 70, @font1, 'Teste de label', 0xcccccc, 0x666666, 1, 1, :north),
38
+ @lbl = Label.new(0, 70, @font1, 'Teste de label', 0, 0x666666, 1, 1, :north),
39
39
  TextField.new(x: 5, y: 40, font: @font1, text: 'Opa', img: :text, margin_x: 5, margin_y: 5, anchor: :top_left),
40
40
  Button.new(x: 0, y: 5, font: @font1, text: 'Teste', img: :btn, anchor: :top),
41
41
  DropDownList.new(x: 0, y: 40, width: 150, height: 25, font: @font1, options: ['olá amigos', 'opção 2', 'terceira'], anchor: :north),
@@ -49,6 +49,8 @@ class MyGame < GameWindow
49
49
  ProgressBar.new(0, 40, 200, 20, :barbg, :barfg, 3456, 70, 2, 2, @font1, 0xff000080, nil, nil, 1, 1, :bottom)
50
50
  ], :text, :tiled, true, 2, 2, :bottom_right)
51
51
 
52
+ @lbl2 = Label.new(x: 5, y: 5, font: @font1, text: 'top-right corner label test', anchor: :top_right)
53
+
52
54
  @eff = Effect.new(100, 100, :check, 2, 4, 10, nil, nil, '1')
53
55
 
54
56
  @angle = 0
@@ -79,6 +81,8 @@ class MyGame < GameWindow
79
81
  @panel.visible = !@panel.visible if KB.key_pressed? Gosu::KbM
80
82
 
81
83
  @panel.add_component(Button.new(x: 5, y: 5, font: @font1, text: 'Teste', img: :btn, anchor: :southeast)) if KB.key_pressed?(Gosu::KbB)
84
+ @lbl.text = 'Test of changed text' if KB.key_pressed?(Gosu::KB_C)
85
+ @lbl2.text = 'Shorter text' if KB.key_pressed?(Gosu::KB_X)
82
86
 
83
87
  @pb.increase 1 if KB.key_down? Gosu::KbD
84
88
  @pb.decrease 1 if KB.key_down? Gosu::KbA
@@ -145,6 +149,7 @@ class MyGame < GameWindow
145
149
  @chk.draw
146
150
  @txt.draw
147
151
  @pb.draw 0x66
152
+ @lbl2.draw
148
153
 
149
154
  @panel.draw(204, 10)
150
155
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minigl
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.5
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Victor David Santos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-01 00:00:00.000000000 Z
11
+ date: 2020-07-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -93,8 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
95
  requirements: []
96
- rubyforge_project:
97
- rubygems_version: 2.7.6
96
+ rubygems_version: 3.1.2
98
97
  signing_key:
99
98
  specification_version: 4
100
99
  summary: MiniGL