cyberarm_engine 0.13.1 → 0.14.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: df44f5d01eb555b4e210141def7448388e67a27059cb57c28d475a059af4013c
4
- data.tar.gz: 072bc76caf9f09e33bb0272f30dd7c30877ddda2c2f820b3784208c5c189f7b2
3
+ metadata.gz: 358b4f43be50c3d5013260d6033c63b8d28b1b0475faf0d9e34a136cb9064244
4
+ data.tar.gz: d2a72568cca7508558c4ff0f8f3eb9adaba1b02a9faa08a48a0bc9bf576edcdf
5
5
  SHA512:
6
- metadata.gz: b2a039f52667d0a0360c13028f5c85346bb34c4b04759cec2fa77d14f51832477dca033ca213264ef83e41776f5e94715b4cc488e2deede70f3dbc2f6c05f830
7
- data.tar.gz: d4fc61ff5cbb1815cc3c359e7c1ca5e7611382826e2c1fc2a705be0d33102aa3974ee437b7cba83271a07dd730157317102f75a0c3026908e904c370889514a8
6
+ metadata.gz: d57818c6ba87cdd22e1bbddc9d50800fdc9f4890cc8c3f8ce21b4aea1aa20db5e410c14718d196c0d0f778ae3856c9e2befcd9fb9401d998934a1428d8f92beb
7
+ data.tar.gz: 3b50a6658c4bdc82231ca17d2c66386dcb470ff638d5e6d6fb372f2e0184b455fcddb60aad147cc246190b3839bcc9bf7bfeeb7699879a5aabdeef761751e09d
data/README.md CHANGED
@@ -42,7 +42,7 @@ class Hello < CyberarmEngine::GuiState
42
42
  end
43
43
  end
44
44
 
45
- class Window < CyberarmEngine::Engine
45
+ class Window < CyberarmEngine::Window
46
46
  def initialize
47
47
  super
48
48
  self.show_cursor = true
@@ -29,8 +29,9 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ["lib"]
30
30
 
31
31
  spec.add_dependency "gosu", "~> 0.15.0"
32
+ spec.add_dependency "gosu_more_drawables", "~> 0.3"
32
33
 
33
34
  spec.add_development_dependency "bundler", "~> 1.16"
34
- spec.add_development_dependency "rake", "~> 10.0"
35
+ spec.add_development_dependency "rake", "~> 13.0"
35
36
  spec.add_development_dependency "minitest", "~> 5.0"
36
37
  end
@@ -5,15 +5,15 @@ rescue LoadError => e
5
5
  require "gosu"
6
6
  end
7
7
  require "json"
8
+ require "gosu_more_drawables"
8
9
 
9
10
  require_relative "cyberarm_engine/version"
11
+ require_relative "cyberarm_engine/stats"
10
12
 
11
13
  require_relative "cyberarm_engine/common"
12
14
 
13
- require_relative "cyberarm_engine/gosu_ext/circle"
14
-
15
15
  require_relative "cyberarm_engine/game_object"
16
- require_relative "cyberarm_engine/engine"
16
+ require_relative "cyberarm_engine/window"
17
17
 
18
18
  require_relative "cyberarm_engine/bounding_box"
19
19
  require_relative "cyberarm_engine/vector"
@@ -35,15 +35,19 @@ require_relative "cyberarm_engine/ui/style"
35
35
  require_relative "cyberarm_engine/ui/border_canvas"
36
36
  require_relative "cyberarm_engine/ui/element"
37
37
  require_relative "cyberarm_engine/ui/elements/label"
38
+ require_relative "cyberarm_engine/ui/elements/list_box"
38
39
  require_relative "cyberarm_engine/ui/elements/button"
39
40
  require_relative "cyberarm_engine/ui/elements/toggle_button"
40
41
  require_relative "cyberarm_engine/ui/elements/edit_line"
42
+ require_relative "cyberarm_engine/ui/elements/edit_box"
41
43
  require_relative "cyberarm_engine/ui/elements/image"
42
44
  require_relative "cyberarm_engine/ui/elements/container"
43
45
  require_relative "cyberarm_engine/ui/elements/flow"
44
46
  require_relative "cyberarm_engine/ui/elements/stack"
