cyberarm_engine 0.19.0 → 0.19.1

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.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -8
  3. data/.rubocop.yml +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/LICENSE.txt +21 -21
  7. data/README.md +74 -74
  8. data/Rakefile +10 -10
  9. data/bin/console +14 -14
  10. data/bin/setup +8 -8
  11. data/cyberarm_engine.gemspec +39 -39
  12. data/lib/cyberarm_engine/animator.rb +219 -219
  13. data/lib/cyberarm_engine/background.rb +179 -179
  14. data/lib/cyberarm_engine/background_nine_slice.rb +142 -142
  15. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  16. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  17. data/lib/cyberarm_engine/cache/download_manager.rb +121 -121
  18. data/lib/cyberarm_engine/cache.rb +4 -4
  19. data/lib/cyberarm_engine/common.rb +113 -113
  20. data/lib/cyberarm_engine/config_file.rb +46 -46
  21. data/lib/cyberarm_engine/console/command.rb +157 -157
  22. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  23. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  24. data/lib/cyberarm_engine/console.rb +248 -248
  25. data/lib/cyberarm_engine/game_object.rb +248 -248
  26. data/lib/cyberarm_engine/game_state.rb +97 -97
  27. data/lib/cyberarm_engine/model/material.rb +21 -21
  28. data/lib/cyberarm_engine/model/model_object.rb +131 -131
  29. data/lib/cyberarm_engine/model/parser.rb +74 -74
  30. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  31. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  32. data/lib/cyberarm_engine/model.rb +212 -212
  33. data/lib/cyberarm_engine/model_cache.rb +31 -31
  34. data/lib/cyberarm_engine/opengl/light.rb +50 -50
  35. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  36. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -38
  37. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  38. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -164
  39. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +298 -298
  40. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -22
  41. data/lib/cyberarm_engine/opengl/shader.rb +406 -406
  42. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  43. data/lib/cyberarm_engine/opengl.rb +28 -28
  44. data/lib/cyberarm_engine/ray.rb +56 -56
  45. data/lib/cyberarm_engine/stats.rb +21 -21
  46. data/lib/cyberarm_engine/text.rb +197 -197
  47. data/lib/cyberarm_engine/timer.rb +23 -23
  48. data/lib/cyberarm_engine/transform.rb +296 -296
  49. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  50. data/lib/cyberarm_engine/ui/dsl.rb +139 -139
  51. data/lib/cyberarm_engine/ui/element.rb +488 -488
  52. data/lib/cyberarm_engine/ui/elements/button.rb +97 -97
  53. data/lib/cyberarm_engine/ui/elements/check_box.rb +54 -54
  54. data/lib/cyberarm_engine/ui/elements/container.rb +256 -256
  55. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -179
  56. data/lib/cyberarm_engine/ui/elements/edit_line.rb +263 -263
  57. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  58. data/lib/cyberarm_engine/ui/elements/image.rb +72 -72
  59. data/lib/cyberarm_engine/ui/elements/list_box.rb +88 -82
  60. data/lib/cyberarm_engine/ui/elements/progress.rb +51 -51
  61. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  62. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -104
  63. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  64. data/lib/cyberarm_engine/ui/elements/text_block.rb +162 -162
  65. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +65 -65
  66. data/lib/cyberarm_engine/ui/event.rb +54 -54
  67. data/lib/cyberarm_engine/ui/gui_state.rb +256 -256
  68. data/lib/cyberarm_engine/ui/style.rb +49 -49
  69. data/lib/cyberarm_engine/ui/theme.rb +207 -207
  70. data/lib/cyberarm_engine/vector.rb +293 -293
  71. data/lib/cyberarm_engine/version.rb +4 -4
  72. data/lib/cyberarm_engine/window.rb +120 -120
  73. data/lib/cyberarm_engine.rb +71 -71
  74. metadata +3 -3
