cyberarm_engine 0.12.1 → 0.13.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/.gitignore +8 -8
- data/.travis.yml +5 -5
- data/Gemfile +6 -6
- data/LICENSE.txt +21 -21
- data/README.md +43 -43
- data/Rakefile +10 -10
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/cyberarm_engine.gemspec +36 -36
- data/lib/cyberarm_engine.rb +47 -46
- data/lib/cyberarm_engine/animator.rb +54 -0
- data/lib/cyberarm_engine/background.rb +175 -175
- data/lib/cyberarm_engine/bounding_box.rb +149 -149
- data/lib/cyberarm_engine/common.rb +96 -96
- data/lib/cyberarm_engine/engine.rb +101 -101
- data/lib/cyberarm_engine/game_object.rb +256 -256
- data/lib/cyberarm_engine/game_state.rb +88 -88
- data/lib/cyberarm_engine/gosu_ext/circle.rb +8 -8
- data/lib/cyberarm_engine/ray.rb +55 -55
- data/lib/cyberarm_engine/shader.rb +262 -205
- data/lib/cyberarm_engine/text.rb +146 -146
- data/lib/cyberarm_engine/timer.rb +22 -22
- data/lib/cyberarm_engine/transform.rb +272 -83
- data/lib/cyberarm_engine/ui/border_canvas.rb +100 -100
- data/lib/cyberarm_engine/ui/dsl.rb +98 -101
- data/lib/cyberarm_engine/ui/element.rb +275 -259
- data/lib/cyberarm_engine/ui/elements/button.rb +66 -66
- data/lib/cyberarm_engine/ui/elements/check_box.rb +58 -58
- data/lib/cyberarm_engine/ui/elements/container.rb +176 -162
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +171 -102
- data/lib/cyberarm_engine/ui/elements/flow.rb +16 -16
- data/lib/cyberarm_engine/ui/elements/image.rb +51 -51
- data/lib/cyberarm_engine/ui/elements/label.rb +49 -49
- data/lib/cyberarm_engine/ui/elements/progress.rb +49 -49
- data/lib/cyberarm_engine/ui/elements/stack.rb +12 -12
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +55 -55
- data/lib/cyberarm_engine/ui/event.rb +46 -45
- data/lib/cyberarm_engine/ui/gui_state.rb +134 -134
- data/lib/cyberarm_engine/ui/style.rb +36 -36
- data/lib/cyberarm_engine/ui/theme.rb +120 -119
- data/lib/cyberarm_engine/vector.rb +202 -198
- data/lib/cyberarm_engine/version.rb +4 -4
- metadata +6 -5
@@ -1,103 +1,172 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class EditLine < Button
|
4
|
-
def initialize(text, options = {}, block = nil)
|
5
|
-
super(text, options, block)
|
6
|
-
|
7
|
-
@type = default(:type)
|
8
|
-
|
9
|
-
@caret_width = default(:caret_width)
|
10
|
-
@caret_height= @text.height
|
11
|
-
@caret_color = default(:caret_color)
|
12
|
-
@caret_interval = default(:caret_interval)
|
13
|
-
@caret_last_interval = Gosu.milliseconds
|
14
|
-
@show_caret = true
|
15
|
-
|
16
|
-
@text_input = Gosu::TextInput.new
|
17
|
-
@text_input.text = text
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
@
|
75
|
-
@
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class EditLine < Button
|
4
|
+
def initialize(text, options = {}, block = nil)
|
5
|
+
super(text, options, block)
|
6
|
+
|
7
|
+
@type = default(:type)
|
8
|
+
|
9
|
+
@caret_width = default(:caret_width)
|
10
|
+
@caret_height= @text.height
|
11
|
+
@caret_color = default(:caret_color)
|
12
|
+
@caret_interval = default(:caret_interval)
|
13
|
+
@caret_last_interval = Gosu.milliseconds
|
14
|
+
@show_caret = true
|
15
|
+
|
16
|
+
@text_input = Gosu::TextInput.new
|
17
|
+
@text_input.text = text
|
18
|
+
|
19
|
+
@offset_x = 0
|
20
|
+
|
21
|
+
return self
|
22
|
+
end
|
23
|
+
|
24
|
+
def render
|
25
|
+
Gosu.clip_to(@text.x, @text.y, @style.width, @text.height) do
|
26
|
+
Gosu.translate(-@offset_x, 0) do
|
27
|
+
draw_selection
|
28
|
+
draw_caret if @focus && @show_caret
|
29
|
+
draw_text
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def draw_caret
|
35
|
+
Gosu.draw_rect(caret_position, @text.y, @caret_width, @caret_height, @caret_color, @z)
|
36
|
+
end
|
37
|
+
|
38
|
+
def draw_selection
|
39
|
+
selection_width = caret_position - selection_start_position
|
40
|
+
|
41
|
+
Gosu.draw_rect(selection_start_position, @text.y, selection_width, @text.height, default(:selection_color), @z)
|
42
|
+
end
|
43
|
+
|
44
|
+
def update
|
45
|
+
if @type == :password
|
46
|
+
@text.text = default(:password_character) * @text_input.text.length
|
47
|
+
else
|
48
|
+
@text.text = @text_input.text
|
49
|
+
end
|
50
|
+
|
51
|
+
if Gosu.milliseconds >= @caret_last_interval + @caret_interval
|
52
|
+
@caret_last_interval = Gosu.milliseconds
|
53
|
+
|
54
|
+
@show_caret = !@show_caret
|
55
|
+
end
|
56
|
+
|
57
|
+
keep_caret_visible
|
58
|
+
end
|
59
|
+
|
60
|
+
def move_caret_to_mouse(mouse_x)
|
61
|
+
1.upto(@text.text.length) do |i|
|
62
|
+
if mouse_x < @text.x + @text.textobject.text_width(@text.text[0...i])
|
63
|
+
@text_input.caret_pos = @text_input.selection_start = i - 1;
|
64
|
+
return
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
@text_input.caret_pos = @text_input.selection_start = @text_input.text.length
|
69
|
+
end
|
70
|
+
|
71
|
+
def keep_caret_visible
|
72
|
+
caret_pos = (caret_position - @text.x) + @caret_width
|
73
|
+
|
74
|
+
@last_text ||= "/\\"
|
75
|
+
@last_pos ||= -1
|
76
|
+
|
77
|
+
puts "caret pos: #{caret_pos}, width: #{@width}, offset: #{@offset_x}" if (@last_text != @text.text) || (@last_pos != caret_pos)
|
78
|
+
|
79
|
+
@last_text = @text.text
|
80
|
+
@last_pos = caret_pos
|
81
|
+
|
82
|
+
|
83
|
+
if caret_pos.between?(@offset_x, @width + @offset_x)
|
84
|
+
# Do nothing
|
85
|
+
|
86
|
+
elsif caret_pos < @offset_x
|
87
|
+
if caret_pos > @width
|
88
|
+
@offset_x = caret_pos + @width
|
89
|
+
else
|
90
|
+
@offset_x = 0
|
91
|
+
end
|
92
|
+
|
93
|
+
elsif caret_pos > @width
|
94
|
+
@offset_x = caret_pos - @width
|
95
|
+
puts "triggered"
|
96
|
+
|
97
|
+
else
|
98
|
+
# Reset to Zero
|
99
|
+
@offset_x = 0
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def left_mouse_button(sender, x, y)
|
104
|
+
super
|
105
|
+
window.text_input = @text_input
|
106
|
+
|
107
|
+
@caret_last_interval = Gosu.milliseconds
|
108
|
+
@show_caret = true
|
109
|
+
|
110
|
+
move_caret_to_mouse(x)
|
111
|
+
|
112
|
+
return :handled
|
113
|
+
end
|
114
|
+
|
115
|
+
def enter(sender)
|
116
|
+
if @focus
|
117
|
+
@style.background_canvas.background = default(:active, :background)
|
118
|
+
@text.color = default(:active, :color)
|
119
|
+
else
|
120
|
+
@style.background_canvas.background = default(:hover, :background)
|
121
|
+
@text.color = default(:hover, :color)
|
122
|
+
end
|
123
|
+
|
124
|
+
return :handled
|
125
|
+
end
|
126
|
+
|
127
|
+
def leave(sender)
|
128
|
+
unless @focus
|
129
|
+
super
|
130
|
+
end
|
131
|
+
|
132
|
+
return :handled
|
133
|
+
end
|
134
|
+
|
135
|
+
def blur(sender)
|
136
|
+
@focus = false
|
137
|
+
@style.background_canvas.background = default(:background)
|
138
|
+
@text.color = default(:color)
|
139
|
+
window.text_input = nil
|
140
|
+
|
141
|
+
return :handled
|
142
|
+
end
|
143
|
+
|
144
|
+
def caret_position
|
145
|
+
text_input_position_for(:caret_pos)
|
146
|
+
end
|
147
|
+
|
148
|
+
def selection_start_position
|
149
|
+
text_input_position_for(:selection_start)
|
150
|
+
end
|
151
|
+
|
152
|
+
def text_input_position_for(method)
|
153
|
+
if @type == :password
|
154
|
+
@text.x + @text.textobject.text_width(default(:password_character) * @text_input.text[0..@text_input.send(method)].length)
|
155
|
+
else
|
156
|
+
@text.x + @text.textobject.text_width(@text_input.text[0..@text_input.send(method)])
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def recalculate
|
161
|
+
super
|
162
|
+
|
163
|
+
@width = dimensional_size(@style.width, :width) || default(:width)
|
164
|
+
update_background
|
165
|
+
end
|
166
|
+
|
167
|
+
def value
|
168
|
+
@text_input.text
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
103
172
|
end
|
@@ -1,17 +1,17 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class Flow < Container
|
4
|
-
include Common
|
5
|
-
|
6
|
-
def layout
|
7
|
-
@children.each do |child|
|
8
|
-
if fits_on_line?(child)
|
9
|
-
position_on_current_line(child)
|
10
|
-
else
|
11
|
-
position_on_next_line(child)
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Flow < Container
|
4
|
+
include Common
|
5
|
+
|
6
|
+
def layout
|
7
|
+
@children.each do |child|
|
8
|
+
if fits_on_line?(child)
|
9
|
+
position_on_current_line(child)
|
10
|
+
else
|
11
|
+
position_on_next_line(child)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
17
|
end
|
@@ -1,52 +1,52 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class Image < Element
|
4
|
-
def initialize(path, options = {}, block = nil)
|
5
|
-
super(options, block)
|
6
|
-
@path = path
|
7
|
-
|
8
|
-
@image = Gosu::Image.new(path, retro: @options[:image_retro])
|
9
|
-
@scale_x, @scale_y = 1, 1
|
10
|
-
end
|
11
|
-
|
12
|
-
def render
|
13
|
-
@image.draw(
|
14
|
-
@style.border_thickness_left + @style.padding_left + @x,
|
15
|
-
@style.border_thickness_top + @style.padding_top + @y,
|
16
|
-
@z + 2,
|
17
|
-
@scale_x, @scale_y) # TODO: Add color support?
|
18
|
-
end
|
19
|
-
|
20
|
-
def clicked_left_mouse_button(sender, x, y)
|
21
|
-
@block.call(self) if @block
|
22
|
-
|
23
|
-
return :handled
|
24
|
-
end
|
25
|
-
|
26
|
-
def recalculate
|
27
|
-
_width = dimensional_size(@style.width, :width)
|
28
|
-
_height= dimensional_size(@style.height,:height)
|
29
|
-
|
30
|
-
if _width && _height
|
31
|
-
@scale_x = _width.to_f / @image.width
|
32
|
-
@scale_y = _height.to_f / @image.height
|
33
|
-
elsif _width
|
34
|
-
@scale_x = _width.to_f / @image.width
|
35
|
-
@scale_y = @scale_x
|
36
|
-
elsif _height
|
37
|
-
@scale_y = _height.to_f / @image.height
|
38
|
-
@scale_x = @scale_y
|
39
|
-
else
|
40
|
-
@scale_x, @scale_y = 1, 1
|
41
|
-
end
|
42
|
-
|
43
|
-
@width = _width ? _width : @image.width.round * @scale_x
|
44
|
-
@height= _height ? _height : @image.height.round * @scale_y
|
45
|
-
end
|
46
|
-
|
47
|
-
def value
|
48
|
-
@path
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Image < Element
|
4
|
+
def initialize(path, options = {}, block = nil)
|
5
|
+
super(options, block)
|
6
|
+
@path = path
|
7
|
+
|
8
|
+
@image = Gosu::Image.new(path, retro: @options[:image_retro])
|
9
|
+
@scale_x, @scale_y = 1, 1
|
10
|
+
end
|
11
|
+
|
12
|
+
def render
|
13
|
+
@image.draw(
|
14
|
+
@style.border_thickness_left + @style.padding_left + @x,
|
15
|
+
@style.border_thickness_top + @style.padding_top + @y,
|
16
|
+
@z + 2,
|
17
|
+
@scale_x, @scale_y) # TODO: Add color support?
|
18
|
+
end
|
19
|
+
|
20
|
+
def clicked_left_mouse_button(sender, x, y)
|
21
|
+
@block.call(self) if @block
|
22
|
+
|
23
|
+
return :handled
|
24
|
+
end
|
25
|
+
|
26
|
+
def recalculate
|
27
|
+
_width = dimensional_size(@style.width, :width)
|
28
|
+
_height= dimensional_size(@style.height,:height)
|
29
|
+
|
30
|
+
if _width && _height
|
31
|
+
@scale_x = _width.to_f / @image.width
|
32
|
+
@scale_y = _height.to_f / @image.height
|
33
|
+
elsif _width
|
34
|
+
@scale_x = _width.to_f / @image.width
|
35
|
+
@scale_y = @scale_x
|
36
|
+
elsif _height
|
37
|
+
@scale_y = _height.to_f / @image.height
|
38
|
+
@scale_x = @scale_y
|
39
|
+
else
|
40
|
+
@scale_x, @scale_y = 1, 1
|
41
|
+
end
|
42
|
+
|
43
|
+
@width = _width ? _width : @image.width.round * @scale_x
|
44
|
+
@height= _height ? _height : @image.height.round * @scale_y
|
45
|
+
end
|
46
|
+
|
47
|
+
def value
|
48
|
+
@path
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
52
|
end
|
@@ -1,50 +1,50 @@
|
|
1
|
-
module CyberarmEngine
|
2
|
-
class Element
|
3
|
-
class Label < Element
|
4
|
-
def initialize(text, options = {}, block = nil)
|
5
|
-
super(options, block)
|
6
|
-
|
7
|
-
@text = Text.new(text, font: @options[:font], z: @z, color: @options[:color], size: @options[:text_size], shadow: @options[:text_shadow])
|
8
|
-
end
|
9
|
-
|
10
|
-
def render
|
11
|
-
@text.draw
|
12
|
-
end
|
13
|
-
|
14
|
-
def clicked_left_mouse_button(sender, x, y)
|
15
|
-
@block.call(self) if @block
|
16
|
-
|
17
|
-
return :handled
|
18
|
-
end
|
19
|
-
|
20
|
-
def recalculate
|
21
|
-
@width, @height = 0, 0
|
22
|
-
|
23
|
-
_width = dimensional_size(@style.width, :width)
|
24
|
-
_height= dimensional_size(@style.height,:height)
|
25
|
-
|
26
|
-
@width = _width ? _width : @text.width.round
|
27
|
-
@height= _height ? _height : @text.height.round
|
28
|
-
|
29
|
-
@text.x = @style.border_thickness_left + @style.padding_left + @x
|
30
|
-
@text.y = @style.border_thickness_top + @style.padding_top + @y
|
31
|
-
@text.z = @z + 3
|
32
|
-
|
33
|
-
update_background
|
34
|
-
end
|
35
|
-
|
36
|
-
def value
|
37
|
-
@text.text
|
38
|
-
end
|
39
|
-
|
40
|
-
def value=(value)
|
41
|
-
@text.text = value
|
42
|
-
|
43
|
-
old_width, old_height = width, height
|
44
|
-
recalculate
|
45
|
-
|
46
|
-
root.gui_state.request_recalculate if old_width != width || old_height != height
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
1
|
+
module CyberarmEngine
|
2
|
+
class Element
|
3
|
+
class Label < Element
|
4
|
+
def initialize(text, options = {}, block = nil)
|
5
|
+
super(options, block)
|
6
|
+
|
7
|
+
@text = Text.new(text, font: @options[:font], z: @z, color: @options[:color], size: @options[:text_size], shadow: @options[:text_shadow])
|
8
|
+
end
|
9
|
+
|
10
|
+
def render
|
11
|
+
@text.draw
|
12
|
+
end
|
13
|
+
|
14
|
+
def clicked_left_mouse_button(sender, x, y)
|
15
|
+
@block.call(self) if @block
|
16
|
+
|
17
|
+
return :handled
|
18
|
+
end
|
19
|
+
|
20
|
+
def recalculate
|
21
|
+
@width, @height = 0, 0
|
22
|
+
|
23
|
+
_width = dimensional_size(@style.width, :width)
|
24
|
+
_height= dimensional_size(@style.height,:height)
|
25
|
+
|
26
|
+
@width = _width ? _width : @text.width.round
|
27
|
+
@height= _height ? _height : @text.height.round
|
28
|
+
|
29
|
+
@text.x = @style.border_thickness_left + @style.padding_left + @x
|
30
|
+
@text.y = @style.border_thickness_top + @style.padding_top + @y
|
31
|
+
@text.z = @z + 3
|
32
|
+
|
33
|
+
update_background
|
34
|
+
end
|
35
|
+
|
36
|
+
def value
|
37
|
+
@text.text
|
38
|
+
end
|
39
|
+
|
40
|
+
def value=(value)
|
41
|
+
@text.text = value
|
42
|
+
|
43
|
+
old_width, old_height = width, height
|
44
|
+
recalculate
|
45
|
+
|
46
|
+
root.gui_state.request_recalculate if old_width != width || old_height != height
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
50
|
end
|