45
47
  require_relative "cyberarm_engine/ui/elements/check_box"
48
+ require_relative "cyberarm_engine/ui/elements/radio"
46
49
  require_relative "cyberarm_engine/ui/elements/progress"
50
+ require_relative "cyberarm_engine/ui/elements/slider"
47
51
 
48
52
  require_relative "cyberarm_engine/game_state"
49
53
  require_relative "cyberarm_engine/ui/gui_state"
@@ -78,15 +78,15 @@ module CyberarmEngine
78
78
  end
79
79
 
80
80
  def get_image(path, retro: false, tileable: false)
81
- get_asset(path, Engine::IMAGES, Gosu::Image, retro, tileable)
81
+ get_asset(path, Window::IMAGES, Gosu::Image, retro, tileable)
82
82
  end
83
83
 
84
84
  def get_sample(path)
85
- get_asset(path, Engine::SAMPLES, Gosu::Sample)
85
+ get_asset(path, Window::SAMPLES, Gosu::Sample)
86
86
  end
87
87
 
88
88
  def get_song(path)
89
- get_asset(path, Engine::SONGS, Gosu::Song)
89
+ get_asset(path, Window::SONGS, Gosu::Song)
90
90
  end
91
91
 
92
92
  def window
@@ -0,0 +1,21 @@
1
+ module CyberarmEngine
2
+ class Stats
3
+ @@hash = {
4
+ gui_recalculations_last_frame: 0
5
+ }
6
+
7
+ def self.get(key)
8
+ @@hash.dig(key)
9
+ end
10
+
11
+ def self.increment(key, n)
12
+ @@hash[key] += n
13
+ end
14
+
15
+ def self.clear
16
+ @@hash.each do |key, value|
17
+ @@hash[key] = 0
18
+ end
19
+ end
20
+ end
21
+ end
@@ -9,7 +9,7 @@ module CyberarmEngine
9
9
  @text = text.to_s || ""
10
10
  @options = options
11
11
  @size = options[:size] || 18
12
- @font = options[:font] || "sans-serif"#Gosu.default_font_name
12
+ @font = options[:font] || Gosu.default_font_name
13
13
  @x = options[:x] || 0
14
14
  @y = options[:y] || 0
15
15
  @z = options[:z] || 1025
@@ -98,12 +98,12 @@ module CyberarmEngine
98
98
  @shadow_color = n
99
99
  end
100
100
 
101
- def width
102
- textobject.text_width(@text)
101
+ def width(text = @text)
102
+ textobject.text_width(text)
103
103
  end
104
104
 
105
- def height
106
- @text.lines.count > 0 ? (@text.lines.count) * textobject.height : @textobject.height
105
+ def height(text = @text)
106
+ text.lines.count > 0 ? (text.lines.count) * textobject.height : @textobject.height
107
107
  end
108
108
 
109
109
  def draw
@@ -57,6 +57,13 @@ module CyberarmEngine
57
57
  add_element( Element::Progress.new(options, block) )
58
58
  end
59
59
 
60
+ def slider(options = {}, &block)
61
+ options[:parent] = element_parent
62
+ options[:theme] = current_theme
63
+
64
+ add_element( Element::Slider.new(options, block) )
65
+ end
66
+
60
67
  def background(color = Gosu::Color::NONE)
61
68
  element_parent.style.background = color
62
69
  end
@@ -4,7 +4,7 @@ module CyberarmEngine
4
4
  include Event
5
5
  include Common
6
6
 
7
- attr_accessor :x, :y, :z, :enabled
7
+ attr_accessor :x, :y, :z, :enabled, :tip
8
8
  attr_reader :parent, :options, :style, :event_handler, :background_canvas, :border_canvas
9
9
 
10
10
  def initialize(options = {}, block = nil)
@@ -16,6 +16,7 @@ module CyberarmEngine
16
16
  @focus = false
17
17
  @enabled = true
18
18
  @visible = true
19
+ @tip = @options[:tip] ? @options[:tip] : ""
19
20
 
20
21
  @style = Style.new(options)
21
22
 
@@ -110,6 +111,8 @@ module CyberarmEngine
110
111
  event(:leave)
111
112
 
112
113
  event(:blur)
