cyberarm_engine 0.19.0 → 0.19.1

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