minigl 1.3.10 → 2.0.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 +4 -4
- data/README.md +15 -9
- data/lib/minigl/forms.rb +382 -30
- data/lib/minigl/game_object.rb +35 -10
- data/lib/minigl/global.rb +498 -383
- data/lib/minigl/map.rb +21 -21
- data/lib/minigl/movement.rb +100 -55
- data/lib/minigl/text.rb +37 -9
- data/test/data/img/barbg.png +0 -0
- data/test/data/img/barbg.svg +73 -0
- data/test/data/img/barfg.png +0 -0
- data/test/data/img/barfg.svg +106 -0
- data/test/data/img/barfgl.png +0 -0
- data/test/data/img/barfgl.svg +127 -0
- data/test/data/img/barfgr.png +0 -0
- data/test/data/img/barfgr.svg +135 -0
- data/test/data/img/square.png +0 -0
- data/test/data/img/square.svg +66 -0
- data/test/data/sound/1.wav +0 -0
- data/test/game.rb +49 -17
- data/test/game_object_tests.rb +35 -5
- data/test/iso_game.rb +2 -2
- data/test/map_tests.rb +1 -1
- data/test/mov_game.rb +72 -0
- data/test/movement_tests.rb +2 -3
- data/test/res_tests.rb +17 -3
- data/test/vector_tests.rb +1 -1
- metadata +26 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8b03d2bc58b9642caa459346389f4d8a9368bdf
|
4
|
+
data.tar.gz: a16bbf130daa7014e576450145ab8acd8db57aea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7c5ca7adb1c4b297affa552ed1a7e1f7fc723c47e09172363e1049b0fb625247c1efd95d3961433fda7675ce9a8add42bc75c41decf930d1e6fdd01d2a892e13
|
7
|
+
data.tar.gz: 0400e96968260c4a45791ed85b9e37659f6bfcf0d267919b1fabd61e0bc222d5a1622f58395a2f6ecbb9428fb56274a47223c5a61ae5bb6a93f5a36746c27d44
|
data/README.md
CHANGED
@@ -26,16 +26,22 @@ After installing the gosu dependencies, you can just `gem install minigl`.
|
|
26
26
|
Please note:
|
27
27
|
|
28
28
|
* The test package is not complete! Most of the functionality
|
29
|
-
provided by the gem is difficult to test automatically, but you can check
|
30
|
-
|
31
|
-
* The
|
29
|
+
provided by the gem is difficult to test automatically, but you can check the
|
30
|
+
examples provided with the gem.
|
31
|
+
* The library is 100% RDoc-documented.
|
32
32
|
* An auxiliary, tutorial-like documentation is under construction
|
33
|
-
[here](https://github.com/victords/minigl/wiki).
|
33
|
+
[here](https://github.com/victords/minigl/wiki/How-To).
|
34
34
|
|
35
|
-
**Version
|
35
|
+
**Version 2.0.0**
|
36
36
|
|
37
|
-
|
38
|
-
into `center_x` and `center_y` (see doc. for details).
|
37
|
+
MiniGL 2.0.0 is finally released!
|
39
38
|
|
40
|
-
|
41
|
-
|
39
|
+
It brings new features, improvements to existing features and some bug fixes.
|
40
|
+
For details on what has changed, visit
|
41
|
+
[the changelog](https://github.com/victords/minigl/wiki/Changelog-(2.0.0)).
|
42
|
+
|
43
|
+
As the semantic versioning implies, **this version is incompatible with the 1.x
|
44
|
+
series**, so you'll need to adjust your code a little if you wish to upgrade.
|
45
|
+
|
46
|
+
A new tutorial has to be built, because there have been some changes even in the
|
47
|
+
basics of the usage. So please be patient while it doesn't come out!
|
data/lib/minigl/forms.rb
CHANGED
@@ -1,9 +1,21 @@
|
|
1
1
|
require_relative 'global'
|
2
2
|
|
3
|
-
module
|
3
|
+
module MiniGL
|
4
4
|
# This class is an abstract ancestor for all form components (Button,
|
5
5
|
# ToggleButton and TextField).
|
6
6
|
class Component
|
7
|
+
# The horizontal coordinate of the component
|
8
|
+
attr_reader :x
|
9
|
+
|
10
|
+
# The vertical coordinate of the component
|
11
|
+
attr_reader :y
|
12
|
+
|
13
|
+
# The width of the component
|
14
|
+
attr_reader :w
|
15
|
+
|
16
|
+
# The height of the component
|
17
|
+
attr_reader :h
|
18
|
+
|
7
19
|
# Determines whether the control is enabled, i.e., will process user input.
|
8
20
|
attr_accessor :enabled
|
9
21
|
|
@@ -32,6 +44,12 @@ module AGL
|
|
32
44
|
|
33
45
|
# This class represents a button.
|
34
46
|
class Button < Component
|
47
|
+
# The current state of the button.
|
48
|
+
attr_reader :state
|
49
|
+
|
50
|
+
# The text of the button.
|
51
|
+
attr_accessor :text
|
52
|
+
|
35
53
|
# Creates a button.
|
36
54
|
#
|
37
55
|
# Parameters:
|
@@ -49,6 +67,10 @@ module AGL
|
|
49
67
|
# [text_color] Color of the button text, in hexadecimal RRGGBB format.
|
50
68
|
# [disabled_text_color] Color of the button text, when it's disabled, in
|
51
69
|
# hexadecimal RRGGBB format.
|
70
|
+
# [over_text_color] Color of the button text, when the cursor is over it
|
71
|
+
# (hexadecimal RRGGBB).
|
72
|
+
# [down_text_color] Color of the button text, when it is pressed
|
73
|
+
# (hexadecimal RRGGBB).
|
52
74
|
# [center_x] Whether the button text should be horizontally centered in its
|
53
75
|
# area (the area is defined by the image size, if an image is
|
54
76
|
# given, or by the +width+ and +height+ parameters, otherwise).
|
@@ -71,9 +93,11 @@ module AGL
|
|
71
93
|
# parameters.
|
72
94
|
# [action] The block of code executed when the button is clicked (or by
|
73
95
|
# calling the +click+ method).
|
74
|
-
def initialize(x, y, font, text, img, text_color = 0, disabled_text_color = 0,
|
75
|
-
margin_x = 0, margin_y = 0, width = nil, height = nil, params = nil, &action)
|
96
|
+
def initialize(x, y, font, text, img, text_color = 0, disabled_text_color = 0, over_text_color = 0, down_text_color = 0,
|
97
|
+
center_x = true, center_y = true, margin_x = 0, margin_y = 0, width = nil, height = nil, params = nil, &action)
|
76
98
|
super x, y, font, text, text_color, disabled_text_color
|
99
|
+
@over_text_color = over_text_color
|
100
|
+
@down_text_color = down_text_color
|
77
101
|
@img =
|
78
102
|
if img; Res.imgs img, 1, 4, true
|
79
103
|
else; nil; end
|
@@ -175,7 +199,17 @@ module AGL
|
|
175
199
|
return unless @visible
|
176
200
|
|
177
201
|
color = (alpha << 24) | 0xffffff
|
178
|
-
text_color =
|
202
|
+
text_color =
|
203
|
+
if @enabled
|
204
|
+
if @state == :down
|
205
|
+
@down_text_color
|
206
|
+
else
|
207
|
+
@state == :over ? @over_text_color : @text_color
|
208
|
+
end
|
209
|
+
else
|
210
|
+
@disabled_text_color
|
211
|
+
end
|
212
|
+
text_color = (alpha << 24) | text_color
|
179
213
|
@img[@img_index].draw @x, @y, z_index, 1, 1, color if @img
|
180
214
|
if @text
|
181
215
|
if @center_x or @center_y
|
@@ -215,9 +249,10 @@ module AGL
|
|
215
249
|
# puts "button was checked" if checked
|
216
250
|
# # do something with params
|
217
251
|
# }
|
218
|
-
def initialize(x, y, font, text, img, checked = false, text_color = 0, disabled_text_color = 0,
|
219
|
-
margin_x = 0, margin_y = 0, width = nil, height = nil, params = nil, &action)
|
220
|
-
super x, y, font, text, nil, text_color, disabled_text_color,
|
252
|
+
def initialize(x, y, font, text, img, checked = false, text_color = 0, disabled_text_color = 0, over_text_color = 0, down_text_color = 0,
|
253
|
+
center_x = true, center_y = true, margin_x = 0, margin_y = 0, width = nil, height = nil, params = nil, &action)
|
254
|
+
super x, y, font, text, nil, text_color, disabled_text_color, over_text_color, down_text_color,
|
255
|
+
center_x, center_y, margin_x, margin_y, width, height, params, &action
|
221
256
|
@img =
|
222
257
|
if img; Res.imgs img, 2, 4, true
|
223
258
|
else; nil; end
|
@@ -271,6 +306,10 @@ module AGL
|
|
271
306
|
# The current text inside the text field.
|
272
307
|
attr_reader :text
|
273
308
|
|
309
|
+
# The current 'locale' used for detecting the keys. THIS FEATURE IS
|
310
|
+
# INCOMPLETE!
|
311
|
+
attr_reader :locale
|
312
|
+
|
274
313
|
# Creates a new text field.
|
275
314
|
#
|
276
315
|
# Parameters:
|
@@ -306,6 +345,10 @@ module AGL
|
|
306
345
|
# [selection_color] The color of the rectangle highlighting selected text,
|
307
346
|
# in hexadecimal RRGGBB format. The rectangle will
|
308
347
|
# always be drawn with 50% of opacity.
|
348
|
+
# [locale] The locale to be used when detecting keys. By now, only 'en-US'
|
349
|
+
# and 'pt-BR' are **partially** supported. Default is 'en-US'. If
|
350
|
+
# any different value is supplied, all typed characters will be
|
351
|
+
# mapped to '#'.
|
309
352
|
# [params] An object containing any parameters you want passed to the
|
310
353
|
# +on_text_changed+ block. When the text of the text field is
|
311
354
|
# changed, the following is called:
|
@@ -317,7 +360,7 @@ module AGL
|
|
317
360
|
# +text=+. The new text is passed as a first parameter
|
318
361
|
# to this block, followed by +params+. Can be +nil+.
|
319
362
|
def initialize(x, y, font, img, cursor_img = nil, disabled_img = nil, margin_x = 0, margin_y = 0, max_length = 100, active = false, text = '',
|
320
|
-
allowed_chars = nil, text_color = 0, disabled_text_color = 0, selection_color = 0, params = nil, &on_text_changed)
|
363
|
+
allowed_chars = nil, text_color = 0, disabled_text_color = 0, selection_color = 0, locale = 'en-us', params = nil, &on_text_changed)
|
321
364
|
super x, y, font, text, text_color, disabled_text_color
|
322
365
|
@img = Res.img img
|
323
366
|
@w = @img.width
|
@@ -348,16 +391,13 @@ module AGL
|
|
348
391
|
Gosu::KbDelete, Gosu::KbLeft, Gosu::KbRight, Gosu::KbHome,
|
349
392
|
Gosu::KbEnd, Gosu::KbLeftShift, Gosu::KbRightShift,
|
350
393
|
Gosu::KbBacktick, Gosu::KbMinus, Gosu::KbEqual, Gosu::KbBracketLeft,
|
351
|
-
Gosu::KbBracketRight, Gosu::KbBackslash, Gosu::
|
352
|
-
Gosu::KbComma, Gosu::KbPeriod, Gosu::KbSlash
|
394
|
+
Gosu::KbBracketRight, Gosu::KbBackslash, Gosu::KbSemicolon,
|
395
|
+
Gosu::KbApostrophe, Gosu::KbComma, Gosu::KbPeriod, Gosu::KbSlash,
|
396
|
+
Gosu::KbNumpadAdd, Gosu::KbNumpadSubtract,
|
397
|
+
Gosu::KbNumpadMultiply, Gosu::KbNumpadDivide
|
353
398
|
]
|
354
|
-
@
|
355
|
-
|
356
|
-
if allowed_chars
|
357
|
-
allowed_chars
|
358
|
-
else
|
359
|
-
@chars
|
360
|
-
end
|
399
|
+
@user_allowed_chars = allowed_chars
|
400
|
+
self.locale = locale
|
361
401
|
|
362
402
|
@on_text_changed = on_text_changed
|
363
403
|
@params = params
|
@@ -430,10 +470,10 @@ module AGL
|
|
430
470
|
insert_char @chars[i]
|
431
471
|
end
|
432
472
|
elsif i < 36
|
433
|
-
if shift; insert_char @chars[i +
|
473
|
+
if shift; insert_char @chars[i + 59]
|
434
474
|
else; insert_char @chars[i]; end
|
435
475
|
elsif shift
|
436
|
-
insert_char(@chars[i +
|
476
|
+
insert_char(@chars[i + 49])
|
437
477
|
else
|
438
478
|
insert_char(@chars[i - 10])
|
439
479
|
end
|
@@ -443,15 +483,26 @@ module AGL
|
|
443
483
|
end
|
444
484
|
|
445
485
|
return if inserted
|
446
|
-
for i in 55..
|
486
|
+
for i in 55..65 # special
|
447
487
|
if KB.key_pressed?(@k[i]) or KB.key_held?(@k[i])
|
448
|
-
|
488
|
+
remove_interval true if @anchor1 and @anchor2
|
489
|
+
if shift; insert_char @chars[i + 19]
|
449
490
|
else; insert_char @chars[i + 8]; end
|
450
491
|
inserted = true
|
451
492
|
break
|
452
493
|
end
|
453
494
|
end
|
454
495
|
|
496
|
+
return if inserted
|
497
|
+
for i in 66..69 # numpad operators
|
498
|
+
if KB.key_pressed?(@k[i]) or KB.key_held?(@k[i])
|
499
|
+
remove_interval true if @anchor1 and @anchor2
|
500
|
+
insert_char @chars[i + 19]
|
501
|
+
inserted = true
|
502
|
+
break
|
503
|
+
end
|
504
|
+
end
|
505
|
+
|
455
506
|
return if inserted
|
456
507
|
if KB.key_pressed?(@k[47]) or KB.key_held?(@k[47]) # back
|
457
508
|
if @anchor1 and @anchor2
|
@@ -541,6 +592,25 @@ module AGL
|
|
541
592
|
@on_text_changed.call @text, @params if @on_text_changed
|
542
593
|
end
|
543
594
|
|
595
|
+
# Sets the locale used by the text field to detect keys. Only 'en-us' and
|
596
|
+
# 'pt-br' are **partially** supported. If any different value is supplied,
|
597
|
+
# all typed characters will be mapped to '#'.
|
598
|
+
def locale=(value)
|
599
|
+
@locale = value.downcase
|
600
|
+
@chars =
|
601
|
+
case @locale
|
602
|
+
when 'en-us' then "abcdefghijklmnopqrstuvwxyz1234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZ`-=[]\\;',./~_+{}|:\"<>?!@#$%^&*()+-*/"
|
603
|
+
when 'pt-br' then "abcdefghijklmnopqrstuvwxyz1234567890 ABCDEFGHIJKLMNOPQRSTUVWXYZ'-=/[]ç~,.;\"_+?{}Ç^<>:!@#$%¨&*()+-*/"
|
604
|
+
else '###################################################################################################'
|
605
|
+
end
|
606
|
+
@allowed_chars =
|
607
|
+
if @user_allowed_chars
|
608
|
+
@user_allowed_chars
|
609
|
+
else
|
610
|
+
@chars
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
544
614
|
# Returns the currently selected text.
|
545
615
|
def selected_text
|
546
616
|
return '' if @anchor2.nil?
|
@@ -597,10 +667,10 @@ module AGL
|
|
597
667
|
|
598
668
|
if @anchor1 and @anchor2
|
599
669
|
selection_color = ((alpha / 2) << 24) | @selection_color
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
670
|
+
G.window.draw_quad @nodes[@anchor1], @text_y, selection_color,
|
671
|
+
@nodes[@anchor2] + 1, @text_y, selection_color,
|
672
|
+
@nodes[@anchor2] + 1, @text_y + @font.height, selection_color,
|
673
|
+
@nodes[@anchor1], @text_y + @font.height, selection_color, z_index
|
604
674
|
end
|
605
675
|
|
606
676
|
if @cursor_visible
|
@@ -608,10 +678,10 @@ module AGL
|
|
608
678
|
@cursor_img.draw @nodes[@cur_node] - @cursor_img.width / 2, @text_y, z_index
|
609
679
|
else
|
610
680
|
cursor_color = alpha << 24
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
681
|
+
G.window.draw_quad @nodes[@cur_node], @text_y, cursor_color,
|
682
|
+
@nodes[@cur_node] + 1, @text_y, cursor_color,
|
683
|
+
@nodes[@cur_node] + 1, @text_y + @font.height, cursor_color,
|
684
|
+
@nodes[@cur_node], @text_y + @font.height, cursor_color, z_index
|
615
685
|
end
|
616
686
|
end
|
617
687
|
end
|
@@ -668,7 +738,7 @@ module AGL
|
|
668
738
|
interval_width += @font.text_width(@text[i])
|
669
739
|
@nodes.delete_at min + 1
|
670
740
|
end
|
671
|
-
@text[min...max] =
|
741
|
+
@text[min...max] = ''
|
672
742
|
for i in (min + 1)..(@nodes.size - 1)
|
673
743
|
@nodes[i] -= interval_width
|
674
744
|
end
|
@@ -691,4 +761,286 @@ module AGL
|
|
691
761
|
@on_text_changed.call @text, @params if @on_text_changed
|
692
762
|
end
|
693
763
|
end
|
764
|
+
|
765
|
+
# Represents a progress bar.
|
766
|
+
class ProgressBar < Component
|
767
|
+
# The maximum value for this progress bar (when the current value equals
|
768
|
+
# the maximum, the bar is full).
|
769
|
+
attr_reader :max_value
|
770
|
+
|
771
|
+
# The current value of the progress bar (an integer greater than or equal
|
772
|
+
# to zero, and less than or equal to +max_value+).
|
773
|
+
attr_reader :value
|
774
|
+
|
775
|
+
# Creates a progress bar.
|
776
|
+
#
|
777
|
+
# Parameters:
|
778
|
+
# [x] The x-coordinate of the progress bar on the screen.
|
779
|
+
# [y] The y-coordinate of the progress bar on the screen.
|
780
|
+
# [w] Width of the progress bar, in pixels. This is the maximum space the
|
781
|
+
# bar foreground can occupy. Note that the width of the foreground image
|
782
|
+
# (+fg+) can be less than this.
|
783
|
+
# [h] Height of the progress bar. This will be the height of the bar
|
784
|
+
# foreground when +fg+ is a color (when it is an image, the height of
|
785
|
+
# the image will be kept).
|
786
|
+
# [bg] A background image (string or symbol that will be passed to
|
787
|
+
# +Res.img+) or color (in RRGGBB hexadecimal format).
|
788
|
+
# [fg] A foreground image (string or symbol that will be passed to
|
789
|
+
# +Res.img+) or color (in RRGGBB hexadecimal format). The image will
|
790
|
+
# be horizontally repeated when needed, if its width is less than +w+.
|
791
|
+
# [max_value] The maximum value the progress bar can reach (an integer).
|
792
|
+
# [value] The starting value for the progress bar.
|
793
|
+
# [fg_margin_x] Horizontal margin between the background image and the
|
794
|
+
# foreground image (when these are provided).
|
795
|
+
# [fg_margin_y] Vertical margin between the background image and the
|
796
|
+
# foreground image (when these are provided).
|
797
|
+
# [font] Font that will be used to draw a text indicating the value of the
|
798
|
+
# progress bar.
|
799
|
+
# [text_color] Color of the text.
|
800
|
+
# [format] Format to display the value. Specify '%' for a percentage and
|
801
|
+
# anything else for absolute values (current/maximum).
|
802
|
+
def initialize(x, y, w, h, bg, fg, max_value = 100, value = 100, fg_margin_x = 0, fg_margin_y = 0, #fg_left = nil, fg_right = nil,
|
803
|
+
font = nil, text_color = 0, format = nil)
|
804
|
+
super x, y, font, '', text_color, text_color
|
805
|
+
@w = w
|
806
|
+
@h = h
|
807
|
+
if bg.is_a? Integer
|
808
|
+
@bg_color = bg
|
809
|
+
else # String or Symbol
|
810
|
+
@bg = Res.img bg
|
811
|
+
end
|
812
|
+
if fg.is_a? Integer
|
813
|
+
@fg_color = fg
|
814
|
+
else # String or Symbol
|
815
|
+
@fg = Res.img fg
|
816
|
+
@fg_path = "#{Res.prefix}img/#{fg.to_s.gsub('_', '/')}.png"
|
817
|
+
puts @fg_path
|
818
|
+
end
|
819
|
+
@fg_margin_x = fg_margin_x
|
820
|
+
@fg_margin_y = fg_margin_y
|
821
|
+
# @fg_left = fg_left
|
822
|
+
# @fg_right = fg_right
|
823
|
+
@max_value = max_value
|
824
|
+
self.value = value
|
825
|
+
@format = format
|
826
|
+
end
|
827
|
+
|
828
|
+
# Increases the current value of the progress bar by the given amount.
|
829
|
+
#
|
830
|
+
# Parameters:
|
831
|
+
# [amount] (+Integer+) The amount to be added to the current value. If the
|
832
|
+
# sum surpasses +max_value+, it is set to +max_value+.
|
833
|
+
def increase(amount)
|
834
|
+
@value += amount
|
835
|
+
@value = @max_value if @value > @max_value
|
836
|
+
end
|
837
|
+
|
838
|
+
# Descreases the current value of the progress bar by the given amount.
|
839
|
+
#
|
840
|
+
# Parameters:
|
841
|
+
# [amount] (+Integer+) The amount to be subtracted from the current value.
|
842
|
+
# If the result is less than zero, it is set to zero.
|
843
|
+
def decrease(amount)
|
844
|
+
@value -= amount
|
845
|
+
@value = 0 if @value < 0
|
846
|
+
end
|
847
|
+
|
848
|
+
# Sets the value of the progress bar.
|
849
|
+
#
|
850
|
+
# Parameters:
|
851
|
+
# [val] (+Integer+) The value to be set. It will be changed as needed to be
|
852
|
+
# between zero and +max_value+.
|
853
|
+
def value=(val)
|
854
|
+
@value = val
|
855
|
+
if @value > @max_value
|
856
|
+
@value = @max_value
|
857
|
+
elsif @value < 0
|
858
|
+
@value = 0
|
859
|
+
end
|
860
|
+
end
|
861
|
+
|
862
|
+
# Sets the value of the progress bar to a given percentage of +max_value+.
|
863
|
+
#
|
864
|
+
# Parameters:
|
865
|
+
# [pct] (+Numeric+) The percentage of +max_value+ to set the current value
|
866
|
+
# to. The final result will be changed as needed to be between zero
|
867
|
+
# and +max_value+.
|
868
|
+
def percentage=(pct)
|
869
|
+
self.value = (pct * @max_value).round
|
870
|
+
end
|
871
|
+
|
872
|
+
# Draws the progress bar.
|
873
|
+
#
|
874
|
+
# Parameters:
|
875
|
+
# [alpha] (+Fixnum+) The opacity with which the progress bar will be drawn.
|
876
|
+
# Allowed values vary between 0 (fully transparent) and 255 (fully
|
877
|
+
# opaque).
|
878
|
+
# [z_index] (+Fixnum+) The z-order to draw the object. Objects with larger
|
879
|
+
# z-orders will be drawn on top of the ones with smaller z-orders.
|
880
|
+
def draw(alpha = 0xff, z_index = 0)
|
881
|
+
return unless @visible
|
882
|
+
|
883
|
+
if @bg
|
884
|
+
c = (alpha << 24) | 0xffffff
|
885
|
+
@bg.draw @x, @y, z_index, 1, 1, c
|
886
|
+
else
|
887
|
+
c = (alpha << 24) | @bg_color
|
888
|
+
G.window.draw_quad @x, @y, c,
|
889
|
+
@x + @w, @y, c,
|
890
|
+
@x + @w, @y + @h, c,
|
891
|
+
@x, @y + @h, c, z_index
|
892
|
+
end
|
893
|
+
if @fg
|
894
|
+
c = (alpha << 24) | 0xffffff
|
895
|
+
w1 = @fg.width
|
896
|
+
w2 = (@value.to_f / @max_value * @w).round
|
897
|
+
x0 = @x + @fg_margin_x
|
898
|
+
x = 0
|
899
|
+
while x <= w2 - w1
|
900
|
+
@fg.draw x0 + x, @y + @fg_margin_y, z_index, 1, 1, c
|
901
|
+
x += w1
|
902
|
+
end
|
903
|
+
if w2 - x > 0
|
904
|
+
img = Gosu::Image.new(G.window, @fg_path, true, 0, 0, w2 - x, @fg.height)
|
905
|
+
img.draw x0 + x, @y + @fg_margin_y, z_index, 1, 1, c
|
906
|
+
end
|
907
|
+
else
|
908
|
+
c = (alpha << 24) | @fg_color
|
909
|
+
rect_r = @x + (@value.to_f / @max_value * @w).round
|
910
|
+
G.window.draw_quad @x, @y, c,
|
911
|
+
rect_r, @y, c,
|
912
|
+
rect_r, @y + @h, c,
|
913
|
+
@x, @y + @h, c, z_index
|
914
|
+
end
|
915
|
+
if @font
|
916
|
+
c = (alpha << 24) | @text_color
|
917
|
+
@text = @format == '%' ? "#{(@value.to_f / @max_value * 100).round}%" : "#{@value}/#{@max_value}"
|
918
|
+
@font.draw_rel @text, @x + @fg_margin_x + @w / 2, @y + @fg_margin_y + @h / 2, 0, 0.5, 0.5, 1, 1, c
|
919
|
+
end
|
920
|
+
end
|
921
|
+
end
|
922
|
+
|
923
|
+
# This class represents a "drop-down list" form component, here composed of a
|
924
|
+
# group of +Button+ objects.
|
925
|
+
class DropDownList < Component
|
926
|
+
# The selected value in the drop-down list. This is one of the +options+.
|
927
|
+
attr_reader :value
|
928
|
+
|
929
|
+
# An array containing all the options (each of them +String+s) that can be
|
930
|
+
# selected in the drop-down list.
|
931
|
+
attr_accessor :options
|
932
|
+
|
933
|
+
# Creates a new drop-down list.
|
934
|
+
#
|
935
|
+
# Parameters:
|
936
|
+
# [x] The x-coordinate of the object.
|
937
|
+
# [y] The y-coordinate of the object.
|
938
|
+
# [font] Font to be used by the buttons that compose the drop-donwn list.
|
939
|
+
# [img] Image of the main button, i.e., the one at the top, that toggles
|
940
|
+
# visibility of the other buttons (the "option" buttons).
|
941
|
+
# [opt_img] Image for the "option" buttons, as described above.
|
942
|
+
# [options] Array of available options for this control (+String+s).
|
943
|
+
# [option] Index of the firstly selected option.
|
944
|
+
# [text_margin] Left margin of the text inside the buttons (vertically, the
|
945
|
+
# text will always be centered).
|
946
|
+
# [width] Width of the control, used when no image is provided.
|
947
|
+
# [height] Height of the control, used when no image is provided.
|
948
|
+
# [text_color] Used as the +text_color+ parameter in the constructor of the
|
949
|
+
# buttons.
|
950
|
+
# [disabled_text_color] Analogous to +text_color+.
|
951
|
+
# [over_text_color] Same as above.
|
952
|
+
# [down_text_color] Same as above.
|
953
|
+
def initialize(x, y, font, img, opt_img, options, option = 0, text_margin = 0, width = nil, height = nil,
|
954
|
+
text_color = 0, disabled_text_color = 0, over_text_color = 0, down_text_color = 0)
|
955
|
+
super x, y, font, options[option], text_color, disabled_text_color
|
956
|
+
@img = img
|
957
|
+
@opt_img = opt_img
|
958
|
+
@options = options
|
959
|
+
@value = @options[option]
|
960
|
+
@open = false
|
961
|
+
@buttons = []
|
962
|
+
@buttons.push(
|
963
|
+
Button.new(x, y, font, @value, img, text_color, disabled_text_color, over_text_color, down_text_color,
|
964
|
+
false, true, text_margin, 0, width, height) {
|
965
|
+
toggle
|
966
|
+
}
|
967
|
+
)
|
968
|
+
@w = @buttons[0].w
|
969
|
+
@h = @buttons[0].h
|
970
|
+
@options.each_with_index do |o, i|
|
971
|
+
b = Button.new(x, y + (i+1) * @h, font, o, opt_img, text_color, disabled_text_color, over_text_color, down_text_color,
|
972
|
+
false, true, text_margin, 0, @w, @h) {
|
973
|
+
@value = @buttons[0].text = o
|
974
|
+
toggle
|
975
|
+
}
|
976
|
+
b.visible = false
|
977
|
+
@buttons.push b
|
978
|
+
end
|
979
|
+
@max_h = (@options.size + 1) * @h
|
980
|
+
end
|
981
|
+
|
982
|
+
# Updates the control.
|
983
|
+
def update
|
984
|
+
return unless @enabled and @visible
|
985
|
+
if @open and Mouse.button_pressed? :left and not Mouse.over?(@x, @y, @w, @max_h)
|
986
|
+
toggle
|
987
|
+
return
|
988
|
+
end
|
989
|
+
@buttons.each { |b| b.update }
|
990
|
+
end
|
991
|
+
|
992
|
+
# Sets the currently selected value of the drop-down list. It is ignored if
|
993
|
+
# it is not among the available options.
|
994
|
+
def value=(val)
|
995
|
+
if @options.include? val
|
996
|
+
@value = @buttons[0].text = val
|
997
|
+
end
|
998
|
+
end
|
999
|
+
|
1000
|
+
def enabled=(value) # :nodoc:
|
1001
|
+
toggle if @open
|
1002
|
+
@buttons[0].enabled = value
|
1003
|
+
@enabled = value
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
# Draws the drop-down list.
|
1007
|
+
#
|
1008
|
+
# Parameters:
|
1009
|
+
# [alpha] (+Fixnum+) The opacity with which the drop-down list will be
|
1010
|
+
# drawn. Allowed values vary between 0 (fully transparent) and 255
|
1011
|
+
# (fully opaque).
|
1012
|
+
# [z_index] (+Fixnum+) The z-order to draw the object. Objects with larger
|
1013
|
+
# z-orders will be drawn on top of the ones with smaller z-orders.
|
1014
|
+
def draw(alpha = 0xff, z_index = 0)
|
1015
|
+
return unless @visible
|
1016
|
+
unless @img
|
1017
|
+
bottom = @open ? @y + @max_h + 1 : @y + @h + 1
|
1018
|
+
b_color = (alpha << 24)
|
1019
|
+
G.window.draw_quad @x - 1, @y - 1, b_color,
|
1020
|
+
@x + @w + 1, @y - 1, b_color,
|
1021
|
+
@x + @w + 1, bottom, b_color,
|
1022
|
+
@x - 1, bottom, b_color, z_index
|
1023
|
+
@buttons.each do |b|
|
1024
|
+
color = (alpha << 24) | (b.state == :over ? 0xcccccc : 0xffffff)
|
1025
|
+
G.window.draw_quad b.x, b.y, color,
|
1026
|
+
b.x + b.w, b.y, color,
|
1027
|
+
b.x + b.w, b.y + b.h, color,
|
1028
|
+
b.x, b.y + b.h, color, z_index if b.visible
|
1029
|
+
end
|
1030
|
+
end
|
1031
|
+
@buttons.each { |b| b.draw alpha, z_index }
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
private
|
1035
|
+
|
1036
|
+
def toggle
|
1037
|
+
if @open
|
1038
|
+
@buttons[1..-1].each { |b| b.visible = false }
|
1039
|
+
@open = false
|
1040
|
+
else
|
1041
|
+
@buttons[1..-1].each { |b| b.visible = true }
|
1042
|
+
@open = true
|
1043
|
+
end
|
1044
|
+
end
|
1045
|
+
end
|
694
1046
|
end
|