114
+
115
+ event(:changed)
113
116
  end
114
117
 
115
118
  def enabled?
@@ -152,6 +155,10 @@ module CyberarmEngine
152
155
  def button_up(id)
153
156
  end
154
157
 
158
+ def draggable?(button)
159
+ false
160
+ end
161
+
155
162
  def render
156
163
  end
157
164
 
@@ -212,7 +219,7 @@ module CyberarmEngine
212
219
  raise "dimension must be either :width or :height" unless dimension == :width || dimension == :height
213
220
  if size && size.is_a?(Numeric)
214
221
  if size.between?(0.0, 1.0)
215
- ((@parent.send(:"content_#{dimension}") - self.send(:"noncontent_#{dimension}") - 1) * size).round
222
+ ((@parent.send(:"content_#{dimension}") - self.send(:"noncontent_#{dimension}")) * size).round
216
223
  else
217
224
  size
218
225
  end
@@ -239,6 +246,8 @@ module CyberarmEngine
239
246
  end
240
247
 
241
248
  def root
249
+ return self if is_root?
250
+
242
251
  unless @root && @root.parent.nil?
243
252
  @root = parent
244
253
 
@@ -272,5 +281,9 @@ module CyberarmEngine
272
281
  def value=(value)
273
282
  raise "#{self.class}#value= was not overridden!"
274
283
  end
284
+
285
+ def to_s
286
+ "#{self.class} x=#{x} y=#{y} width=#{width} height=#{height} value=#{ value.is_a?(String) ? "\"#{value}\"" : value }"
287
+ end
275
288
  end
276
289
  end
@@ -2,13 +2,32 @@ module CyberarmEngine
2
2
  class Element
3
3
  class CheckBox < Flow
4
4
  def initialize(text, options, block = nil)
5
- super({}, block = nil)
5
+ super(options, block)
6
6
  options[:toggled] = options[:checked]
7
7
 
8
8
  @toggle_button = ToggleButton.new(options)
9
9
  @label = Label.new(text, options)
10
10
 
11
- define_label_singletons
11
+ @label.subscribe(:holding_left_mouse_button) do |sender, x, y|
12
+ @toggle_button.left_mouse_button(sender, x, y)
13
+ end
14
+
15
+ @label.subscribe(:released_left_mouse_button) do |sender, x, y|
16
+ @toggle_button.released_left_mouse_button(sender, x, y)
17
+ end
18
+
19
+ @label.subscribe(:clicked_left_mouse_button) do |sender, x, y|
20
+ @toggle_button.clicked_left_mouse_button(sender, x, y)
21
+ publish(:changed, @toggle_button.value)
22
+ end
23
+
24
+ @label.subscribe(:enter) do |sender|
25
+ @toggle_button.enter(sender)
26
+ end
27
+
28
+ @label.subscribe(:leave) do |sender|
29
+ @toggle_button.leave(sender)
30
+ end
12
31
 
13
32
  add(@toggle_button)
14
33
  add(@label)
@@ -24,35 +43,8 @@ module CyberarmEngine
24
43
  end
25
44
 
26
45
  def value=(bool)
27
- @toggle_button.vlaue = bool
28
- end
29
-
30
- def define_label_singletons
31
- @label.define_singleton_method(:_toggle_button) do |button|
32
- @_toggle_button = button
33
- end
34
-
35
- @label._toggle_button(@toggle_button)
36
-
37
- @label.define_singleton_method(:holding_left_mouse_button) do |sender, x, y|
38
- @_toggle_button.left_mouse_button(sender, x, y)
39
- end
40
-
41
- @label.define_singleton_method(:released_left_mouse_button) do |sender, x, y|
42
- @_toggle_button.released_left_mouse_button(sender, x, y)
43
- end
44
-
45
- @label.define_singleton_method(:clicked_left_mouse_button) do |sender, x, y|
46
- @_toggle_button.clicked_left_mouse_button(sender, x, y)
47
- end
48
-
49
- @label.define_singleton_method(:enter) do |sender|
50
- @_toggle_button.enter(sender)
51
- end
52
-
53
- @label.define_singleton_method(:leave) do |sender|
54
- @_toggle_button.leave(sender)
55
- end
46
+ @toggle_button.value = bool
47
+ publish(:changed, @toggle_button.value)
56
48
  end
