cyberarm_engine 0.13.1 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
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