cyberarm_engine 0.24.4 → 0.24.5
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/.gitignore +8 -8
- data/.rubocop.yml +7 -7
- data/.travis.yml +5 -5
- data/Gemfile +6 -6
- data/Gemfile.lock +24 -0
- data/LICENSE.txt +21 -21
- data/README.md +74 -74
- data/Rakefile +10 -10
- data/assets/shaders/fragment/g_buffer.glsl +30 -30
- data/assets/shaders/fragment/lighting.glsl +115 -69
- data/assets/shaders/include/light_struct.glsl +11 -11
- data/assets/shaders/include/material_struct.glsl +16 -16
- data/assets/shaders/vertex/g_buffer.glsl +28 -28
- data/assets/shaders/vertex/lighting.glsl +24 -24
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/cyberarm_engine.gemspec +36 -36
- data/lib/cyberarm_engine/animator.rb +219 -219
- data/lib/cyberarm_engine/background.rb +180 -179
- data/lib/cyberarm_engine/background_image.rb +93 -93
- data/lib/cyberarm_engine/background_nine_slice.rb +142 -142
- data/lib/cyberarm_engine/bounding_box.rb +150 -150
- data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
- data/lib/cyberarm_engine/cache/download_manager.rb +123 -123
- data/lib/cyberarm_engine/cache.rb +4 -4
- data/lib/cyberarm_engine/common.rb +128 -128
- data/lib/cyberarm_engine/config_file.rb +46 -46
- data/lib/cyberarm_engine/console/command.rb +157 -157
- data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
- data/lib/cyberarm_engine/console/subcommand.rb +99 -99
- data/lib/cyberarm_engine/console.rb +248 -248
- data/lib/cyberarm_engine/game_object.rb +244 -244
- data/lib/cyberarm_engine/game_state.rb +124 -124
- data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +97 -97
- data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +30 -30
- data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -17
- data/lib/cyberarm_engine/model/material.rb +21 -21
- data/lib/cyberarm_engine/model/{model_object.rb → mesh.rb} +131 -131
- data/lib/cyberarm_engine/model/parser.rb +74 -74
- data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
- data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
- data/lib/cyberarm_engine/model.rb +216 -213
- data/lib/cyberarm_engine/model_cache.rb +31 -31
- data/lib/cyberarm_engine/notification.rb +82 -82
- data/lib/cyberarm_engine/notification_manager.rb +241 -241
- data/lib/cyberarm_engine/opengl/light.rb +52 -50
- data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
- data/lib/cyberarm_engine/opengl/perspective_camera.rb +41 -38
- data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
- data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +167 -165
- data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +307 -304
- data/lib/cyberarm_engine/opengl/renderer/renderer.rb +33 -33
- data/lib/cyberarm_engine/opengl/shader.rb +408 -406
- data/lib/cyberarm_engine/opengl/texture.rb +69 -69
- data/lib/cyberarm_engine/opengl.rb +53 -40
- data/lib/cyberarm_engine/ray.rb +56 -56
- data/lib/cyberarm_engine/stats.rb +200 -200
- data/lib/cyberarm_engine/text.rb +260 -260
- data/lib/cyberarm_engine/timer.rb +23 -23
- data/lib/cyberarm_engine/transform.rb +296 -296
- data/lib/cyberarm_engine/trees/aabb_node.rb +126 -0
- data/lib/cyberarm_engine/trees/aabb_tree.rb +55 -0
- data/lib/cyberarm_engine/trees/aabb_tree_debug.rb +29 -0
- data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
- data/lib/cyberarm_engine/ui/dsl.rb +142 -142
- data/lib/cyberarm_engine/ui/element.rb +662 -662
- data/lib/cyberarm_engine/ui/elements/button.rb +100 -100
- data/lib/cyberarm_engine/ui/elements/check_box.rb +54 -54
- data/lib/cyberarm_engine/ui/elements/container.rb +404 -404
- data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -179
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +297 -297
- data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
- data/lib/cyberarm_engine/ui/elements/image.rb +72 -72
- data/lib/cyberarm_engine/ui/elements/list_box.rb +79 -79
- data/lib/cyberarm_engine/ui/elements/menu.rb +27 -27
- data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -6
- data/lib/cyberarm_engine/ui/elements/progress.rb +93 -93
- data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
- data/lib/cyberarm_engine/ui/elements/slider.rb +107 -107
- data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
- data/lib/cyberarm_engine/ui/elements/text_block.rb +216 -216
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +67 -67
- data/lib/cyberarm_engine/ui/event.rb +54 -54
- data/lib/cyberarm_engine/ui/gui_state.rb +321 -321
- data/lib/cyberarm_engine/ui/style.rb +50 -50
- data/lib/cyberarm_engine/ui/theme.rb +225 -225
- data/lib/cyberarm_engine/vector.rb +312 -312
- data/lib/cyberarm_engine/version.rb +4 -4
- data/lib/cyberarm_engine/window.rb +195 -195
- data/lib/cyberarm_engine.rb +70 -78
- data/mrbgem.rake +29 -29
- metadata +8 -7
@@ -1,72 +1,72 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class Image < Element
|
4
|
-
def initialize(path_or_image, options = {}, block = nil)
|
5
|
-
super(options, block)
|
6
|
-
@path = path_or_image if path_or_image.is_a?(String)
|
7
|
-
|
8
|
-
@image = Gosu::Image.new(path_or_image, retro: @options[:retro], tileable: @options[:tileable]) if @path
|
9
|
-
@image = path_or_image unless @path
|
10
|
-
|
11
|
-
@scale_x = 1
|
12
|
-
@scale_y = 1
|
13
|
-
end
|
14
|
-
|
15
|
-
def render
|
16
|
-
@image.draw(
|
17
|
-
@style.border_thickness_left + @style.padding_left + @x,
|
18
|
-
@style.border_thickness_top + @style.padding_top + @y,
|
19
|
-
@z + 2,
|
20
|
-
@scale_x, @scale_y, @style.color
|
21
|
-
)
|
22
|
-
end
|
23
|
-
|
24
|
-
def clicked_left_mouse_button(_sender, _x, _y)
|
25
|
-
@block.call(self) if @block
|
26
|
-
|
27
|
-
:handled
|
28
|
-
end
|
29
|
-
|
30
|
-
def layout
|
31
|
-
_width = dimensional_size(@style.width, :width)
|
32
|
-
_height = dimensional_size(@style.height, :height)
|
33
|
-
|
34
|
-
if _width && _height
|
35
|
-
@scale_x = _width.to_f / @image.width
|
36
|
-
@scale_y = _height.to_f / @image.height
|
37
|
-
elsif _width
|
38
|
-
@scale_x = _width.to_f / @image.width
|
39
|
-
@scale_y = @scale_x
|
40
|
-
elsif _height
|
41
|
-
@scale_y = _height.to_f / @image.height
|
42
|
-
@scale_x = @scale_y
|
43
|
-
else
|
44
|
-
@scale_x = 1
|
45
|
-
@scale_y = 1
|
46
|
-
end
|
47
|
-
|
48
|
-
@width = _width || (@image.width * @scale_x).floor
|
49
|
-
@height = _height || (@image.height * @scale_y).floor
|
50
|
-
|
51
|
-
update_background
|
52
|
-
end
|
53
|
-
|
54
|
-
def value
|
55
|
-
@image
|
56
|
-
end
|
57
|
-
|
58
|
-
def value=(path_or_image, retro: false, tileable: false)
|
59
|
-
@path = path_or_image if path_or_image.is_a?(String)
|
60
|
-
|
61
|
-
@image = Gosu::Image.new(path_or_image, retro: retro, tileable: tileable) if @path
|
62
|
-
@image = path_or_image unless @path
|
63
|
-
|
64
|
-
recalculate
|
65
|
-
end
|
66
|
-
|
67
|
-
def path
|
68
|
-
@path
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Image < Element
|
4
|
+
def initialize(path_or_image, options = {}, block = nil)
|
5
|
+
super(options, block)
|
6
|
+
@path = path_or_image if path_or_image.is_a?(String)
|
7
|
+
|
8
|
+
@image = Gosu::Image.new(path_or_image, retro: @options[:retro], tileable: @options[:tileable]) if @path
|
9
|
+
@image = path_or_image unless @path
|
10
|
+
|
11
|
+
@scale_x = 1
|
12
|
+
@scale_y = 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def render
|
16
|
+
@image.draw(
|
17
|
+
@style.border_thickness_left + @style.padding_left + @x,
|
18
|
+
@style.border_thickness_top + @style.padding_top + @y,
|
19
|
+
@z + 2,
|
20
|
+
@scale_x, @scale_y, @style.color
|
21
|
+
)
|
22
|
+
end
|
23
|
+
|
24
|
+
def clicked_left_mouse_button(_sender, _x, _y)
|
25
|
+
@block.call(self) if @block
|
26
|
+
|
27
|
+
:handled
|
28
|
+
end
|
29
|
+
|
30
|
+
def layout
|
31
|
+
_width = dimensional_size(@style.width, :width)
|
32
|
+
_height = dimensional_size(@style.height, :height)
|
33
|
+
|
34
|
+
if _width && _height
|
35
|
+
@scale_x = _width.to_f / @image.width
|
36
|
+
@scale_y = _height.to_f / @image.height
|
37
|
+
elsif _width
|
38
|
+
@scale_x = _width.to_f / @image.width
|
39
|
+
@scale_y = @scale_x
|
40
|
+
elsif _height
|
41
|
+
@scale_y = _height.to_f / @image.height
|
42
|
+
@scale_x = @scale_y
|
43
|
+
else
|
44
|
+
@scale_x = 1
|
45
|
+
@scale_y = 1
|
46
|
+
end
|
47
|
+
|
48
|
+
@width = _width || (@image.width * @scale_x).floor
|
49
|
+
@height = _height || (@image.height * @scale_y).floor
|
50
|
+
|
51
|
+
update_background
|
52
|
+
end
|
53
|
+
|
54
|
+
def value
|
55
|
+
@image
|
56
|
+
end
|
57
|
+
|
58
|
+
def value=(path_or_image, retro: false, tileable: false)
|
59
|
+
@path = path_or_image if path_or_image.is_a?(String)
|
60
|
+
|
61
|
+
@image = Gosu::Image.new(path_or_image, retro: retro, tileable: tileable) if @path
|
62
|
+
@image = path_or_image unless @path
|
63
|
+
|
64
|
+
recalculate
|
65
|
+
end
|
66
|
+
|
67
|
+
def path
|
68
|
+
@path
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -1,79 +1,79 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class ListBox < Button
|
4
|
-
attr_accessor :items
|
5
|
-
attr_reader :choose
|
6
|
-
|
7
|
-
def initialize(options = {}, block = nil)
|
8
|
-
@items = options[:items] || []
|
9
|
-
@choose = options[:choose] || @items.first
|
10
|
-
|
11
|
-
super(@choose, options, block)
|
12
|
-
|
13
|
-
@style.background_canvas.background = default(:background)
|
14
|
-
|
15
|
-
@menu = Menu.new(parent: self, theme: @options[:theme])
|
16
|
-
|
17
|
-
self.choose = @choose
|
18
|
-
end
|
19
|
-
|
20
|
-
def render
|
21
|
-
super
|
22
|
-
|
23
|
-
w = @text.textobject.text_width("▼")
|
24
|
-
@text.textobject.draw_text("▼", @x + content_width - w, @y + @style.padding_top, @z, 1, 1, @text.color)
|
25
|
-
end
|
26
|
-
|
27
|
-
def choose=(item)
|
28
|
-
valid = @items.detect { |i| i == item }
|
29
|
-
|
30
|
-
unless valid
|
31
|
-
warn "Invalid value '#{item}' for choose, valid options were: #{@items.map { |i| "#{i.inspect}" }.join(", ")}"
|
32
|
-
item = @items.first
|
33
|
-
|
34
|
-
raise "No items list" unless item
|
35
|
-
end
|
36
|
-
|
37
|
-
@choose = item
|
38
|
-
|
39
|
-
self.value = item.to_s
|
40
|
-
|
41
|
-
recalculate
|
42
|
-
end
|
43
|
-
|
44
|
-
def released_left_mouse_button(_sender, _x, _y)
|
45
|
-
show_menu
|
46
|
-
|
47
|
-
:handled
|
48
|
-
end
|
49
|
-
|
50
|
-
def clicked_left_mouse_button(_sender, _x, _y)
|
51
|
-
# @block&.call(self.value) if @enabled
|
52
|
-
|
53
|
-
:handled
|
54
|
-
end
|
55
|
-
|
56
|
-
def show_menu
|
57
|
-
@menu.clear do
|
58
|
-
|
59
|
-
@menu.style.width = width
|
60
|
-
|
61
|
-
@items.each do |item|
|
62
|
-
# prevent already selected item from appearing in list
|
63
|
-
# NOTE: Remove this? Might be kinda confusing...
|
64
|
-
next if item == self.value
|
65
|
-
|
66
|
-
root.gui_state.menu_item(item, width: 1.0, margin: 0, border_color: 0x00ffffff) do
|
67
|
-
self.choose = item
|
68
|
-
@block&.call(self.value)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
recalculate
|
74
|
-
|
75
|
-
@menu.show
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class ListBox < Button
|
4
|
+
attr_accessor :items
|
5
|
+
attr_reader :choose
|
6
|
+
|
7
|
+
def initialize(options = {}, block = nil)
|
8
|
+
@items = options[:items] || []
|
9
|
+
@choose = options[:choose] || @items.first
|
10
|
+
|
11
|
+
super(@choose, options, block)
|
12
|
+
|
13
|
+
@style.background_canvas.background = default(:background)
|
14
|
+
|
15
|
+
@menu = Menu.new(parent: self, theme: @options[:theme])
|
16
|
+
|
17
|
+
self.choose = @choose
|
18
|
+
end
|
19
|
+
|
20
|
+
def render
|
21
|
+
super
|
22
|
+
|
23
|
+
w = @text.textobject.text_width("▼")
|
24
|
+
@text.textobject.draw_text("▼", @x + content_width - w, @y + @style.padding_top, @z, 1, 1, @text.color)
|
25
|
+
end
|
26
|
+
|
27
|
+
def choose=(item)
|
28
|
+
valid = @items.detect { |i| i == item }
|
29
|
+
|
30
|
+
unless valid
|
31
|
+
warn "Invalid value '#{item}' for choose, valid options were: #{@items.map { |i| "#{i.inspect}" }.join(", ")}"
|
32
|
+
item = @items.first
|
33
|
+
|
34
|
+
raise "No items list" unless item
|
35
|
+
end
|
36
|
+
|
37
|
+
@choose = item
|
38
|
+
|
39
|
+
self.value = item.to_s
|
40
|
+
|
41
|
+
recalculate
|
42
|
+
end
|
43
|
+
|
44
|
+
def released_left_mouse_button(_sender, _x, _y)
|
45
|
+
show_menu
|
46
|
+
|
47
|
+
:handled
|
48
|
+
end
|
49
|
+
|
50
|
+
def clicked_left_mouse_button(_sender, _x, _y)
|
51
|
+
# @block&.call(self.value) if @enabled
|
52
|
+
|
53
|
+
:handled
|
54
|
+
end
|
55
|
+
|
56
|
+
def show_menu
|
57
|
+
@menu.clear do
|
58
|
+
|
59
|
+
@menu.style.width = width
|
60
|
+
|
61
|
+
@items.each do |item|
|
62
|
+
# prevent already selected item from appearing in list
|
63
|
+
# NOTE: Remove this? Might be kinda confusing...
|
64
|
+
next if item == self.value
|
65
|
+
|
66
|
+
root.gui_state.menu_item(item, width: 1.0, margin: 0, border_color: 0x00ffffff) do
|
67
|
+
self.choose = item
|
68
|
+
@block&.call(self.value)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
recalculate
|
74
|
+
|
75
|
+
@menu.show
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -1,27 +1,27 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class Menu < Stack
|
4
|
-
def recalculate
|
5
|
-
super
|
6
|
-
|
7
|
-
recalculate_menu
|
8
|
-
end
|
9
|
-
|
10
|
-
def recalculate_menu
|
11
|
-
# FIXME: properly find scrollable parent, if any.
|
12
|
-
parent_scroll_top = parent&.parent ? parent.parent.scroll_top : 0
|
13
|
-
|
14
|
-
@x = @parent.x
|
15
|
-
@y = parent_scroll_top + @parent.y + @parent.height
|
16
|
-
|
17
|
-
@y = (parent_scroll_top + @parent.y) - height if @y + height > window.height
|
18
|
-
end
|
19
|
-
|
20
|
-
def show
|
21
|
-
recalculate
|
22
|
-
|
23
|
-
root.gui_state.show_menu(self)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Menu < Stack
|
4
|
+
def recalculate
|
5
|
+
super
|
6
|
+
|
7
|
+
recalculate_menu
|
8
|
+
end
|
9
|
+
|
10
|
+
def recalculate_menu
|
11
|
+
# FIXME: properly find scrollable parent, if any.
|
12
|
+
parent_scroll_top = parent&.parent ? parent.parent.scroll_top : 0
|
13
|
+
|
14
|
+
@x = @parent.x
|
15
|
+
@y = parent_scroll_top + @parent.y + @parent.height
|
16
|
+
|
17
|
+
@y = (parent_scroll_top + @parent.y) - height if @y + height > window.height
|
18
|
+
end
|
19
|
+
|
20
|
+
def show
|
21
|
+
recalculate
|
22
|
+
|
23
|
+
root.gui_state.show_menu(self)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class MenuItem < Button
|
4
|
-
end
|
5
|
-
end
|
6
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class MenuItem < Button
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end
|
@@ -1,93 +1,93 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class Progress < Element
|
4
|
-
attr_reader :type
|
5
|
-
|
6
|
-
def initialize(options = {}, block = nil)
|
7
|
-
super(options, block)
|
8
|
-
|
9
|
-
@animation_speed = options[:animation_speed] || 3_000
|
10
|
-
@marquee_width = options[:marquee_width] || 0.25
|
11
|
-
@marquee_offset = 0
|
12
|
-
@marquee_animation_time = Gosu.milliseconds
|
13
|
-
@type = options[:type] || :linear
|
14
|
-
@fraction_background = Background.new(background: @style.fraction_background)
|
15
|
-
self.value = options[:fraction] || 0.0
|
16
|
-
end
|
17
|
-
|
18
|
-
def render
|
19
|
-
@fraction_background.draw
|
20
|
-
end
|
21
|
-
|
22
|
-
def layout
|
23
|
-
_width = dimensional_size(@style.width, :width)
|
24
|
-
_height = dimensional_size(@style.height, :height)
|
25
|
-
@width = _width
|
26
|
-
@height = _height
|
27
|
-
|
28
|
-
update_background
|
29
|
-
end
|
30
|
-
|
31
|
-
def update_background
|
32
|
-
super
|
33
|
-
|
34
|
-
@fraction_background.x = (@style.border_thickness_left + @style.padding_left + @x) + @marquee_offset
|
35
|
-
@fraction_background.y = @style.border_thickness_top + @style.padding_top + @y
|
36
|
-
@fraction_background.z = @z
|
37
|
-
@fraction_background.width = @width * (@type == :marquee ? @marquee_width : @fraction)
|
38
|
-
@fraction_background.height = @height
|
39
|
-
|
40
|
-
@fraction_background.background = @style.fraction_background
|
41
|
-
end
|
42
|
-
|
43
|
-
def update
|
44
|
-
super
|
45
|
-
|
46
|
-
return unless @type == :marquee
|
47
|
-
|
48
|
-
marquee_width = @width * @marquee_width
|
49
|
-
range = @width + marquee_width
|
50
|
-
|
51
|
-
@marquee_offset = (@width * (Gosu.milliseconds - @marquee_animation_time) / @animation_speed) - marquee_width
|
52
|
-
@marquee_animation_time = Gosu.milliseconds if @marquee_offset > range
|
53
|
-
|
54
|
-
update_background
|
55
|
-
root.gui_state.request_repaint
|
56
|
-
end
|
57
|
-
|
58
|
-
def type=(type)
|
59
|
-
@type = type
|
60
|
-
|
61
|
-
case type
|
62
|
-
when :linear
|
63
|
-
@marquee_offset = 0
|
64
|
-
when :marquee
|
65
|
-
@marquee_offset = 0
|
66
|
-
@marquee_animation_time = Gosu.milliseconds
|
67
|
-
else
|
68
|
-
raise ArgumentError, "Only types :linear and :marquee are supported"
|
69
|
-
end
|
70
|
-
|
71
|
-
update_background
|
72
|
-
end
|
73
|
-
|
74
|
-
def value
|
75
|
-
@fraction
|
76
|
-
end
|
77
|
-
|
78
|
-
def value=(decimal)
|
79
|
-
raise "value must be number" unless decimal.is_a?(Numeric)
|
80
|
-
|
81
|
-
old_value = @fraction
|
82
|
-
|
83
|
-
@fraction = decimal.clamp(0.0, 1.0)
|
84
|
-
update_background
|
85
|
-
|
86
|
-
root.gui_state.request_repaint if @fraction != old_value
|
87
|
-
|
88
|
-
publish(:changed, @fraction)
|
89
|
-
@fraction
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Progress < Element
|
4
|
+
attr_reader :type
|
5
|
+
|
6
|
+
def initialize(options = {}, block = nil)
|
7
|
+
super(options, block)
|
8
|
+
|
9
|
+
@animation_speed = options[:animation_speed] || 3_000
|
10
|
+
@marquee_width = options[:marquee_width] || 0.25
|
11
|
+
@marquee_offset = 0
|
12
|
+
@marquee_animation_time = Gosu.milliseconds
|
13
|
+
@type = options[:type] || :linear
|
14
|
+
@fraction_background = Background.new(background: @style.fraction_background)
|
15
|
+
self.value = options[:fraction] || 0.0
|
16
|
+
end
|
17
|
+
|
18
|
+
def render
|
19
|
+
@fraction_background.draw
|
20
|
+
end
|
21
|
+
|
22
|
+
def layout
|
23
|
+
_width = dimensional_size(@style.width, :width)
|
24
|
+
_height = dimensional_size(@style.height, :height)
|
25
|
+
@width = _width
|
26
|
+
@height = _height
|
27
|
+
|
28
|
+
update_background
|
29
|
+
end
|
30
|
+
|
31
|
+
def update_background
|
32
|
+
super
|
33
|
+
|
34
|
+
@fraction_background.x = (@style.border_thickness_left + @style.padding_left + @x) + @marquee_offset
|
35
|
+
@fraction_background.y = @style.border_thickness_top + @style.padding_top + @y
|
36
|
+
@fraction_background.z = @z
|
37
|
+
@fraction_background.width = @width * (@type == :marquee ? @marquee_width : @fraction)
|
38
|
+
@fraction_background.height = @height
|
39
|
+
|
40
|
+
@fraction_background.background = @style.fraction_background
|
41
|
+
end
|
42
|
+
|
43
|
+
def update
|
44
|
+
super
|
45
|
+
|
46
|
+
return unless @type == :marquee
|
47
|
+
|
48
|
+
marquee_width = @width * @marquee_width
|
49
|
+
range = @width + marquee_width
|
50
|
+
|
51
|
+
@marquee_offset = (@width * (Gosu.milliseconds - @marquee_animation_time) / @animation_speed) - marquee_width
|
52
|
+
@marquee_animation_time = Gosu.milliseconds if @marquee_offset > range
|
53
|
+
|
54
|
+
update_background
|
55
|
+
root.gui_state.request_repaint
|
56
|
+
end
|
57
|
+
|
58
|
+
def type=(type)
|
59
|
+
@type = type
|
60
|
+
|
61
|
+
case type
|
62
|
+
when :linear
|
63
|
+
@marquee_offset = 0
|
64
|
+
when :marquee
|
65
|
+
@marquee_offset = 0
|
66
|
+
@marquee_animation_time = Gosu.milliseconds
|
67
|
+
else
|
68
|
+
raise ArgumentError, "Only types :linear and :marquee are supported"
|
69
|
+
end
|
70
|
+
|
71
|
+
update_background
|
72
|
+
end
|
73
|
+
|
74
|
+
def value
|
75
|
+
@fraction
|
76
|
+
end
|
77
|
+
|
78
|
+
def value=(decimal)
|
79
|
+
raise "value must be number" unless decimal.is_a?(Numeric)
|
80
|
+
|
81
|
+
old_value = @fraction
|
82
|
+
|
83
|
+
@fraction = decimal.clamp(0.0, 1.0)
|
84
|
+
update_background
|
85
|
+
|
86
|
+
root.gui_state.request_repaint if @fraction != old_value
|
87
|
+
|
88
|
+
publish(:changed, @fraction)
|
89
|
+
@fraction
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class Radio < Element
|
4
|
-
end
|
5
|
-
end
|
6
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Radio < Element
|
4
|
+
end
|
5
|
+
end
|
6
|
+
end
|