57
49
  end
58
50
  end
@@ -22,13 +22,13 @@ module CyberarmEngine
22
22
  def build
23
23
  @block.call(self) if @block
24
24
 
25
- recalculate
25
+ root.gui_state.request_recalculate
26
26
  end
27
27
 
28
28
  def add(element)
29
29
  @children << element
30
30
 
31
- recalculate
31
+ root.gui_state.request_recalculate
32
32
  end
33
33
 
34
34
  def clear(&block)
@@ -41,7 +41,6 @@ module CyberarmEngine
41
41
 
42
42
  $__current_container__ = old_container
43
43
 
44
- recalculate
45
44
  root.gui_state.request_recalculate
46
45
  end
47
46
 
@@ -57,6 +56,8 @@ module CyberarmEngine
57
56
 
58
57
  def hit_element?(x, y)
59
58
  @children.reverse_each do |child|
59
+ next unless child.visible?
60
+
60
61
  case child
61
62
  when Container
62
63
  if element = child.hit_element?(x, y)
@@ -73,6 +74,9 @@ module CyberarmEngine
73
74
  def recalculate
74
75
  @current_position = Vector.new(@style.margin_left + @style.padding_left, @style.margin_top + @style.padding_top)
75
76
  return unless visible?
77
+
78
+ Stats.increment(:gui_recalculations_last_frame, 1)
79
+
76
80
  stylize
77
81
 
78
82
  layout
@@ -90,15 +94,16 @@ module CyberarmEngine
90
94
  @height = _height ? _height : (@children.map {|c| c.y + c.outer_height}.max || 0).round
91
95
  end
92
96
 
93
-
94
97
  # Move child to parent after positioning
95
98
  @children.each do |child|
96
- child.x += @x
97
- child.y += @y
99
+ child.x += (@x + @style.border_thickness_left) - style.margin_left
100
+ child.y += (@y + @style.border_thickness_top) - style.margin_top
98
101
 
99
102
  child.stylize
100
103
  child.recalculate
101
104
  child.reposition # TODO: Implement top,bottom,left,center, and right positioning
105
+
106
+ Stats.increment(:gui_recalculations_last_frame, 1)
102
107
  end
103
108
 
104
109
  update_background
@@ -109,10 +114,12 @@ module CyberarmEngine
109
114
  end
110
115
 
111
116
  def max_width
112
- @max_width ? @max_width : window.width - (@parent ? @parent.style.margin_right + @style.margin_right : @style.margin_right)
117
+ _width = dimensional_size(@style.width, :width)
118
+ _width ? outer_width : window.width - (@parent ? @parent.style.margin_right + @style.margin_right : @style.margin_right)
113
119
  end
114
120
 
115
121
  def fits_on_line?(element) # Flow
122
+ p [@options[:id], @width] if @options[:id]
116
123
  @current_position.x + element.outer_width <= max_width &&
117
124
  @current_position.x + element.outer_width <= window.width
118
125
  end
@@ -171,6 +178,25 @@ module CyberarmEngine
171
178
  def value
172
179
  @children.map {|c| c.class}.join(", ")
173
180
  end
181
+
182
+ def to_s
183
+ "#{self.class} x=#{x} y=#{y} width=#{width} height=#{height} children=#{@children.size}"
184
+ end
185
+
186
+ def write_tree(indent = "", index = 0)
187
+ puts self
188
+
189
+ indent = indent + " "
190
+ @children.each_with_index do |child, i|
191
+ print "#{indent}#{i}: "
192
+
193
+ if child.is_a?(Container)
194
+ child.write_tree(indent)
195
+ else
196
+ puts child
197
+ end
198
+ end
199
+ end
174
200
  end
175
201
  end
176
202
  end
@@ -0,0 +1,6 @@
1
+ module CyberarmEngine
2
+ class Element
3
+ class EditBox < Element
4
+ end
5
+ end
6
+ end
@@ -100,6 +100,22 @@ module CyberarmEngine
100
100
  end
101
101
  end
102
102
 
