cyberarm_engine 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/Gemfile +1 -1
  4. data/Rakefile +1 -1
  5. data/assets/textures/default.png +0 -0
  6. data/cyberarm_engine.gemspec +10 -8
  7. data/lib/cyberarm_engine.rb +13 -2
  8. data/lib/cyberarm_engine/animator.rb +6 -4
  9. data/lib/cyberarm_engine/background.rb +19 -15
  10. data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
  11. data/lib/cyberarm_engine/bounding_box.rb +18 -18
  12. data/lib/cyberarm_engine/cache.rb +4 -0
  13. data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
  14. data/lib/cyberarm_engine/common.rb +13 -13
  15. data/lib/cyberarm_engine/config_file.rb +2 -2
  16. data/lib/cyberarm_engine/game_object.rb +63 -72
  17. data/lib/cyberarm_engine/game_state.rb +6 -3
  18. data/lib/cyberarm_engine/model.rb +207 -0
  19. data/lib/cyberarm_engine/model/material.rb +21 -0
  20. data/lib/cyberarm_engine/model/model_object.rb +131 -0
  21. data/lib/cyberarm_engine/model/parser.rb +74 -0
  22. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
  23. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
  24. data/lib/cyberarm_engine/model_cache.rb +31 -0
  25. data/lib/cyberarm_engine/opengl.rb +28 -0
  26. data/lib/cyberarm_engine/opengl/light.rb +50 -0
  27. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
  28. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
  29. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
  30. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
  31. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
  32. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
  33. data/lib/cyberarm_engine/{shader.rb → opengl/shader.rb} +51 -43
  34. data/lib/cyberarm_engine/opengl/texture.rb +69 -0
  35. data/lib/cyberarm_engine/ray.rb +5 -5
  36. data/lib/cyberarm_engine/stats.rb +2 -2
  37. data/lib/cyberarm_engine/text.rb +41 -27
  38. data/lib/cyberarm_engine/timer.rb +1 -1
  39. data/lib/cyberarm_engine/transform.rb +43 -20
  40. data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
  41. data/lib/cyberarm_engine/ui/dsl.rb +25 -11
  42. data/lib/cyberarm_engine/ui/element.rb +30 -20
  43. data/lib/cyberarm_engine/ui/elements/button.rb +86 -16
  44. data/lib/cyberarm_engine/ui/elements/check_box.rb +1 -1
  45. data/lib/cyberarm_engine/ui/elements/container.rb +44 -20
  46. data/lib/cyberarm_engine/ui/elements/edit_box.rb +175 -2
  47. data/lib/cyberarm_engine/ui/elements/edit_line.rb +121 -37
  48. data/lib/cyberarm_engine/ui/elements/flow.rb +1 -1
  49. data/lib/cyberarm_engine/ui/elements/image.rb +12 -9
  50. data/lib/cyberarm_engine/ui/elements/label.rb +93 -14
  51. data/lib/cyberarm_engine/ui/elements/list_box.rb +64 -2
  52. data/lib/cyberarm_engine/ui/elements/progress.rb +5 -5
  53. data/lib/cyberarm_engine/ui/elements/radio.rb +1 -1
  54. data/lib/cyberarm_engine/ui/elements/slider.rb +13 -16
  55. data/lib/cyberarm_engine/ui/elements/stack.rb +1 -1
  56. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +27 -19
  57. data/lib/cyberarm_engine/ui/event.rb +7 -7
  58. data/lib/cyberarm_engine/ui/gui_state.rb +44 -10
  59. data/lib/cyberarm_engine/ui/style.rb +10 -9
  60. data/lib/cyberarm_engine/ui/theme.rb +28 -20
  61. data/lib/cyberarm_engine/vector.rb +33 -30
  62. data/lib/cyberarm_engine/version.rb +2 -2
  63. data/lib/cyberarm_engine/window.rb +27 -18
  64. metadata +65 -15
@@ -17,10 +17,13 @@ module CyberarmEngine
17
17
  @active_width = window.width
18
18
  @active_height = window.height
19
19
 
20
+ @menu = nil
20
21
  @focus = nil
21
22
  @mouse_over = nil
22
23
  @mouse_down_on = {}
23
24
  @mouse_down_position = {}
25
+ @last_mouse_pos = nil
26
+ @dragging_element = nil
24
27
  @pending_recalculate_request = false
