minigl 1.3.10 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -9
- data/lib/minigl/forms.rb +382 -30
- data/lib/minigl/game_object.rb +35 -10
- data/lib/minigl/global.rb +498 -383
- data/lib/minigl/map.rb +21 -21
- data/lib/minigl/movement.rb +100 -55
- data/lib/minigl/text.rb +37 -9
- data/test/data/img/barbg.png +0 -0
- data/test/data/img/barbg.svg +73 -0
- data/test/data/img/barfg.png +0 -0
- data/test/data/img/barfg.svg +106 -0
- data/test/data/img/barfgl.png +0 -0
- data/test/data/img/barfgl.svg +127 -0
- data/test/data/img/barfgr.png +0 -0
- data/test/data/img/barfgr.svg +135 -0
- data/test/data/img/square.png +0 -0
- data/test/data/img/square.svg +66 -0
- data/test/data/sound/1.wav +0 -0
- data/test/game.rb +49 -17
- data/test/game_object_tests.rb +35 -5
- data/test/iso_game.rb +2 -2
- data/test/map_tests.rb +1 -1
- data/test/mov_game.rb +72 -0
- data/test/movement_tests.rb +2 -3
- data/test/res_tests.rb +17 -3
- data/test/vector_tests.rb +1 -1
- metadata +26 -2
data/lib/minigl/map.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require_relative 'global'
|
2
2
|
|
3
|
-
module
|
3
|
+
module MiniGL
|
4
4
|
# This class provides easy control of a tile map, i.e., a map consisting of
|
5
5
|
# a grid of equally sized tiles. It also provides viewport control, through
|
6
6
|
# its camera property and methods.
|
7
7
|
class Map
|
8
|
-
|
9
|
-
|
8
|
+
SQRT_2_DIV_2 = Math.sqrt(2) / 2 # :nodoc:
|
9
|
+
MINUS_PI_DIV_4 = -Math::PI / 4 # :nodoc:
|
10
10
|
|
11
11
|
# A Vector where x is the tile width and y is the tile height.
|
12
12
|
attr_reader :tile_size
|
@@ -34,7 +34,7 @@ module AGL
|
|
34
34
|
# outside the map to appear in the screen, the camera would
|
35
35
|
# move to the nearest position where only the map shows up
|
36
36
|
# in the screen).
|
37
|
-
def initialize
|
37
|
+
def initialize(t_w, t_h, t_x_count, t_y_count, scr_w = 800, scr_h = 600, isometric = false, limit_cam = true)
|
38
38
|
@tile_size = Vector.new t_w, t_h
|
39
39
|
@size = Vector.new t_x_count, t_y_count
|
40
40
|
@cam = Rectangle.new 0, 0, scr_w, scr_h
|
@@ -71,7 +71,7 @@ module AGL
|
|
71
71
|
# the interval <code>0..t_x_count</code>.
|
72
72
|
# [map_y] The index of the tile in the vertical direction. It must be in
|
73
73
|
# the interval <code>0..t_y_count</code>.
|
74
|
-
def get_screen_pos
|
74
|
+
def get_screen_pos(map_x, map_y)
|
75
75
|
return Vector.new(map_x * @tile_size.x - @cam.x, map_y * @tile_size.y - @cam.y) unless @isometric
|
76
76
|
Vector.new ((map_x - map_y - 1) * @tile_size.x * 0.5) - @cam.x + @x_offset,
|
77
77
|
((map_x + map_y) * @tile_size.y * 0.5) - @cam.y
|
@@ -84,7 +84,7 @@ module AGL
|
|
84
84
|
# Parameters:
|
85
85
|
# [scr_x] The x-coordinate in the screen.
|
86
86
|
# [scr_y] The y-coordinate in the screen.
|
87
|
-
def get_map_pos
|
87
|
+
def get_map_pos(scr_x, scr_y)
|
88
88
|
return Vector.new((scr_x + @cam.x) / @tile_size.x, (scr_y + @cam.y) / @tile_size.y) unless @isometric
|
89
89
|
|
90
90
|
# Obtém a posição transformada para as coordenadas isométricas
|
@@ -99,7 +99,7 @@ module AGL
|
|
99
99
|
# Parameters:
|
100
100
|
# [v] A Vector representing the tile, with x as the horizontal index and
|
101
101
|
# y as the vertical index.
|
102
|
-
def is_in_map
|
102
|
+
def is_in_map(v)
|
103
103
|
v.x >= 0 && v.y >= 0 && v.x < @size.x && v.y < @size.y
|
104
104
|
end
|
105
105
|
|
@@ -109,7 +109,7 @@ module AGL
|
|
109
109
|
# Parameters:
|
110
110
|
# [cam_x] The x-coordinate inside the map, in pixels (not a tile index).
|
111
111
|
# [cam_y] The y-coordinate inside the map, in pixels (not a tile index).
|
112
|
-
def set_camera
|
112
|
+
def set_camera(cam_x, cam_y)
|
113
113
|
@cam.x = cam_x
|
114
114
|
@cam.y = cam_y
|
115
115
|
set_bounds
|
@@ -122,7 +122,7 @@ module AGL
|
|
122
122
|
# cause the camera to move to the left.
|
123
123
|
# [y] The amount of pixels to move vertically. Negative values will cause
|
124
124
|
# the camera to move up.
|
125
|
-
def move_camera
|
125
|
+
def move_camera(x, y)
|
126
126
|
@cam.x += x
|
127
127
|
@cam.y += y
|
128
128
|
set_bounds
|
@@ -158,26 +158,26 @@ module AGL
|
|
158
158
|
v4 = get_isometric_position(0, @cam.h - 1)
|
159
159
|
if v1.x < -@max_offset
|
160
160
|
offset = -(v1.x + @max_offset)
|
161
|
-
@cam.x += offset *
|
162
|
-
@cam.y += offset *
|
161
|
+
@cam.x += offset * SQRT_2_DIV_2
|
162
|
+
@cam.y += offset * SQRT_2_DIV_2 / @tile_ratio
|
163
163
|
v1.x = -@max_offset
|
164
164
|
end
|
165
165
|
if v2.y < -@max_offset
|
166
166
|
offset = -(v2.y + @max_offset)
|
167
|
-
@cam.x -= offset *
|
168
|
-
@cam.y += offset *
|
167
|
+
@cam.x -= offset * SQRT_2_DIV_2
|
168
|
+
@cam.y += offset * SQRT_2_DIV_2 / @tile_ratio
|
169
169
|
v2.y = -@max_offset
|
170
170
|
end
|
171
171
|
if v3.x > @iso_abs_size.x + @max_offset
|
172
172
|
offset = v3.x - @iso_abs_size.x - @max_offset
|
173
|
-
@cam.x -= offset *
|
174
|
-
@cam.y -= offset *
|
173
|
+
@cam.x -= offset * SQRT_2_DIV_2
|
174
|
+
@cam.y -= offset * SQRT_2_DIV_2 / @tile_ratio
|
175
175
|
v3.x = @iso_abs_size.x + @max_offset
|
176
176
|
end
|
177
177
|
if v4.y > @iso_abs_size.y + @max_offset
|
178
178
|
offset = v4.y - @iso_abs_size.y - @max_offset
|
179
|
-
@cam.x += offset *
|
180
|
-
@cam.y -= offset *
|
179
|
+
@cam.x += offset * SQRT_2_DIV_2
|
180
|
+
@cam.y -= offset * SQRT_2_DIV_2 / @tile_ratio
|
181
181
|
v4.y = @iso_abs_size.y + @max_offset
|
182
182
|
end
|
183
183
|
else
|
@@ -218,7 +218,7 @@ module AGL
|
|
218
218
|
def initialize_isometric
|
219
219
|
@x_offset = (@size.y * 0.5 * @tile_size.x).round
|
220
220
|
@tile_ratio = @tile_size.x.to_f / @tile_size.y
|
221
|
-
square_size = @tile_size.x *
|
221
|
+
square_size = @tile_size.x * SQRT_2_DIV_2
|
222
222
|
@inverse_square_size = 1 / square_size
|
223
223
|
@iso_abs_size = Vector.new(square_size * @size.x, square_size * @size.y)
|
224
224
|
a = (@size.x + @size.y) * 0.5 * @tile_size.x
|
@@ -227,11 +227,11 @@ module AGL
|
|
227
227
|
if @limit_cam
|
228
228
|
actual_cam_h = @cam.h * @tile_ratio
|
229
229
|
@max_offset = actual_cam_h < @cam.w ? actual_cam_h : @cam.w
|
230
|
-
@max_offset *=
|
230
|
+
@max_offset *= SQRT_2_DIV_2
|
231
231
|
end
|
232
232
|
end
|
233
233
|
|
234
|
-
def get_isometric_position
|
234
|
+
def get_isometric_position(scr_x, scr_y)
|
235
235
|
# Escreve a posição em relação a origem (no centro do mapa)
|
236
236
|
center = get_center
|
237
237
|
position = Vector.new scr_x + @cam.x - center.x, scr_y + @cam.y - center.y
|
@@ -243,7 +243,7 @@ module AGL
|
|
243
243
|
center.y *= @tile_ratio
|
244
244
|
|
245
245
|
# Rotaciona o vetor posição -45°
|
246
|
-
position.rotate!
|
246
|
+
position.rotate! MINUS_PI_DIV_4
|
247
247
|
|
248
248
|
# Retorna a referência da posição para o canto da tela
|
249
249
|
position += center
|
data/lib/minigl/movement.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require_relative 'global'
|
2
2
|
|
3
|
-
module
|
3
|
+
module MiniGL
|
4
4
|
# Represents an object with a rectangular bounding box and the +passable+
|
5
5
|
# property. It is the simplest structure that can be passed as an element of
|
6
6
|
# the +obst+ array parameter of the +move+ method.
|
@@ -31,7 +31,7 @@ module AGL
|
|
31
31
|
# [passable] Whether a moving object can pass through this block when
|
32
32
|
# coming from below. This is a common feature of platforms in platform
|
33
33
|
# games.
|
34
|
-
def initialize
|
34
|
+
def initialize(x, y, w, h, passable)
|
35
35
|
@x = x; @y = y; @w = w; @h = h
|
36
36
|
@passable = passable
|
37
37
|
end
|
@@ -66,6 +66,8 @@ module AGL
|
|
66
66
|
# from left to right when +false+).
|
67
67
|
attr_reader :left
|
68
68
|
|
69
|
+
attr_reader :ratio # :nodoc:
|
70
|
+
|
69
71
|
# Creates a new ramp.
|
70
72
|
#
|
71
73
|
# Parameters:
|
@@ -82,12 +84,14 @@ module AGL
|
|
82
84
|
# highest).
|
83
85
|
# [left] Whether the height of the ramp increases from left to right. Use
|
84
86
|
# +false+ for a ramp that goes down from left to right.
|
85
|
-
def initialize
|
87
|
+
def initialize(x, y, w, h, left)
|
86
88
|
@x = x
|
87
89
|
@y = y
|
88
90
|
@w = w
|
89
91
|
@h = h
|
90
92
|
@left = left
|
93
|
+
@ratio = @h.to_f / @w
|
94
|
+
@factor = Math.cos(@w / Math.sqrt(@w**2 + @h**2))
|
91
95
|
end
|
92
96
|
|
93
97
|
# Checks if an object is in contact with this ramp (standing over it).
|
@@ -95,8 +99,8 @@ module AGL
|
|
95
99
|
# Parameters:
|
96
100
|
# [obj] The object to check contact with. It must have the +x+, +y+, +w+
|
97
101
|
# and +h+ accessible attributes determining its bounding box.
|
98
|
-
def contact?
|
99
|
-
obj.x.round(6) == get_x(obj).round(6) && obj.y.round(6) == get_y(obj).round(6)
|
102
|
+
def contact?(obj)
|
103
|
+
obj.x + obj.w > @x && obj.x < @x + @w && obj.x.round(6) == get_x(obj).round(6) && obj.y.round(6) == get_y(obj).round(6)
|
100
104
|
end
|
101
105
|
|
102
106
|
# Checks if an object is intersecting this ramp (inside the corresponding
|
@@ -105,40 +109,41 @@ module AGL
|
|
105
109
|
# Parameters:
|
106
110
|
# [obj] The object to check intersection with. It must have the +x+, +y+,
|
107
111
|
# +w+ and +h+ accessible attributes determining its bounding box.
|
108
|
-
def
|
112
|
+
def intersect?(obj)
|
109
113
|
obj.x + obj.w > @x && obj.x < @x + @w && obj.y > get_y(obj) && obj.y <= @y + @h - obj.h
|
110
114
|
end
|
111
115
|
|
112
116
|
# :nodoc:
|
113
|
-
def
|
114
|
-
|
117
|
+
def check_can_collide(m)
|
118
|
+
y = get_y(m) + m.h
|
119
|
+
@can_collide = m.x + m.w > @x && @x + @w > m.x && m.y < y && m.y + m.h > y
|
115
120
|
end
|
116
121
|
|
117
|
-
def check_intersection
|
118
|
-
if @can_collide and
|
122
|
+
def check_intersection(obj)
|
123
|
+
if @can_collide and intersect? obj
|
124
|
+
counter = @left && obj.prev_speed.x > 0 || !@left && obj.prev_speed.x < 0
|
125
|
+
if obj.prev_speed.y > 0 && counter
|
126
|
+
dx = get_x(obj) - obj.x
|
127
|
+
s = (obj.prev_speed.y.to_f / obj.prev_speed.x).abs
|
128
|
+
dx /= s + @ratio
|
129
|
+
obj.x += dx
|
130
|
+
end
|
119
131
|
obj.y = get_y obj
|
132
|
+
if counter
|
133
|
+
obj.speed.x *= @factor
|
134
|
+
end
|
120
135
|
obj.speed.y = 0
|
121
|
-
# a = @w / @h
|
122
|
-
# x = get_x(obj)
|
123
|
-
# y = get_y(obj)
|
124
|
-
# w = obj.x - x
|
125
|
-
# h = obj.y - y
|
126
|
-
# dx = w * h / (w * a + h)
|
127
|
-
# dy = dx * a
|
128
|
-
#
|
129
|
-
# obj.x -= dx
|
130
|
-
# obj.y -= dy
|
131
|
-
# obj.speed.x *= (@w / (@w + @h))
|
132
|
-
# obj.speed.y = 0
|
133
136
|
end
|
134
137
|
end
|
135
138
|
|
136
|
-
def get_x
|
139
|
+
def get_x(obj)
|
140
|
+
return obj.x if @left && obj.x + obj.w > @x + @w
|
137
141
|
return @x + (1.0 * (@y + @h - obj.y - obj.h) * @w / @h) - obj.w if @left
|
142
|
+
return obj.x if obj.x < @x
|
138
143
|
@x + (1.0 * (obj.y + obj.h - @y) * @w / @h)
|
139
144
|
end
|
140
145
|
|
141
|
-
def get_y
|
146
|
+
def get_y(obj)
|
142
147
|
return @y - obj.h if @left && obj.x + obj.w > @x + @w
|
143
148
|
return @y + (1.0 * (@x + @w - obj.x - obj.w) * @h / @w) - obj.h if @left
|
144
149
|
return @y - obj.h if obj.x < @x
|
@@ -161,6 +166,10 @@ module AGL
|
|
161
166
|
# y: vertical component).
|
162
167
|
attr_reader :speed
|
163
168
|
|
169
|
+
# A Vector with the speed limits for the object (x: horizontal component,
|
170
|
+
# y: vertical component).
|
171
|
+
attr_reader :max_speed
|
172
|
+
|
164
173
|
# Width of the bounding box.
|
165
174
|
attr_reader :w
|
166
175
|
|
@@ -197,6 +206,8 @@ module AGL
|
|
197
206
|
# be applied in the next time +move+ is called.
|
198
207
|
attr_accessor :stored_forces
|
199
208
|
|
209
|
+
attr_reader :prev_speed # :nodoc:
|
210
|
+
|
200
211
|
# Returns the bounding box as a Rectangle.
|
201
212
|
def bounds
|
202
213
|
Rectangle.new @x, @y, @w, @h
|
@@ -213,24 +224,25 @@ module AGL
|
|
213
224
|
# objects that <code>include Movement</code>.
|
214
225
|
# [ramps] An array of ramps to be considered in the collision checking.
|
215
226
|
# Ramps must be instances of Ramp (or derived classes).
|
216
|
-
def move
|
217
|
-
forces.x +=
|
227
|
+
def move(forces, obst, ramps)
|
228
|
+
forces.x += G.gravity.x; forces.y += G.gravity.y
|
218
229
|
forces.x += @stored_forces.x; forces.y += @stored_forces.y
|
219
230
|
@stored_forces.x = @stored_forces.y = 0
|
220
231
|
|
221
|
-
# check_contact obst, ramps
|
222
232
|
forces.x = 0 if (forces.x < 0 and @left) or (forces.x > 0 and @right)
|
223
233
|
forces.y = 0 if (forces.y < 0 and @top) or (forces.y > 0 and @bottom)
|
224
234
|
|
235
|
+
if @bottom.is_a? Ramp and @bottom.ratio >= G.ramp_slip_threshold
|
236
|
+
forces.x = (@bottom.left ? -1 : 1) * 0.1
|
237
|
+
end
|
238
|
+
|
225
239
|
@speed.x += forces.x / @mass; @speed.y += forces.y / @mass
|
226
|
-
@speed.x = 0 if @speed.x.abs <
|
227
|
-
@speed.y = 0 if @speed.y.abs <
|
240
|
+
@speed.x = 0 if @speed.x.abs < G.min_speed.x
|
241
|
+
@speed.y = 0 if @speed.y.abs < G.min_speed.y
|
228
242
|
@speed.x = (@speed.x <=> 0) * @max_speed.x if @speed.x.abs > @max_speed.x
|
229
243
|
@speed.y = (@speed.y <=> 0) * @max_speed.y if @speed.y.abs > @max_speed.y
|
230
244
|
|
231
|
-
|
232
|
-
r.can_collide? self
|
233
|
-
end
|
245
|
+
@prev_speed = @speed.clone
|
234
246
|
|
235
247
|
x = @speed.x < 0 ? @x + @speed.x : @x
|
236
248
|
y = @speed.y < 0 ? @y + @speed.y : @y
|
@@ -239,7 +251,10 @@ module AGL
|
|
239
251
|
move_bounds = Rectangle.new x, y, w, h
|
240
252
|
coll_list = []
|
241
253
|
obst.each do |o|
|
242
|
-
coll_list << o if move_bounds.
|
254
|
+
coll_list << o if move_bounds.intersect? o.bounds
|
255
|
+
end
|
256
|
+
ramps.each do |r|
|
257
|
+
r.check_can_collide move_bounds
|
243
258
|
end
|
244
259
|
|
245
260
|
if coll_list.length > 0
|
@@ -251,8 +266,12 @@ module AGL
|
|
251
266
|
elsif dn; y_lim = find_down_limit coll_list
|
252
267
|
elsif up; y_lim = find_up_limit coll_list
|
253
268
|
end
|
254
|
-
if rt && @x + @w + @speed.x > x_lim
|
255
|
-
|
269
|
+
if rt && @x + @w + @speed.x > x_lim
|
270
|
+
@x = x_lim - @w
|
271
|
+
@speed.x = 0
|
272
|
+
elsif lf && @x + @speed.x < x_lim
|
273
|
+
@x = x_lim
|
274
|
+
@speed.x = 0
|
256
275
|
elsif dn && @y + @h + @speed.y > y_lim; @y = y_lim - @h; @speed.y = 0
|
257
276
|
elsif up && @y + @speed.y < y_lim; @y = y_lim; @speed.y = 0
|
258
277
|
end
|
@@ -306,6 +325,11 @@ module AGL
|
|
306
325
|
@x += @speed.x
|
307
326
|
@y += @speed.y
|
308
327
|
|
328
|
+
# Keeping contact with ramp
|
329
|
+
# if @speed.y == 0 and @speed.x.abs <= G.ramp_contact_threshold and @bottom.is_a? Ramp
|
330
|
+
# @y = @bottom.get_y(self)
|
331
|
+
# puts 'aqui'
|
332
|
+
# end
|
309
333
|
ramps.each do |r|
|
310
334
|
r.check_intersection self
|
311
335
|
end
|
@@ -323,9 +347,15 @@ module AGL
|
|
323
347
|
# checking, and carried along when colliding from above.
|
324
348
|
# Obstacles must be instances of Block (or derived classes),
|
325
349
|
# or objects that <code>include Movement</code>.
|
326
|
-
def move_carrying
|
350
|
+
def move_carrying(aim, speed, obstacles)
|
327
351
|
x_d = aim.x - @x; y_d = aim.y - @y
|
328
352
|
distance = Math.sqrt(x_d**2 + y_d**2)
|
353
|
+
|
354
|
+
if distance == 0
|
355
|
+
@speed.x = @speed.y = 0
|
356
|
+
return
|
357
|
+
end
|
358
|
+
|
329
359
|
@speed.x = 1.0 * x_d * speed / distance
|
330
360
|
@speed.y = 1.0 * y_d * speed / distance
|
331
361
|
|
@@ -363,9 +393,15 @@ module AGL
|
|
363
393
|
# [aim] A Vector specifying where the object will move to.
|
364
394
|
# [speed] The constant speed at which the object will move. This must be
|
365
395
|
# provided as a scalar, not a vector.
|
366
|
-
def move_free
|
396
|
+
def move_free(aim, speed)
|
367
397
|
x_d = aim.x - @x; y_d = aim.y - @y
|
368
398
|
distance = Math.sqrt(x_d**2 + y_d**2)
|
399
|
+
|
400
|
+
if distance == 0
|
401
|
+
@speed.x = @speed.y = 0
|
402
|
+
return
|
403
|
+
end
|
404
|
+
|
369
405
|
@speed.x = 1.0 * x_d * speed / distance
|
370
406
|
@speed.y = 1.0 * y_d * speed / distance
|
371
407
|
|
@@ -385,39 +421,37 @@ module AGL
|
|
385
421
|
end
|
386
422
|
|
387
423
|
# Causes the object to move in cycles across multiple given points (the
|
388
|
-
#
|
389
|
-
#
|
390
|
-
# provided, it will behave as an elevator (as in
|
424
|
+
# first point in the array is the first point the object will move towards,
|
425
|
+
# so it doesn't need to be equal to the current/initial position). If
|
426
|
+
# obstacles are provided, it will behave as an elevator (as in
|
427
|
+
# +move_carrying+).
|
391
428
|
#
|
392
429
|
# Parameters:
|
393
430
|
# [points] An array of Vectors representing the path that the object will
|
394
431
|
# perform.
|
395
|
-
# [cur_point] The index of the point in the path that the object is
|
396
|
-
# currently moving to. In the first call, it is a good idea to
|
397
|
-
# provide 0, while in the subsequent calls, you must provide
|
398
|
-
# the return value of this method.
|
399
432
|
# [speed] The constant speed at which the object will move. This must be
|
400
433
|
# provided as a scalar, not a vector.
|
401
434
|
# [obstacles] An array of obstacles to be considered in the collision
|
402
435
|
# checking, and carried along when colliding from above.
|
403
436
|
# Obstacles must be instances of Block (or derived classes),
|
404
437
|
# or objects that <code>include Movement</code>.
|
405
|
-
def cycle
|
438
|
+
def cycle(points, speed, obstacles = nil)
|
439
|
+
@cur_point = 0 if @cur_point.nil?
|
406
440
|
if obstacles
|
407
|
-
move_carrying points[cur_point], speed, obstacles
|
441
|
+
move_carrying points[@cur_point], speed, obstacles
|
408
442
|
else
|
409
|
-
move_free points[cur_point], speed
|
443
|
+
move_free points[@cur_point], speed
|
410
444
|
end
|
411
445
|
if @speed.x == 0 and @speed.y == 0
|
412
|
-
if cur_point == points.length - 1; cur_point = 0
|
413
|
-
else; cur_point += 1; end
|
446
|
+
if @cur_point == points.length - 1; @cur_point = 0
|
447
|
+
else; @cur_point += 1; end
|
414
448
|
end
|
415
|
-
cur_point
|
416
449
|
end
|
417
450
|
|
418
451
|
private
|
419
452
|
|
420
|
-
def check_contact
|
453
|
+
def check_contact(obst, ramps)
|
454
|
+
prev_bottom = @bottom
|
421
455
|
@top = @bottom = @left = @right = nil
|
422
456
|
obst.each do |o|
|
423
457
|
x2 = @x + @w; y2 = @y + @h; x2o = o.x + o.w; y2o = o.y + o.h
|
@@ -433,10 +467,21 @@ module AGL
|
|
433
467
|
break
|
434
468
|
end
|
435
469
|
end
|
470
|
+
if @bottom.nil?
|
471
|
+
ramps.each do |r|
|
472
|
+
if r == prev_bottom && @x + @w > r.x && r.x + r.w > @x &&
|
473
|
+
@prev_speed.x.abs <= G.ramp_contact_threshold &&
|
474
|
+
@prev_speed.y >= 0
|
475
|
+
@y = r.get_y self
|
476
|
+
@bottom = r
|
477
|
+
break
|
478
|
+
end
|
479
|
+
end
|
480
|
+
end
|
436
481
|
end
|
437
482
|
end
|
438
483
|
|
439
|
-
def find_right_limit
|
484
|
+
def find_right_limit(coll_list)
|
440
485
|
limit = @x + @w + @speed.x
|
441
486
|
coll_list.each do |c|
|
442
487
|
limit = c.x if !c.passable && c.x < limit
|
@@ -444,7 +489,7 @@ module AGL
|
|
444
489
|
limit
|
445
490
|
end
|
446
491
|
|
447
|
-
def find_left_limit
|
492
|
+
def find_left_limit(coll_list)
|
448
493
|
limit = @x + @speed.x
|
449
494
|
coll_list.each do |c|
|
450
495
|
limit = c.x + c.w if !c.passable && c.x + c.w > limit
|
@@ -452,7 +497,7 @@ module AGL
|
|
452
497
|
limit
|
453
498
|
end
|
454
499
|
|
455
|
-
def find_down_limit
|
500
|
+
def find_down_limit(coll_list)
|
456
501
|
limit = @y + @h + @speed.y
|
457
502
|
coll_list.each do |c|
|
458
503
|
limit = c.y if c.y < limit && c.y >= @y + @h
|
@@ -460,7 +505,7 @@ module AGL
|
|
460
505
|
limit
|
461
506
|
end
|
462
507
|
|
463
|
-
def find_up_limit
|
508
|
+
def find_up_limit(coll_list)
|
464
509
|
limit = @y + @speed.y
|
465
510
|
coll_list.each do |c|
|
466
511
|
limit = c.y + c.h if !c.passable && c.y + c.h > limit
|