103
+ def caret_position
104
+ text_input_position_for(:caret_pos)
105
+ end
106
+
107
+ def selection_start_position
108
+ text_input_position_for(:selection_start)
109
+ end
110
+
111
+ def text_input_position_for(method)
112
+ if @type == :password
113
+ @text.x + @text.width(default(:password_character) * @text_input.text[0..@text_input.send(method)].length)
114
+ else
115
+ @text.x + @text.width(@text_input.text[0..@text_input.send(method)])
116
+ end
117
+ end
118
+
103
119
  def left_mouse_button(sender, x, y)
104
120
  super
105
121
  window.text_input = @text_input
@@ -141,22 +157,6 @@ module CyberarmEngine
141
157
  return :handled
142
158
  end
143
159
 
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
160
  def recalculate
161
161
  super
162
162
 
@@ -1,8 +1,6 @@
1
1
  module CyberarmEngine
2
2
  class Element
3
3
  class Flow < Container
4
- include Common
5
-
6
4
  def layout
7
5
  @children.each do |child|
8
6
  if fits_on_line?(child)
@@ -14,7 +14,7 @@ module CyberarmEngine
14
14
  def clicked_left_mouse_button(sender, x, y)
15
15
  @block.call(self) if @block
16
16
 
17
- return :handled
17
+ # return :handled
18
18
  end
19
19
 
20
20
  def recalculate
@@ -44,6 +44,8 @@ module CyberarmEngine
44
44
  recalculate
45
45
 
46
46
  root.gui_state.request_recalculate if old_width != width || old_height != height
47
+
48
+ publish(:changed, self.value)
47
49
  end
48
50
  end
49
51
  end
@@ -0,0 +1,6 @@
1
+ module CyberarmEngine
2
+ class Element
3
+ class ListBox < Element
4
+ end
5
+ end
6
+ end
@@ -43,6 +43,7 @@ module CyberarmEngine
43
43
  @fraction = decimal.clamp(0.0, 1.0)
44
44
  update_background
45
45
 
46
+ publish(:changed, @fraction)
46
47
  return @fraction
47
48
  end
48
49
  end
@@ -0,0 +1,6 @@
1
+ module CyberarmEngine
2
+ class Element
3
+ class Radio < Element
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,107 @@
1
+ module CyberarmEngine
2
+ class Element
3
+ class Slider < Container
4
+ class Handle < Button
5
+ def initialize(*args)
6
+ super(*args)
7
+
8
+ event(:begin_drag)
9
+ event(:drag_update)
10
+ event(:end_drag)
11
+
12
+ subscribe :begin_drag do |sender, x, y, button|
13
+ @drag_start_pos = Vector.new(x, y)
14
+
15
+ :handled
16
+ end
17
+
18
+ subscribe :drag_update do |sender, x, y, button|
19
+ @parent.handle_dragged_to(x, y)
20
+
21
+ :handled
22
+ end
23
+
24
+ subscribe :end_drag do
25
+ @drag_start_pos = nil
26
+
27
+ :handled
28
+ end
29
+ end
30
+
31
+ def draggable?(button)
32
+ button == :left
33
+ end
34
+ end
35
+
36
+ attr_reader :range, :step_size
37
+ def initialize(options = {}, block = nil)
38
+ super(options, block)
39
+
40
+ @range = @options[:range] ? @options[:range] : 0.0..1.0
41
+ @step_size = @options[:step] ? @options[:step] : 0.1
42
+ @value = @options[:value] ? @options[:value] : (@range.first + @range.last) / 2
43
+
44
+ @handle = Handle.new("", parent: self, width: 8, height: 1.0) { close }
45
+ self.add(@handle)
46
+ end
47
+
48
+ def recalculate
49
+ _width = dimensional_size(@style.width, :width)
50
+ _height= dimensional_size(@style.height,:height)
51
+
52
+ @width = _width
53
+ @height = _height
54
+
55
+ position_handle
56
+ @handle.recalculate
57
+ @handle.update_background
58
+
59
+ update_background
60
+ end
61
+
62
+ def position_handle
63
+ @handle.x = @x + @style.padding_left + @style.border_thickness_left +
64
+ ((content_width - @handle.outer_width) * (@value - @range.min) / (@range.max - @range.min).to_f)
65
+
66
+ @handle.y = @y + @style.border_thickness_top + @style.padding_top
67
+ end
68
+
69
+ def draw
70
+ super
71
+
72
+ @handle.draw
73
+ end
74
+
75
+ def update
76
+ super
77
+
78
+ @tip = value.to_s
79
+ @handle.tip = @tip
80
+ end
81
+
82
+ def holding_left_mouse_button(sender, x, y)
83
+ handle_dragged_to(x, y)
84
+
85
+ :handled
86
+ end
87
+
88
+ def handle_dragged_to(x, y)
89
+ @ratio = ((x - @handle.width / 2) - @x) / (content_width - @handle.outer_width)
90
+
91
+ self.value = @ratio.clamp(0.0, 1.0) * (@range.max - @range.min) + @range.min
92
+ end
93
+
94
+ def value
95
+ @value
96
+ end
97
+
98
+ def value=(n)
99
+ @value = n
100
+ position_handle
101
+ @handle.recalculate
102
+
103
+ publish(:changed, @value)
104
+ end
105
+ end
106
+ end
107
+ end
@@ -1,8 +1,6 @@
1
1
  module CyberarmEngine