25
28
 
26
29
  @tip = CyberarmEngine::Text.new("", size: 22, z: Float::INFINITY)
@@ -32,7 +35,7 @@ module CyberarmEngine
32
35
  # throws :blur event to focused element and sets GuiState focused element
33
36
  # Does NOT throw :focus event at element or set element as focused
34
37
  def focus=(element)
35
- @focus.publish(:blur) if @focus and element && @focus != element
38
+ @focus.publish(:blur) if @focus && element && @focus != element
36
39
  @focus = element
37
40
  end
38
41
 
@@ -43,7 +46,13 @@ module CyberarmEngine
43
46
  def draw
44
47
  super
45
48
 
46
- if @tip.text.length > 0
49
+ if @menu
50
+ Gosu.flush
51
+ @menu.draw
52
+ end
53
+
54
+ if @tip.text.length.positive?
55
+ Gosu.flush
47
56
  Gosu.draw_rect(@tip.x - 2, @tip.y - 2, @tip.width + 4, @tip.height + 4, 0xff020202, Float::INFINITY)
48
57
  @tip.draw
49
58
  end
@@ -53,12 +62,17 @@ module CyberarmEngine
53
62
  if @pending_recalculate_request
54
63
  @root_container.recalculate
55
64
  @root_container.recalculate
65
+ @root_container.recalculate
66
+
56
67
  @pending_recalculate_request = false
57
68
  end
58
69
 
70
+ @menu&.update
59
71
  super
60
72
 
61
- new_mouse_over = @root_container.hit_element?(window.mouse_x, window.mouse_y)
73
+ new_mouse_over = @menu.hit_element?(window.mouse_x, window.mouse_y) if @menu
74
+ new_mouse_over ||= @root_container.hit_element?(window.mouse_x, window.mouse_y)
75
+
62
76
  if new_mouse_over
63
77
  new_mouse_over.publish(:enter) if new_mouse_over != @mouse_over
64
78
  new_mouse_over.publish(:hover)
@@ -74,7 +88,8 @@ module CyberarmEngine
74
88
  if Vector.new(window.mouse_x, window.mouse_y) == @last_mouse_pos
75
89
  if @mouse_over && (Gosu.milliseconds - @mouse_moved_at) > tool_tip_delay
76
90
  @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
91
+ @tip.x = window.mouse_x - @tip.width / 2
92
+ @tip.y = window.mouse_y - @tip.height - 4
78
93
  else
79
94
  @tip.text = ""
80
95
  end
@@ -108,6 +123,8 @@ module CyberarmEngine
108
123
  when Gosu::KbF5
109
124
  request_recalculate
110
125
  end
126
+
127
+ @focus.button_down(id) if @focus.respond_to?(:button_down)
111
128
  end
112
129
 
113
130
  def button_up(id)
@@ -125,9 +142,13 @@ module CyberarmEngine
125
142
  when Gosu::MsWheelDown
126
143
  redirect_mouse_wheel(:down)
127
144
  end
145
+
146
+ @focus.button_up(id) if @focus.respond_to?(:button_up)
128
147
  end
129
148
 
130
149
  def redirect_mouse_button(button)
150
+ hide_menu unless @menu && (@menu == @mouse_over) || (@mouse_over&.parent == @menu)
151
+
131
152
  if @focus && @mouse_over != @focus
132
153
  @focus.publish(:blur)
133
154
  @focus = nil
@@ -145,9 +166,14 @@ module CyberarmEngine
145
166
  end
146
167
 
147
168
  def redirect_released_mouse_button(button)
169
+ hide_menu if @menu && (@menu == @mouse_over) || (@mouse_over&.parent == @menu)
170
+
148
171
  if @mouse_over
149
172
  @mouse_over.publish(:"released_#{button}_mouse_button", window.mouse_x, window.mouse_y)
150
- @mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x, window.mouse_y) if @mouse_over == @mouse_down_on[button]
173
+ if @mouse_over == @mouse_down_on[button]
174
+ @mouse_over.publish(:"clicked_#{button}_mouse_button", window.mouse_x,
175
+ window.mouse_y)
176
+ end
151
177
  end
152
178
 
153
179
  if @dragging_element
@@ -162,13 +188,13 @@ module CyberarmEngine
162
188
  def redirect_holding_mouse_button(button)