@@ -1,248 +1,248 @@
1
- module CyberarmEngine
2
- class GameObject
3
- include Common
4
-
5
- attr_accessor :image, :angle, :position, :velocity, :center_x, :center_y, :scale_x, :scale_y,
6
- :color, :mode, :options, :paused, :radius, :last_position
7
- attr_reader :alpha
8
-
9
- def initialize(options = {})
10
- $window.current_state.add_game_object(self) if options[:auto_manage] || options[:auto_manage].nil?
11
-
12
- @options = options
13
- @image = options[:image] ? image(options[:image]) : nil
14
- x = options[:x] || 0
15
- y = options[:y] || 0
16
- z = options[:z] || 0
17
- @position = Vector.new(x, y, z)
18
- @velocity = Vector.new
19
- @last_position = Vector.new
20
- @angle = options[:angle] || 0
21
-
22
- @center_x = options[:center_x] || 0.5
23
- @center_y = options[:center_y] || 0.5
24
-
25
- @scale_x = options[:scale_x] || 1
26
- @scale_y = options[:scale_y] || 1
27
-
28
- @color = options[:color] || Gosu::Color.argb(0xff_ffffff)
29
- @alpha = options[:alpha] || 255
30
- @mode = options[:mode] || :default
31
-
32
- @paused = false
33
- @speed = 0
34
- @debug_color = Gosu::Color::GREEN
35
- @world_center_point = Vector.new(0, 0)
36
-
37
- setup
38
-
39
- @debug_text = Text.new("", color: @debug_color, y: @position.y - (height * scale), z: 9999)
40
- @debug_text.x = @position.x
41
- if @radius == 0 || @radius.nil?
42
- @radius = if options[:radius]
43
- options[:radius]
44
- else
45
- defined?(@image.width) ? ((@image.width + @image.height) / 4) * scale : 1
46
- end
47
- end
48
- end
49
-
50
- def draw
51
- if @image
52
- @image.draw_rot(@position.x, @position.y, @position.z, @angle, @center_x, @center_y, @scale_x, @scale_y,
53
- @color, @mode)
54
- end
55
-
56
- if $debug
57
- show_debug_heading
58
- $window.draw_circle(@position.x, @position.y, radius, 9999, @debug_color)
59
- if @debug_text.text != ""
60
- $window.draw_rect(@debug_text.x - 10, (@debug_text.y - 10), @debug_text.width + 20, @debug_text.height + 20,
61
- Gosu::Color.rgba(0, 0, 0, 200), 9999)
62
- @debug_text.draw
63
- end
64
- end
65
- end
66
-
67
- def update
68
- end
69
-
70
- def debug_text(text)
71
- @debug_text.text = text
72
- @debug_text.x = @position.x - (@debug_text.width / 2)
73
- @debug_text.y = @position.y - (@debug_text.height + radius + height)
74
- end
75
-
76
- def scale
77
- if @scale_x == @scale_y
78
- @scale_x
79
- else
80
- false
81
- # maths?
82
- end
83
- end
84
-
85
- def scale=(int)
86
- self.scale_x = int
87
- self.scale_y = int
88
- self.radius = ((@image.width + @image.height) / 4) * scale
89
- end
90
-
91
- def visible
92
- true
93
- # if _x_visible
94
- # if _y_visible
95
- # true
96
- # else
97
- # false
98
- # end
99
- # else
100
- # false
101
- # end
102
- end
103
-
104
- def _x_visible
105
- x.between?(($window.width / 2) - @world_center_point.x, ($window.width / 2) + @world_center_point.x) ||
106
- x.between?((@world_center_point.x - $window.width / 2), ($window.width / 2) + @world_center_point.x)
107
- end
108
-
109
- def _y_visible
110
- y.between?(($window.height / 2) - @world_center_point.y, ($window.height / 2) + @world_center_point.y) ||
111
- y.between?(@world_center_point.y - ($window.height / 2), ($window.height / 2) + @world_center_point.y)
112
- end
113
-
114
- def heading(ahead_by = 100, _object = nil, angle_only = false)
115
- direction = Gosu.angle(@last_position.x, @last_position.x, @position.x, position.y).gosu_to_radians
116
-
117
- _x = @position.x + (ahead_by * Math.cos(direction))
118
- _y = @position.y + (ahead_by * Math.sin(direction))
119
-
120
- return direction if angle_only
121
- return Vector.new(_x, _y) unless angle_only
122
- end
123
-
124
- def show_debug_heading
125
- _heading = heading
126
- Gosu.draw_line(@position.x, @position.y, @debug_color, _heading.x, _heading.y, @debug_color, 9999)
127
- end
128
-
129
- def width
130
- @image ? @image.width * scale : 0
131
- end
132
-
133
- def height
134
- @image ? @image.height * scale : 0
135
- end
136
-
137
- def pause
138
- @paused = true
139
- end
140
-
141
- def unpause
142
- @paused = false
143
- end
144
-
145
- def rotate(int)
146
- self.angle += int
147
- self.angle %= 360
148
- end
149
-
150
- def alpha=(int) # 0-255
151
- @alpha = int
152
- @alpha = 255 if @alpha > 255
153
- @color = Gosu::Color.rgba(@color.red, @color.green, @color.blue, int)
154
- end
155
-
156
- def draw_rect(x, y, width, height, color, z = 0)
157
- $window.draw_rect(x, y, width, height, color, z)
158
- end
159
-
160
- def button_up(id)
161
- end
162
-
163
- def button_down(id)
164
- end
165
-
166
- def find_closest(game_object_class)
167
- best_object = nil
168
- best_distance = 100_000_000_000 # Huge default number
169
-
170
- game_object_class.all.each do |object|
171
- distance = Gosu.distance(x, y, object.x, object.y)
172
- if distance <= best_distance
173
- best_object = object
174
- best_distance = distance
175
- end
176
- end
177
-
178
- best_object
179
- end
180
-
181
- def look_at(object)
182
- # TODO: Implement
183
- end
184
-
185
- def circle_collision?(object)
186
- distance = Gosu.distance(x, y, object.x, object.y)
187
- distance <= radius + object.radius
188
- end
189
-
190
- # Duplication... so DRY.
191
- def each_circle_collision(object, _resolve_with = :width, &block)
192
- if object.class != Class && object.instance_of?(object.class)
193
- $window.current_state.game_objects.select { |i| i.instance_of?(object.class) }.each do |o|
194
- distance = Gosu.distance(x, y, object.x, object.y)
195
- block.call(o, object) if distance <= radius + object.radius && block
196
- end
197
- else
198
- list = $window.current_state.game_objects.select { |i| i.instance_of?(object) }
199
- list.each do |o|
200
- next if self == o
201
-
202
- distance = Gosu.distance(x, y, o.x, o.y)
203
- block.call(self, o) if distance <= radius + o.radius && block
204
- end
205
- end
206
- end
207
-
208
- def destroy
209
- if $window.current_state
210
- $window.current_state.game_objects.each do |o|
211
- $window.current_state.game_objects.delete(o) if o.is_a?(self.class) && o == self
212
- end
213
- end
214
- end
215
-
216
- # NOTE: This could be implemented more reliably
217
- def all
218
- INSTANCES.select { |i| i.instance_of?(self) }
219
- end
220
-
221
- def self.each_circle_collision(object, _resolve_with = :width, &block)
222
- if object.class != Class && object.instance_of?(object.class)
223
- $window.current_state.game_objects.select { |i| i.instance_of?(self) }.each do |o|
224
- distance = Gosu.distance(o.x, o.y, object.x, object.y)
225
- block.call(o, object) if distance <= o.radius + object.radius && block
226
- end
227
- else
228
- lista = $window.current_state.game_objects.select { |i| i.instance_of?(self) }
229
- listb = $window.current_state.game_objects.select { |i| i.instance_of?(object) }
230
- lista.product(listb).each do |o, o2|
231
- next if o == o2
232
-
233
- distance = Gosu.distance(o.x, o.y, o2.x, o2.y)
234
- block.call(o, o2) if distance <= o.radius + o2.radius && block
235
- end
236
- end
237
- end
238
-
239
- def self.destroy_all
240
- INSTANCES.clear
241
- if $window.current_state
242
- $window.current_state.game_objects.each do |o|
243
- $window.current_state.game_objects.delete(o) if o.is_a?(self.class)
244
- end
245
- end
246
- end
247
- end
248
- end
1
+ module CyberarmEngine
2
+ class GameObject
3
+ include Common
4
+
5
+ attr_accessor :image, :angle, :position, :velocity, :center_x, :center_y, :scale_x, :scale_y,
6
+ :color, :mode, :options, :paused, :radius, :last_position
7
+ attr_reader :alpha
8
+
9
+ def initialize(options = {})
10
+ $window.current_state.add_game_object(self) if options[:auto_manage] || options[:auto_manage].nil?
11
+
12
+ @options = options
13
+ @image = options[:image] ? image(options[:image]) : nil
14
+ x = options[:x] || 0
15
+ y = options[:y] || 0
16
+ z = options[:z] || 0
17
+ @position = Vector.new(x, y, z)
18
+ @velocity = Vector.new
19
+ @last_position = Vector.new
20
+ @angle = options[:angle] || 0
21
+
22
+ @center_x = options[:center_x] || 0.5
23
+ @center_y = options[:center_y] || 0.5
24
+
25
+ @scale_x = options[:scale_x] || 1
26
+ @scale_y = options[:scale_y] || 1
27
+
28
+ @color = options[:color] || Gosu::Color.argb(0xff_ffffff)
29
+ @alpha = options[:alpha] || 255
30
+ @mode = options[:mode] || :default
31
+
32
+ @paused = false
33
+ @speed = 0
34
+ @debug_color = Gosu::Color::GREEN
35
+ @world_center_point = Vector.new(0, 0)
36
+
37
+ setup
38
+
39
+ @debug_text = Text.new("", color: @debug_color, y: @position.y - (height * scale), z: 9999)
40
+ @debug_text.x = @position.x
41
+ if @radius == 0 || @radius.nil?
42
+ @radius = if options[:radius]
43
+ options[:radius]
44
+ else
45
+ defined?(@image.width) ? ((@image.width + @image.height) / 4) * scale : 1
46
+ end
47
+ end
48
+ end
49
+
50
+ def draw
51
+ if @image
52
+ @image.draw_rot(@position.x, @position.y, @position.z, @angle, @center_x, @center_y, @scale_x, @scale_y,
53
+ @color, @mode)
54
+ end
55
+
56
+ if $debug
57
+ show_debug_heading
58
+ $window.draw_circle(@position.x, @position.y, radius, 9999, @debug_color)
59
+ if @debug_text.text != ""
60
+ $window.draw_rect(@debug_text.x - 10, (@debug_text.y - 10), @debug_text.width + 20, @debug_text.height + 20,
61
+ Gosu::Color.rgba(0, 0, 0, 200), 9999)
62
+ @debug_text.draw
63
+ end
64
+ end
65
+ end
66
+
67
+ def update
68
+ end
69
+
70
+ def debug_text(text)
71
+ @debug_text.text = text
72
+ @debug_text.x = @position.x - (@debug_text.width / 2)
73
+ @debug_text.y = @position.y - (@debug_text.height + radius + height)
74
+ end
75
+
76
+ def scale
77
+ if @scale_x == @scale_y
78
+ @scale_x
79
+ else
80
+ false
81
+ # maths?
82
+ end
83
+ end
84
+
85
+ def scale=(int)
86
+ self.scale_x = int
87
+ self.scale_y = int
88
+ self.radius = ((@image.width + @image.height) / 4) * scale
89
+ end
90
+
91
+ def visible
92
+ true
93
+ # if _x_visible
94
+ # if _y_visible
95
+ # true
96
+ # else
97
+ # false
98
+ # end
99
+ # else
100
+ # false
101
+ # end
102
+ end
103
+
104
+ def _x_visible
105
+ x.between?(($window.width / 2) - @world_center_point.x, ($window.width / 2) + @world_center_point.x) ||
106
+ x.between?((@world_center_point.x - $window.width / 2), ($window.width / 2) + @world_center_point.x)
107
+ end
108
+
109
+ def _y_visible
110
+ y.between?(($window.height / 2) - @world_center_point.y, ($window.height / 2) + @world_center_point.y) ||
111
+ y.between?(@world_center_point.y - ($window.height / 2), ($window.height / 2) + @world_center_point.y)
112
+ end
113
+
114
+ def heading(ahead_by = 100, _object = nil, angle_only = false)
115
+ direction = Gosu.angle(@last_position.x, @last_position.x, @position.x, position.y).gosu_to_radians
116
+
117
+ _x = @position.x + (ahead_by * Math.cos(direction))
118
+ _y = @position.y + (ahead_by * Math.sin(direction))
119
+
120
+ return direction if angle_only
121
+ return Vector.new(_x, _y) unless angle_only
122
+ end
123
+
124
+ def show_debug_heading
125
+ _heading = heading
126
+ Gosu.draw_line(@position.x, @position.y, @debug_color, _heading.x, _heading.y, @debug_color, 9999)
127
+ end
128
+
129
+ def width
130
+ @image ? @image.width * scale : 0
131
+ end
132
+
133
+ def height
134
+ @image ? @image.height * scale : 0
135
+ end
136
+
137
+ def pause
138
+ @paused = true
139
+ end
140
+
141
+ def unpause
142
+ @paused = false
143
+ end
144
+
145
+ def rotate(int)
146
+ self.angle += int
147
+ self.angle %= 360
148
+ end
149
+
150
+ def alpha=(int) # 0-255
151
+ @alpha = int
152
+ @alpha = 255 if @alpha > 255
153
+ @color = Gosu::Color.rgba(@color.red, @color.green, @color.blue, int)
154
+ end
155
+
156
+ def draw_rect(x, y, width, height, color, z = 0)
157
+ $window.draw_rect(x, y, width, height, color, z)
158
+ end
159
+
160
+ def button_up(id)
161
+ end
162
+
163
+ def button_down(id)
164
+ end
165
+
166
+ def find_closest(game_object_class)
167
+ best_object = nil
168
+ best_distance = 100_000_000_000 # Huge default number
169
+
170
+ game_object_class.all.each do |object|
171
+ distance = Gosu.distance(x, y, object.x, object.y)
172
+ if distance <= best_distance
173
+ best_object = object
174
+ best_distance = distance
175
+ end
176
+ end
177
+
178
+ best_object
179
+ end
180
+
181
+ def look_at(object)
182
+ # TODO: Implement
183
+ end
184
+
185
+ def circle_collision?(object)
186
+ distance = Gosu.distance(x, y, object.x, object.y)
187
+ distance <= radius + object.radius
188
+ end
189
+
190
+ # Duplication... so DRY.
191
+ def each_circle_collision(object, _resolve_with = :width, &block)
192
+ if object.class != Class && object.instance_of?(object.class)
193
+ $window.current_state.game_objects.select { |i| i.instance_of?(object.class) }.each do |o|
194
+ distance = Gosu.distance(x, y, object.x, object.y)
195
+ block.call(o, object) if distance <= radius + object.radius && block
196
+ end
197
+ else
198
+ list = $window.current_state.game_objects.select { |i| i.instance_of?(object) }
199
+ list.each do |o|
200
+ next if self == o
201
+
202
+ distance = Gosu.distance(x, y, o.x, o.y)
203
+ block.call(self, o) if distance <= radius + o.radius && block
204
+ end
205
+ end
206
+ end
207
+
208
+ def destroy
209
+ if $window.current_state
210
+ $window.current_state.game_objects.each do |o|
211
+ $window.current_state.game_objects.delete(o) if o.is_a?(self.class) && o == self
212
+ end
213
+ end
214
+ end
215
+
216
+ # NOTE: This could be implemented more reliably
217
+ def all
218
+ INSTANCES.select { |i| i.instance_of?(self) }
219
+ end
220
+
221
+ def self.each_circle_collision(object, _resolve_with = :width, &block)
222
+ if object.class != Class && object.instance_of?(object.class)
223
+ $window.current_state.game_objects.select { |i| i.instance_of?(self) }.each do |o|
224
+ distance = Gosu.distance(o.x, o.y, object.x, object.y)
225
+ block.call(o, object) if distance <= o.radius + object.radius && block
226
+ end
227
+ else
228
+ lista = $window.current_state.game_objects.select { |i| i.instance_of?(self) }
229
+ listb = $window.current_state.game_objects.select { |i| i.instance_of?(object) }
230
+ lista.product(listb).each do |o, o2|
231
+ next if o == o2
232
+
233
+ distance = Gosu.distance(o.x, o.y, o2.x, o2.y)
234
+ block.call(o, o2) if distance <= o.radius + o2.radius && block
235
+ end
236
+ end
237
+ end
238
+
239
+ def self.destroy_all
240
+ INSTANCES.clear
241
+ if $window.current_state
242
+ $window.current_state.game_objects.each do |o|
243
+ $window.current_state.game_objects.delete(o) if o.is_a?(self.class)
244
+ end
245
+ end
246
+ end
247
+ end
248
+ end
@@ -1,97 +1,97 @@
1
- module CyberarmEngine
2
- class GameState
3
- include Common
4
-
5
- attr_accessor :options, :global_pause
6
- attr_reader :game_objects
7
-
8
- def initialize(options = {})
9
- @options = options
10
- @game_objects = []
11
- @global_pause = false
12
- $window.text_input = nil unless options[:preserve_text_input]
13
-
14
- @down_keys = {}
15
- end
16
-
17
- def setup
18
- end
19
-
20
- # Called immediately after setup returns.
21
- # GuiState uses this to set current_theme for ToolTip
22
- def post_setup
23
- end
24
-
25
- def draw
26
- @game_objects.each(&:draw)
27
- end
28
-
29
- def update
30
- @game_objects.each(&:update)
31
- end
32
-
33
- def draw_bounding_box(box)
34
- x = box.x
35
- y = box.y
36
- max_x = box.max_x
37
- max_y = box.max_y
38
-
39
- color = Gosu::Color.rgba(255, 127, 64, 240)
40
-
41
- # pipe = 4
42
- # Gosu.draw_rect(x-width, y-height, x+(width*2), y+(height*2), color, Float::INFINITY)
43
- # puts "BB render: #{x}:#{y} w:#{x.abs+width} h:#{y.abs+height}"
44
- # Gosu.draw_rect(x, y, x.abs+width, y.abs+height, color, Float::INFINITY)
45
-
46
- # TOP LEFT to BOTTOM LEFT
47
- $window.draw_line(
48
- x, y, color,
49
- x, max_y, color,
50
- Float::INFINITY
51
- )
52
- # BOTTOM LEFT to BOTTOM RIGHT
53
- $window.draw_line(
54
- x, max_y, color,
55
- max_x, max_y, color,
56
- Float::INFINITY
57
- )
58
- # BOTTOM RIGHT to TOP RIGHT
59
- $window.draw_line(
60
- max_x, max_y, color,
61
- max_x, y, color,
62
- Float::INFINITY
63
- )
64
- # TOP RIGHT to TOP LEFT
65
- $window.draw_line(
66
- max_x, y, color,
67
- x, y, color,
68
- Float::INFINITY
69
- )
70
- end
71
-
72
- def destroy
73
- @options.clear
74
- @game_objects.clear
75
- end
76
-
77
- def button_down(id)
78
- @down_keys[id] = true
79
-
80
- @game_objects.each do |o|
81
- o.button_down(id)
82
- end
83
- end
84
-
85
- def button_up(id)
86
- @down_keys.delete(id)
87
-
88
- @game_objects.each do |o|
89
- o.button_up(id)
90
- end
91
- end
92
-
93
- def add_game_object(object)
94
- @game_objects << object
95
- end
96
- end
97
- end
1
+ module CyberarmEngine
2
+ class GameState
3
+ include Common
4
+
5
+ attr_accessor :options, :global_pause
6
+ attr_reader :game_objects
7
+
8
+ def initialize(options = {})
9
+ @options = options
10
+ @game_objects = []
11
+ @global_pause = false
12
+ $window.text_input = nil unless options[:preserve_text_input]
13
+
14
+ @down_keys = {}
15
+ end
16
+
17
+ def setup
18
+ end
19
+
20
+ # Called immediately after setup returns.
21
+ # GuiState uses this to set current_theme for ToolTip
22
+ def post_setup
23
+ end
24
+
25
+ def draw
26
+ @game_objects.each(&:draw)
27
+ end
28
+
29
+ def update
30
+ @game_objects.each(&:update)
31
+ end
32
+
33
+ def draw_bounding_box(box)
34
+ x = box.x
35
+ y = box.y
36
+ max_x = box.max_x
37
+ max_y = box.max_y
38
+
39
+ color = Gosu::Color.rgba(255, 127, 64, 240)
40
+
41
+ # pipe = 4
42
+ # Gosu.draw_rect(x-width, y-height, x+(width*2), y+(height*2), color, Float::INFINITY)
43
+ # puts "BB render: #{x}:#{y} w:#{x.abs+width} h:#{y.abs+height}"
44
+ # Gosu.draw_rect(x, y, x.abs+width, y.abs+height, color, Float::INFINITY)
45
+
46
+ # TOP LEFT to BOTTOM LEFT
47
+ $window.draw_line(
48
+ x, y, color,
49
+ x, max_y, color,
50
+ Float::INFINITY
51
+ )
52
+ # BOTTOM LEFT to BOTTOM RIGHT
53
+ $window.draw_line(
54
+ x, max_y, color,
55
+ max_x, max_y, color,
56
+ Float::INFINITY
57
+ )
58
+ # BOTTOM RIGHT to TOP RIGHT
59
+ $window.draw_line(
60
+ max_x, max_y, color,
61
+ max_x, y, color,
62
+ Float::INFINITY
63
+ )
64
+ # TOP RIGHT to TOP LEFT
65
+ $window.draw_line(
66
+ max_x, y, color,
67
+ x, y, color,
68
+ Float::INFINITY
69
+ )
70
+ end
71
+
72
+ def destroy
73
+ @options.clear
74
+ @game_objects.clear
75
+ end
76
+
77
+ def button_down(id)
78
+ @down_keys[id] = true
79
+
80
+ @game_objects.each do |o|
81
+ o.button_down(id)
82
+ end
83
+ end
84
+
85
+ def button_up(id)
86
+ @down_keys.delete(id)
87
+
88
+ @game_objects.each do |o|
89
+ o.button_up(id)
90
+ end
91
+ end
92
+
93
+ def add_game_object(object)
94
+ @game_objects << object
95
+ end
96
+ end
97
+ end