2
2
  class Element
3
3
  class Stack < Container
4
- include Common
5
-
6
4
  def layout
7
5
  @children.each do |child|
8
6
  move_to_next_line(child)
@@ -5,8 +5,8 @@ module CyberarmEngine
5
5
 
6
6
  def initialize(options, block = nil)
7
7
  super(options[:checkmark], options, block)
8
- @toggled = options[:toggled] || false
9
- if @toggled
8
+ @value = options[:checked] || false
9
+ if @value
10
10
  @text.text = @options[:checkmark]
11
11
  else
12
12
  @text.text = ""
@@ -15,41 +15,42 @@ module CyberarmEngine
15
15
  return self
16
16
  end
17
17
 
18
- def toggled=(boolean)
19
- @toggled = !boolean
20
- toggle
21
- end
22
-
23
18
  def clicked_left_mouse_button(sender, x, y)
24
- toggle
19
+ self.value = !@value
25
20
 
26
21
  @block.call(self) if @block
27
22
 
28
23
  return :handled
29
24
  end
30
25
 
31
- def toggle
32
- if @toggled
33
- @toggled = false
34
- @text.text = ""
35
- else
36
- @toggled = true
37
- @text.text = @options[:checkmark]
38
- end
39
- end
40
-
41
26
  def recalculate
42
27
  super
43
28
 
44
29
  _width = dimensional_size(@style.width, :width)
45
30
  _height= dimensional_size(@style.height,:height)
31
+
46
32
  @width = _width ? _width : @text.textobject.text_width(@options[:checkmark])
47
33
  @height = _height ? _height : @text.height
34
+
48
35
  update_background
49
36
  end
50
37
 
51
38
  def value
52
- @toggled
39
+ @value
40
+ end
41
+
42
+ def value=(boolean)
43
+ @value = boolean
44
+
45
+ if boolean
46
+ @text.text = @options[:checkmark]
47
+ else
48
+ @text.text = ""
49
+ end
50
+
51
+ recalculate
52
+
53
+ publish(:changed, @value)
53
54
  end
54
55
  end
55
56
  end
@@ -22,6 +22,11 @@ module CyberarmEngine
22
22
  @mouse_down_on = {}
23
23
  @mouse_down_position = {}
24
24
  @pending_recalculate_request = false
25
+
26
+ @tip = CyberarmEngine::Text.new("", size: 22, z: Float::INFINITY)
27
+ @menu = nil
28
+ @min_drag_distance = 0
29
+ @mouse_pos = Vector.new
25
30
  end
26
31
 
27
32
  # throws :blur event to focused element and sets GuiState focused element
@@ -35,8 +40,18 @@ module CyberarmEngine
35
40
  @focus
36
41
  end
37
42
 
43
+ def draw
44
+ super
45
+
46
+ if @tip.text.length > 0
47
+ Gosu.draw_rect(@tip.x - 2, @tip.y - 2, @tip.width + 4, @tip.height + 4, 0xff020202, Float::INFINITY)
48
+ @tip.draw
49
+ end
50
+ end
51
+
38
52
  def update
39
53
  if @pending_recalculate_request