163
189
  if !@dragging_element && @mouse_down_on[button] && @mouse_down_on[button].draggable?(button) && @mouse_pos.distance(@mouse_down_position[button]) > @min_drag_distance
164
190
  @dragging_element = @mouse_down_on[button]
165
- @dragging_element.publish(:"begin_drag", window.mouse_x, window.mouse_y, button)
191
+ @dragging_element.publish(:begin_drag, window.mouse_x, window.mouse_y, button)
166
192
  end
167
193
 
168
194
  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
195
+ @dragging_element.publish(:drag_update, window.mouse_x, window.mouse_y, button) if @dragging_element
196
+ elsif @mouse_over
197
+ @mouse_over.publish(:"holding_#{button}_mouse_button", window.mouse_x, window.mouse_y)
172
198
  end
173
199
  end
174
200
 
@@ -180,5 +206,13 @@ module CyberarmEngine
180
206
  def request_recalculate
181
207
  @pending_recalculate_request = true
182
208
  end
209
+
210
+ def show_menu(list_box)
211
+ @menu = list_box
212
+ end
213
+
214
+ def hide_menu
215
+ @menu = nil
216
+ end
183
217
  end
184
- end
218
+ end
@@ -1,11 +1,11 @@
1
1
  module Gosu
2
2
  class Color
3
- def _dump(level)
3
+ def _dump(_level)
4
4
  [
5
- "%02X" % self.alpha,
6
- "%02X" % self.red,
7
- "%02X" % self.green,
8
- "%02X" % self.blue
5
+ "%02X" % alpha,
6
+ "%02X" % red,
7
+ "%02X" % green,
8
+ "%02X" % blue
9
9
  ].join
10
10
  end
11
11
 
@@ -21,17 +21,18 @@ module CyberarmEngine
21
21
  @hash = Marshal.load(Marshal.dump(hash))
22
22
  end
23
23
 
24
- def method_missing(method, *args, &block)
24
+ def method_missing(method, *args)
25
25
  if method.to_s.end_with?("=")
26
26
  raise "Did not expect more than 1 argument" if args.size > 1
27
- return @hash[method.to_s.sub("=", "").to_sym] = args.first
27
+
28
+ @hash[method.to_s.sub("=", "").to_sym] = args.first
28
29
 
29
30
  elsif args.size == 0
30
- return @hash[method]
31
+ @hash[method]
31
32
 
32
33
  else
33
34
  raise ArgumentError, "Did not expect arguments"
34
35
  end
35
36
  end
36
37
  end
37
- end
38
+ end
@@ -11,17 +11,21 @@ module CyberarmEngine
11
11
 
12
12
  def theme_defaults(options)
13
13
  raise "Error" unless self.class.ancestors.include?(CyberarmEngine::Element)
14
+
14
15
  _theme = THEME
15
- _theme = _theme.merge(options[:theme]) if options[:theme]
16
+ _theme = deep_merge(_theme, options[:theme]) if options[:theme]
16
17
  _theme.delete(:theme) if options[:theme]
17
18
 
18
19
  hash = {}
19
20
  class_names = self.class.ancestors
20
- class_names = class_names[0..class_names.index(CyberarmEngine::Element)].map! {|c| c.to_s.split("::").last.to_sym}.reverse!
21
+ class_names = class_names[0..class_names.index(CyberarmEngine::Element)].map! do |c|
22
+ c.to_s.split("::").last.to_sym
23
+ end.reverse!
21
24
 
22
25
  class_names.each do |klass|
23
26
  next unless data = _theme.dig(klass)
24
- data.each do |key, value|
27
+
28
+ data.each do |_key, _value|
25
29
  hash.merge!(data)
26
30
  end
27
31
  end
@@ -32,7 +36,7 @@ module CyberarmEngine
32
36
  # Derived from Rails Hash#deep_merge!
33
37
  # Enables passing partial themes through Element options without issue
34
38
  def deep_merge(original, intergrate, &block)
35
- hash = original.merge(intergrate) do |key, this_val, other_val|
39
+ original.merge(intergrate) do |key, this_val, other_val|
36
40
  if this_val.is_a?(Hash) && other_val.is_a?(Hash)
37
41
  deep_merge(this_val, other_val, &block)
38
42
  elsif block_given?