54
+ @root_container.recalculate
40
55
  @root_container.recalculate
41
56
  @pending_recalculate_request = false
42
57
  end
@@ -56,12 +71,30 @@ module CyberarmEngine
56
71
  redirect_holding_mouse_button(:middle) if @mouse_over && Gosu.button_down?(Gosu::MsMiddle)
57
72
  redirect_holding_mouse_button(:right) if @mouse_over && Gosu.button_down?(Gosu::MsRight)
58
73
 
74
+ if Vector.new(window.mouse_x, window.mouse_y) == @last_mouse_pos
75
+ if @mouse_over && (Gosu.milliseconds - @mouse_moved_at) > tool_tip_delay
76
+ @tip.text = @mouse_over.tip if @mouse_over
77
+ @tip.x, @tip.y = window.mouse_x - @tip.width / 2, window.mouse_y - @tip.height - 4
78
+ else
79
+ @tip.text = ""
80
+ end
81
+ else
82
+ @mouse_moved_at = Gosu.milliseconds
83
+ end
84
+
85
+ @last_mouse_pos = Vector.new(window.mouse_x, window.mouse_y)
86
+ @mouse_pos = @last_mouse_pos.clone
87
+
59
88
  request_recalculate if @active_width != window.width || @active_height != window.height
60
89
 
61
90
  @active_width = window.width
62
91
  @active_height = window.height
63
92
  end
64
93
 
94
+ def tool_tip_delay
95
+ 500 # ms
96
+ end
97
+
65
98
  def button_down(id)
66
99
  super
67
100
 
@@ -72,6 +105,8 @@ module CyberarmEngine
72
105
  redirect_mouse_button(:middle)
73
106
  when Gosu::MsRight
74
107
  redirect_mouse_button(:right)
108
+ when Gosu::KbF5
109
+ request_recalculate
75
110
  end
76
111
  end
77
112
 
@@ -115,12 +150,26 @@ module CyberarmEngine
115
150
  @mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x, window.mouse_y) if @mouse_over == @mouse_down_on[button]
116
151
  end
117
152
 
153
+ if @dragging_element
154
+ @dragging_element.publish(:end_drag, window.mouse_x, window.mouse_y, button)
155
+ @dragging_element = nil
156
+ end
157
+
118
158
  @mouse_down_position[button] = nil
119
159
  @mouse_down_on[button] = nil
120
160
  end
121
161
 
122
162
  def redirect_holding_mouse_button(button)
123
- @mouse_over.publish(:"holding_#{button}_mouse_button", window.mouse_x, window.mouse_y) if @mouse_over
163
+ if !@dragging_element && @mouse_down_on[button] && @mouse_down_on[button].draggable?(button) && @mouse_pos.distance(@mouse_down_position[button]) > @min_drag_distance
164
+ @dragging_element = @mouse_down_on[button]
165
+ @dragging_element.publish(:"begin_drag", window.mouse_x, window.mouse_y, button)
166
+ end
167
+
168
+ if @dragging_element
169
+ @dragging_element.publish(:"drag_update", window.mouse_x, window.mouse_y, button) if @dragging_element
170
+ else
171
+ @mouse_over.publish(:"holding_#{button}_mouse_button", window.mouse_x, window.mouse_y) if @mouse_over
172
+ end
124
173
  end
125
174
 
126
175
  def redirect_mouse_wheel(button)
@@ -88,7 +88,7 @@ module CyberarmEngine
88
88
  caret_width: 2,
89
89
  caret_color: Gosu::Color::WHITE,
90
90
  caret_interval: 500,
91
- selection_color: Gosu::Color::GREEN,
91
+ selection_color: Gosu::Color.rgba(255, 128, 50, 200),
92
92
  },
93
93
 
94
94
  Image: { # < Element
@@ -114,6 +114,15 @@ module CyberarmEngine
114
114
  fraction_background: [0xffc75e61, 0xffe26623],
115
115
  border_thickness: 1,
116
116
  border_color: [0xffd59674, 0xffff8746]
117
+ },
118
+
119
+ Slider: { # < Element
120
+ width: 250,
121
+ height: 36,
122
+ background: 0xff111111,
123
+ fraction_background: [0xffc75e61, 0xffe26623],
124
+ border_thickness: 1,
125
+ border_color: [0xffd59674, 0xffff8746]
117
126
  }
118
127
  }.freeze
119
128
  end
@@ -1,4 +1,4 @@
1
1
  module CyberarmEngine
2
2
  NAME = "InDev"
3
- VERSION = "0.13.1"
3
+ VERSION = "0.14.0"
4
4
  end
@@ -1,5 +1,5 @@
1
1
  module CyberarmEngine
2
- class Engine < Gosu::Window
2
+ class Window < Gosu::Window
3
3
  IMAGES = {}
4
4
  SAMPLES= {}
5
5
  SONGS = {}
@@ -34,6 +34,8 @@ module CyberarmEngine
34
34
  end
35
35
 
36
36
  def update
37
+ Stats.clear
38
+
37
39
  current_state.update if current_state
38
40
  @last_frame_time = Gosu.milliseconds-@current_frame_time
39
41
  @current_frame_time = Gosu.milliseconds
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyberarm_engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.1
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Cyberarm
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-03-24 00:00:00.000000000 Z
11
+ date: 2020-05-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gosu
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.15.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: gosu_more_drawables
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.3'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.3'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +58,14 @@ dependencies:
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '10.0'
61
+ version: '13.0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '10.0'
68
+ version: '13.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: minitest
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -88,12 +102,11 @@ files:
88
102
  - lib/cyberarm_engine/bounding_box.rb
89
103
  - lib/cyberarm_engine/common.rb
90
104
  - lib/cyberarm_engine/config_file.rb
91
- - lib/cyberarm_engine/engine.rb
92
105
  - lib/cyberarm_engine/game_object.rb
93
106
  - lib/cyberarm_engine/game_state.rb
94
- - lib/cyberarm_engine/gosu_ext/circle.rb
95
107
  - lib/cyberarm_engine/ray.rb
96
108
  - lib/cyberarm_engine/shader.rb
109
+ - lib/cyberarm_engine/stats.rb
97
110
  - lib/cyberarm_engine/text.rb
98
111
  - lib/cyberarm_engine/timer.rb
99
112
  - lib/cyberarm_engine/transform.rb
@@ -103,11 +116,15 @@ files:
103
116
  - lib/cyberarm_engine/ui/elements/button.rb
104
117
  - lib/cyberarm_engine/ui/elements/check_box.rb
105
118
  - lib/cyberarm_engine/ui/elements/container.rb
119
+ - lib/cyberarm_engine/ui/elements/edit_box.rb
106
120
  - lib/cyberarm_engine/ui/elements/edit_line.rb
107
121
  - lib/cyberarm_engine/ui/elements/flow.rb
108
122
  - lib/cyberarm_engine/ui/elements/image.rb
109
123
  - lib/cyberarm_engine/ui/elements/label.rb
124
+ - lib/cyberarm_engine/ui/elements/list_box.rb
110
125
  - lib/cyberarm_engine/ui/elements/progress.rb
126
+ - lib/cyberarm_engine/ui/elements/radio.rb
127
+ - lib/cyberarm_engine/ui/elements/slider.rb
111
128
  - lib/cyberarm_engine/ui/elements/stack.rb
112
129
  - lib/cyberarm_engine/ui/elements/toggle_button.rb
113
130
  - lib/cyberarm_engine/ui/event.rb
@@ -116,6 +133,7 @@ files:
116
133
  - lib/cyberarm_engine/ui/theme.rb
117
134
  - lib/cyberarm_engine/vector.rb
118
135
  - lib/cyberarm_engine/version.rb
136
+ - lib/cyberarm_engine/window.rb
119
137
  homepage: https://github.com/cyberarm/cyberarm_engine
120
138
  licenses:
121
139
  - MIT
@@ -1,9 +0,0 @@
1
- module Gosu
2
- # Sourced from https://gist.github.com/ippa/662583
3
- def self.draw_circle(cx,cy,r, z = 9999,color = Gosu::Color::GREEN, step = 10)
4
- 0.step(360, step) do |a1|
5
- a2 = a1 + step
6
- draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r), cy + Gosu.offset_y(a2, r), color, z)
7
- end
8
- end
9
- end