@@ -41,8 +45,6 @@ module CyberarmEngine
41
45
  other_val
42
46
  end
43
47
  end
44
-
45
- return hash
46
48
  end
47
49
 
48
50
  THEME = {
@@ -51,28 +53,30 @@ module CyberarmEngine
51
53
  y: 0,
52
54
  z: 30,
53
55
 
54
- width: nil,
56
+ width: nil,
55
57
  height: nil,
56
- color: Gosu::Color::WHITE,
58
+ color: Gosu::Color::WHITE,
57
59
  background: Gosu::Color::NONE,
58
- margin: 0,
59
- padding: 0,
60
+ margin: 0,
61
+ padding: 0,
60
62
  border_thickness: 0,
61
63
  border_color: Gosu::Color::NONE,
62
- border_radius: 0,
64
+ border_radius: 0
63
65
  },
64
66
 
65
67
  Button: { # < Label
66
- margin: 1,
67
- padding: 4,
68
+ margin: 1,
69
+ padding: 4,
68
70
  border_thickness: 1,
69
71
  border_color: ["ffd59674".hex, "ffff8746".hex],
70
72
  border_radius: 0,
71
73
  background: ["ffc75e61".to_i(16), "ffe26623".to_i(16)],
74
+ text_align: :center,
75
+ text_wrap: :none,
72
76
 
73
77
  hover: {
74
- color: Gosu::Color.rgb(200,200,200),
75
- background: ["ffB23E41".to_i(16), "ffFF7C00".to_i(16)],
78
+ color: Gosu::Color.rgb(200, 200, 200),
79
+ background: ["ffB23E41".to_i(16), "ffFF7C00".to_i(16)]
76
80
  },
77
81
 
78
82
  active: {
@@ -89,18 +93,22 @@ module CyberarmEngine
89
93
  caret_color: Gosu::Color::WHITE,
90
94
  caret_interval: 500,
91
95
  selection_color: Gosu::Color.rgba(255, 128, 50, 200),
96
+ text_align: :left
92
97
  },
93
98
 
94
99
  Image: { # < Element
100
+ color: Gosu::Color::WHITE,
95
101
  retro: false
96
102
  },
97
103
 
98
104
  Label: { # < Element
99
- text_size: 28,
100
- text_shadow: false,
101
- font: "Arial",
102
- margin: 0,
103
- padding: 2
105
+ text_size: 28,
106
+ text_wrap: :none, # :word_wrap, :break_word, :none
107
+ text_shadow: false,
108
+ text_align: :left,
109
+ font: "Arial",
110
+ margin: 0,
111
+ padding: 2
104
112
  },
105
113
 
106
114
  ToggleButton: { # < Button
@@ -60,22 +60,15 @@ module CyberarmEngine
60
60
  Vector.new(0, 0, -1)
61
61
  end
62
62
 
63
+ attr_accessor :x, :y, :z, :weight
64
+
63
65
  def initialize(x = 0, y = 0, z = 0, weight = 0)
64
- @x, @y, @z, @weight = x, y, z, weight
66
+ @x = x
67
+ @y = y
68
+ @z = z
69
+ @weight = weight
65
70
  end
66
71
 
67
- def x; @x; end
68
- def x=(n); @x = n; end
69
-
70
- def y; @y; end
71
- def y=(n); @y = n; end
72
-
73
- def z; @z; end
74
- def z=(n); @z = n; end
75
-
76
- def weight; @weight; end
77
- def weight=(n); @weight = n; end
78
-
79
72
  alias w weight
80
73
  alias w= weight=
81
74
 
@@ -83,14 +76,14 @@ module CyberarmEngine
83
76
  def ==(other)
84
77
  if other.is_a?(Numeric)
85
78
  @x == other &&
86
- @y == other &&
87
- @z == other &&
88
- @weight == other
79
+ @y == other &&
80
+ @z == other &&
81
+ @weight == other
89
82
  elsif other.is_a?(Vector)
90
83
  @x == other.x &&
91
- @y == other.y &&
92
- @z == other.z &&
93
- @weight == other.weight
84
+ @y == other.y &&
85
+ @z == other.z &&
86
+ @weight == other.weight
94
87
  else
95
88
  other == self
96
89
  end
@@ -137,6 +130,17 @@ module CyberarmEngine
137
130
  operator("*", other)
138
131
  end
139
132
 
133
+ def multiply_transform(transform)
134
+ e = transform.elements
135
+
136
+ x = @x * e[0] + @y * e[1] + @z * e[2] + 1 * e[3]
137
+ y = @x * e[4] + @y * e[5] + @z * e[6] + 1 * e[7]
138
+ z = @x * e[8] + @y * e[9] + @z * e[10] + 1 * e[11]
139
+ w = @x * e[12] + @y * e[13] + @z * e[14] + 1 * e[15]
140
+
141
+ Vector.new(x / 1, y / 1, z / 1, w / 1)
142
+ end
143
+
140
144
  # Divides Vector and Numeric or Vector and Vector, excluding {weight}
141
145
  # @return [CyberarmEngine::Vector]
142
146
  def /(other)
@@ -161,20 +165,20 @@ module CyberarmEngine
161
165
  def dot(other)
162
166
  product = 0
163
167
 
164
- a = self.to_a
168
+ a = to_a
165
169
  b = other.to_a
166
170
 
167
171
  3.times do |i|
168
- product = product + (a[i] * b[i])
172
+ product += (a[i] * b[i])
169
173
  end
170
174
 
171
- return product
175
+ product
172
176
  end
173
177
 
174
178
  # cross product of {Vector}
175
179
  # @return [CyberarmEngine::Vector]
176
180
  def cross(other)
177
- a = self.to_a
181
+ a = to_a
178
182
  b = other.to_a
179
183
 
180
184
  Vector.new(
@@ -187,7 +191,7 @@ module CyberarmEngine
187
191
  # returns degrees
188
192
  # @return [Float]
189
193
  def angle(other)
190
- Math.acos( self.normalized.dot(other.normalized) ) * 180 / Math::PI
194
+ Math.acos(normalized.dot(other.normalized)) * 180 / Math::PI
191
195
  end
192
196
 
193
197
  # returns magnitude of Vector, ignoring #weight
@@ -209,7 +213,6 @@ module CyberarmEngine
209
213
  self / Vector.new(mag, mag, mag)
210
214
  end
211
215
 
212
-
213
216
  # returns a direction {Vector}
214
217
  #
215
218
  # z is pitch
@@ -254,19 +257,19 @@ module CyberarmEngine
254
257
  # 2D distance using X and Y
255
258
  # @return [Float]
256
259
  def distance(other)
257
- Math.sqrt((@x-other.x)**2 + (@y-other.y)**2)
260
+ Math.sqrt((@x - other.x)**2 + (@y - other.y)**2)
258
261
  end
259
262
 
260
263
  # 2D distance using X and Z
261
264
  # @return [Float]
262
265
  def gl_distance2d(other)
263
- Math.sqrt((@x-other.x)**2 + (@z-other.z)**2)
266
+ Math.sqrt((@x - other.x)**2 + (@z - other.z)**2)
264
267
  end
265
268
 
266
269
  # 3D distance using X, Y, and Z
267
270
  # @return [Float]
268
271
  def distance3d(other)
269
- Math.sqrt((@x-other.x)**2 + (@y-other.y)**2 + (@z-other.z)**2)
272
+ Math.sqrt((@x - other.x)**2 + (@y - other.y)**2 + (@z - other.z)**2)
270
273
  end
271
274
 
272
275
  # Converts {Vector} to Array
@@ -284,7 +287,7 @@ module CyberarmEngine
284
287
  # Converts {Vector} to Hash
285
288
  # @return [Hash]
286
289
  def to_h
287
- {x: @x, y: @y, z: @z, weight: @weight}
290
+ { x: @x, y: @y, z: @z, weight: @weight }
288
291
  end
289
292
  end
290
- end
293
+ end
@@ -1,4 +1,4 @@
1
1
  module CyberarmEngine
2
- NAME = "InDev"
3
- VERSION = "0.14.0"
2
+ NAME = "InDev".freeze
3
+ VERSION = "0.15.0".freeze
4
4
  end
@@ -1,10 +1,11 @@
1
1
  module CyberarmEngine
2
2
  class Window < Gosu::Window
3
3
  IMAGES = {}
4
- SAMPLES= {}
5
- SONGS = {}
4
+ SAMPLES = {}
5
+ SONGS = {}
6
6
 
7
7
  attr_accessor :show_cursor
8
+ attr_writer :exit_on_opengl_error
8
9
  attr_reader :last_frame_time
9
10
 
10
11
  def self.now
@@ -12,19 +13,20 @@ module CyberarmEngine
12
13
  end
13
14
 
14
15
  def self.dt
15
- $window.last_frame_time/1000.0
16
+ $window.last_frame_time / 1000.0
16
17
  end
17
18
 
18
- def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0/60, resizable: false)
19
+ def initialize(width: 800, height: 600, fullscreen: false, update_interval: 1000.0 / 60, resizable: false, borderless: false)
19
20
  @show_cursor = false
20
21
 
21
- super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable)
22
+ super(width, height, fullscreen: fullscreen, update_interval: update_interval, resizable: resizable, borderless: borderless)
22
23
  $window = self
23
- @last_frame_time = Gosu.milliseconds-1
24
+ @last_frame_time = Gosu.milliseconds - 1
24
25
  @current_frame_time = Gosu.milliseconds
25
26
  self.caption = "CyberarmEngine #{CyberarmEngine::VERSION} #{Gosu.language}"
26
27
 
27
28
  @states = []
29
+ @exit_on_opengl_error = false
28
30
 
29
31
  setup if defined?(setup)
30
32
  end
@@ -37,7 +39,7 @@ module CyberarmEngine
37
39
  Stats.clear
38
40
 
39
41
  current_state.update if current_state
40
- @last_frame_time = Gosu.milliseconds-@current_frame_time
42
+ @last_frame_time = Gosu.milliseconds - @current_frame_time
41
43
  @current_frame_time = Gosu.milliseconds
42
44
  end
43
45
 
@@ -46,7 +48,15 @@ module CyberarmEngine
46
48
  end
47
49
 
48
50
  def dt
49
- @last_frame_time/1000.0
51
+ @last_frame_time / 1000.0
52
+ end
53
+
54
+ def aspect_ratio
55
+ width / height.to_f
56
+ end
57
+
58
+ def exit_on_opengl_error?
59
+ @exit_on_opengl_error
50
60
  end
51
61
 
52
62
  def button_down(id)
@@ -59,8 +69,8 @@ module CyberarmEngine
59
69
  current_state.button_up(id) if current_state
60
70
  end
61
71
 
62
- def push_state(klass, options={})
63
- options = {setup: true}.merge(options)
72
+ def push_state(klass, options = {})
73
+ options = { setup: true }.merge(options)
64
74
 
65
75
  if klass.instance_of?(klass.class) && defined?(klass.options)
66
76
  @states << klass
@@ -68,12 +78,12 @@ module CyberarmEngine
68
78
  else
69
79
  @states << klass.new(options) if child_of?(klass, GameState)
70
80
  @states << klass.new if child_of?(klass, Element::Container)
71
- current_state.setup if current_state.class == klass && options[:setup]
81
+ current_state.setup if current_state.instance_of?(klass) && options[:setup]
72
82
  end
73
83
  end
74
84
 
75
85
  private def child_of?(input, klass)
76
- input.ancestors.detect {|c| c == klass}
86
+ input.ancestors.detect { |c| c == klass }
77
87
  end
78
88
 
79
89
  def current_state
@@ -81,10 +91,8 @@ module CyberarmEngine
81
91
  end
82
92
 
83
93
  def previous_state
84
- if @states.size > 1 && state = @states[@states.size-2]
85
- return state
86
- else
87
- return nil
94
+ if @states.size > 1 && state = @states[@states.size - 2]
95
+ state
88
96
  end
89
97
  end
90
98
 
@@ -93,10 +101,11 @@ module CyberarmEngine
93
101
  end
94
102
 
95
103
  # Sourced from https://gist.github.com/ippa/662583
96
- def draw_circle(cx,cy,r, z = 9999,color = Gosu::Color::GREEN, step = 10)
104
+ def draw_circle(cx, cy, r, z = 9999, color = Gosu::Color::GREEN, step = 10)
97
105
  0.step(360, step) do |a1|
98
106
  a2 = a1 + step
99
- 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)
107
+ draw_line(cx + Gosu.offset_x(a1, r), cy + Gosu.offset_y(a1, r), color, cx + Gosu.offset_x(a2, r),
108
+ cy + Gosu.offset_y(a2, r), color, z)
100
109
  end
101
110
  end
102
111
  end