fantasy 0.1.7 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/README.md +54 -5
- data/lib/fantasy/actor.rb +160 -27
- data/lib/fantasy/coordinates.rb +4 -0
- data/lib/fantasy/global.rb +11 -0
- data/lib/fantasy/hud_image.rb +1 -1
- data/lib/fantasy/hud_text.rb +20 -6
- data/lib/fantasy/includes/gravitier.rb +5 -0
- data/lib/fantasy/includes/jumper.rb +30 -0
- data/lib/fantasy/includes/move_by_cursors.rb +21 -10
- data/lib/fantasy/includes/move_by_direction.rb +5 -0
- data/lib/fantasy/includes/mover.rb +20 -0
- data/lib/fantasy/music.rb +49 -0
- data/lib/fantasy/version.rb +1 -1
- data/lib/fantasy.rb +7 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c4d46c2a62a78651a3e571f5728ad846010dace93462f0c980b2235291a7f76
|
4
|
+
data.tar.gz: ceea378b0edd7b58155a9d05eb659236b4c70a0253e42167084e88cc41853170
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b1c7f7e63529fc52adfe955152a76820da1f7df3e9274184d5f8b93df3f647a529eba55bd6b8b64b2270f3d54780b3c39ea3a5066bb21e2114ca5e79ce78602f
|
7
|
+
data.tar.gz: 418dc874ae30413c064a63074fe54b67840bdf1cd38bff01c6288b6b9bf287abe5c5e6c3aab7830be23fe0660d390b6dbc8e86565f81e667b156bb9f6150e453
|
data/CHANGELOG.md
CHANGED
@@ -3,3 +3,21 @@
|
|
3
3
|
## [0.1.0] - 2022-03-11
|
4
4
|
|
5
5
|
- Initial release
|
6
|
+
|
7
|
+
## [0.1.5] - 2022-03-16
|
8
|
+
|
9
|
+
- Background color or image
|
10
|
+
- Tilemap
|
11
|
+
- Camera can be controlled by cursors
|
12
|
+
- Background image can be replicable
|
13
|
+
|
14
|
+
## [0.1.7] - 2022-03-17
|
15
|
+
|
16
|
+
- HudText accepts alignment property. Valid values: 'top-left, top-right, center'
|
17
|
+
|
18
|
+
## [0.1.9] - 2022-03-25
|
19
|
+
|
20
|
+
- Adding platformer support
|
21
|
+
- Jump
|
22
|
+
- Gravity
|
23
|
+
- Music background support
|
data/README.md
CHANGED
@@ -116,12 +116,13 @@ Managing game elements which have (optionally) image, movement and collision
|
|
116
116
|
- Easy to set an `image`
|
117
117
|
- Managing movement through `direction` and `speed`
|
118
118
|
- Built-in movement control through cursors
|
119
|
-
- Collision detection, OnCollision callback
|
120
|
-
- Jump
|
121
|
-
- Gravity
|
119
|
+
- Collision detection, OnCollision callback, Collision matrix
|
120
|
+
- Jump
|
121
|
+
- Gravity
|
122
122
|
- Animations (TODO)
|
123
123
|
- Possibility to extend Actor class or instantiate it directly for simple characters
|
124
124
|
- Allowing magic instance properties (Like in OpenStruct). So programmer can do `actor.stuff = 1` and it is valid (TODO)
|
125
|
+
- Alignment "center" and "top-left" (TODO)
|
125
126
|
|
126
127
|
### Clock
|
127
128
|
|
@@ -196,7 +197,9 @@ Move the core functions to the top level hierarchy so I don't need to create a `
|
|
196
197
|
|
197
198
|
### Sound
|
198
199
|
|
199
|
-
Direct and easy way to play a sound
|
200
|
+
- Direct and easy way to play a sound
|
201
|
+
- Direct and easy way to play a background music
|
202
|
+
|
200
203
|
|
201
204
|
### Background
|
202
205
|
|
@@ -302,6 +305,7 @@ player.solid = true
|
|
302
305
|
player.speed = 200
|
303
306
|
player.layer = 1
|
304
307
|
player.move_with_cursors
|
308
|
+
player.collision_with = ["enemy", "bullets"] # default "all"
|
305
309
|
|
306
310
|
player.on_collision do |other|
|
307
311
|
if other.name == "enemy"
|
@@ -331,6 +335,7 @@ class Player < Actor
|
|
331
335
|
@speed = 200
|
332
336
|
@layer = 1
|
333
337
|
@direction = Coordinates.zero
|
338
|
+
@collision_with = ["enemy", "bullets"] # default "all"
|
334
339
|
move_with_cursors
|
335
340
|
end
|
336
341
|
|
@@ -352,6 +357,25 @@ class Player < Actor
|
|
352
357
|
end
|
353
358
|
```
|
354
359
|
|
360
|
+
Actor settings for a platformer:
|
361
|
+
|
362
|
+
```ruby
|
363
|
+
player = Actor.new("warrior") # ./images/warrior.png
|
364
|
+
player.solid = true
|
365
|
+
player.jump = 150
|
366
|
+
player.gravity = 200
|
367
|
+
player.move_with_cursors(left: true, right: true, up: false, down: false, jump: true)
|
368
|
+
|
369
|
+
player.on_start_jumping do
|
370
|
+
Sound.play("jump")
|
371
|
+
player.image = "warrior_jump")
|
372
|
+
end
|
373
|
+
|
374
|
+
player.on_start_falling do
|
375
|
+
player.image = "warrior")
|
376
|
+
end
|
377
|
+
```
|
378
|
+
|
355
379
|
### Clock
|
356
380
|
|
357
381
|
```ruby
|
@@ -398,18 +422,43 @@ end
|
|
398
422
|
|
399
423
|
### Sound
|
400
424
|
|
425
|
+
Plays only once:
|
426
|
+
|
401
427
|
```ruby
|
402
428
|
Sound.play("shoot") # ./sounds/shoot.wav
|
403
429
|
```
|
404
430
|
|
431
|
+
Plays in loop:
|
432
|
+
|
433
|
+
```ruby
|
434
|
+
Music.play("music") # ./musics/music.mp3
|
435
|
+
Music.volume = 0.5
|
436
|
+
Music.stop
|
437
|
+
```
|
438
|
+
|
439
|
+
### Tilemap
|
440
|
+
|
441
|
+
```ruby
|
442
|
+
# ./maps/sky.txt
|
443
|
+
#0 0 0
|
444
|
+
# 1 0
|
445
|
+
#
|
446
|
+
#0 0 0
|
447
|
+
|
448
|
+
planet = Actor.new("planet")
|
449
|
+
star = Actor.new("star")
|
450
|
+
map = Tilemap.new(map_name: "sky", tiles: [planet, star], tile_size: 30)
|
451
|
+
map.spawn
|
452
|
+
```
|
405
453
|
|
406
454
|
### UI
|
407
455
|
|
408
456
|
#### HUD Text
|
409
457
|
|
410
458
|
```ruby
|
411
|
-
timer = HudText.new(position: Coordinates.new(
|
459
|
+
timer = HudText.new(position: Coordinates.new(SCREEN_WIDTH / 2, 10))
|
412
460
|
timer.text = 0
|
461
|
+
timer.alignment = "center"
|
413
462
|
timer.size = "big"
|
414
463
|
|
415
464
|
Clock.new { timer.text += 1 }.repeat(seconds: 1)
|
data/lib/fantasy/actor.rb
CHANGED
@@ -1,26 +1,40 @@
|
|
1
1
|
class Actor
|
2
2
|
include MoveByCursor
|
3
|
+
include MoveByDirection
|
4
|
+
include Mover
|
5
|
+
include Gravitier
|
6
|
+
include Jumper
|
3
7
|
|
4
8
|
attr_reader :image, :moving_with_cursors
|
5
|
-
attr_accessor :image_name, :position, :direction, :speed, :solid, :scale, :name, :layer
|
9
|
+
attr_accessor :image_name, :position, :direction, :speed, :jump, :gravity, :solid, :scale, :name, :layer
|
10
|
+
attr_accessor :collision_with
|
6
11
|
|
7
12
|
def initialize(image_name)
|
8
13
|
@image_name = image_name
|
9
14
|
@image = Image.new(image_name)
|
10
15
|
@name = image_name
|
11
|
-
@position = Coordinates.
|
12
|
-
@direction = Coordinates.
|
16
|
+
@position = Coordinates.zero
|
17
|
+
@direction = Coordinates.zero
|
13
18
|
@speed = 0
|
14
19
|
@scale = 1
|
15
|
-
|
20
|
+
|
16
21
|
@moving_with_cursors = false
|
17
22
|
@solid = false
|
18
23
|
@draggable_on_debug = true
|
19
24
|
@dragging = false
|
20
25
|
@dragging_offset = nil
|
21
26
|
@layer = 0
|
27
|
+
@gravity = 0
|
28
|
+
@jump = 0
|
29
|
+
@collision_with = "all"
|
30
|
+
|
31
|
+
@on_floor = false
|
22
32
|
|
33
|
+
@on_after_move_callback = nil
|
23
34
|
@on_collision_callback = nil
|
35
|
+
@on_destroy_callback = nil
|
36
|
+
@on_start_jumping_callback = nil
|
37
|
+
@on_start_falling_callback = nil
|
24
38
|
|
25
39
|
Global.actors << self
|
26
40
|
end
|
@@ -30,20 +44,16 @@ class Actor
|
|
30
44
|
end
|
31
45
|
|
32
46
|
def width
|
33
|
-
@image.width
|
47
|
+
@image.width * @scale
|
34
48
|
end
|
35
49
|
|
36
50
|
def height
|
37
|
-
@image.height
|
38
|
-
end
|
39
|
-
|
40
|
-
def move_with_cursors
|
41
|
-
@moving_with_cursors = true
|
51
|
+
@image.height * @scale
|
42
52
|
end
|
43
53
|
|
44
54
|
def direction=(value)
|
45
55
|
@direction = value
|
46
|
-
@direction = @direction.normalize
|
56
|
+
@direction = @direction.normalize unless @direction.zero?
|
47
57
|
end
|
48
58
|
|
49
59
|
def draw
|
@@ -61,6 +71,25 @@ class Actor
|
|
61
71
|
@position - Global.camera.position
|
62
72
|
end
|
63
73
|
|
74
|
+
# TODO: make this work optimized
|
75
|
+
# def position_top_left
|
76
|
+
# @position - position_delta
|
77
|
+
# end
|
78
|
+
|
79
|
+
# def position_delta
|
80
|
+
# case @alignment
|
81
|
+
# when "top-left"
|
82
|
+
# Coordinates.zero
|
83
|
+
# when "center"
|
84
|
+
# Coordinates.new(width/2, height/2)
|
85
|
+
# else
|
86
|
+
# raise "Actor.alignment value not valid '#{@alignment}'. Valid values: 'top-left, center'"
|
87
|
+
# end
|
88
|
+
# end
|
89
|
+
|
90
|
+
# TODO: I made more of this code while I was with Covid
|
91
|
+
# It looks horrible and it is crap
|
92
|
+
# I'll improve it some day :)
|
64
93
|
def move
|
65
94
|
mouse_position = Global.mouse_position + Global.camera.position
|
66
95
|
|
@@ -76,30 +105,87 @@ class Actor
|
|
76
105
|
if @dragging
|
77
106
|
@position = mouse_position - @dragging_offset
|
78
107
|
else
|
79
|
-
|
108
|
+
# Direction moving
|
109
|
+
unless @direction.zero?
|
110
|
+
@velocity = Coordinates.zero
|
111
|
+
last_position = @position
|
112
|
+
add_forces_by_direction
|
113
|
+
apply_forces(max_speed: @speed)
|
114
|
+
|
115
|
+
# Check collision after cursor moving
|
116
|
+
if @solid && @position != last_position
|
117
|
+
manage_collisions(last_position)
|
118
|
+
end
|
119
|
+
end
|
80
120
|
|
81
|
-
|
82
|
-
|
83
|
-
|
121
|
+
# Cursors moving
|
122
|
+
@velocity = Coordinates.zero
|
123
|
+
last_position = @position
|
124
|
+
add_forces_by_cursors
|
125
|
+
apply_forces(max_speed: @speed)
|
84
126
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
end
|
127
|
+
# Check collision after cursor moving
|
128
|
+
if @solid && @position != last_position
|
129
|
+
manage_collisions(last_position)
|
130
|
+
end
|
90
131
|
|
91
|
-
|
132
|
+
# Jump moving
|
133
|
+
unless @jump.zero?
|
134
|
+
@velocity = Coordinates.zero
|
135
|
+
last_position = @position
|
136
|
+
add_force_by_jump
|
137
|
+
apply_forces(max_speed: @speed)
|
138
|
+
|
139
|
+
# Check collision after jump moving
|
140
|
+
if @solid && @position != last_position
|
141
|
+
if manage_collisions(last_position)
|
142
|
+
@jumping = false
|
143
|
+
end
|
92
144
|
end
|
93
145
|
end
|
146
|
+
|
147
|
+
# Gravity moving
|
148
|
+
if !@gravity.zero? && !@jumping
|
149
|
+
@velocity = Coordinates.zero
|
150
|
+
last_position = @position
|
151
|
+
add_force_by_gravity
|
152
|
+
apply_forces(max_speed: @gravity)
|
153
|
+
|
154
|
+
# Check collision after gravity moving
|
155
|
+
if @solid && @position != last_position
|
156
|
+
@on_floor = false
|
157
|
+
manage_collisions(last_position)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
on_after_move_do
|
163
|
+
end
|
164
|
+
|
165
|
+
def manage_collisions(last_position)
|
166
|
+
collisions.each do |other|
|
167
|
+
on_collision_do(other)
|
168
|
+
other.on_collision_do(self)
|
169
|
+
|
170
|
+
if other.position.y > (last_position.y + height)
|
171
|
+
@on_floor = true
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
if collisions.any? # we don't cache collisions because position may be changed on collision callback
|
176
|
+
@position = last_position
|
177
|
+
|
178
|
+
return true
|
94
179
|
end
|
95
180
|
|
96
|
-
|
181
|
+
false
|
97
182
|
end
|
98
183
|
|
99
184
|
def solid?
|
100
185
|
@solid
|
101
186
|
end
|
102
187
|
|
188
|
+
# Set callbacks
|
103
189
|
def on_after_move(&block)
|
104
190
|
@on_after_move_callback = block
|
105
191
|
end
|
@@ -112,18 +198,51 @@ class Actor
|
|
112
198
|
@on_destroy_callback = block
|
113
199
|
end
|
114
200
|
|
115
|
-
def
|
116
|
-
@
|
201
|
+
def on_start_jumping(&block)
|
202
|
+
@on_start_jumping_callback = block
|
117
203
|
end
|
118
204
|
|
205
|
+
def on_start_falling(&block)
|
206
|
+
@on_start_falling_callback = block
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
# Execute callbacks
|
211
|
+
def on_after_move_do
|
212
|
+
instance_exec(&@on_after_move_callback) unless @on_after_move_callback.nil?
|
213
|
+
end
|
214
|
+
|
215
|
+
def on_collision_do(other)
|
216
|
+
instance_exec(other, &@on_collision_callback) unless @on_collision_callback.nil?
|
217
|
+
end
|
218
|
+
|
219
|
+
def on_destroy_do
|
220
|
+
instance_exec(&@on_destroy_callback) unless @on_destroy_callback.nil?
|
221
|
+
end
|
222
|
+
|
223
|
+
def on_start_jumping_do
|
224
|
+
instance_exec(&@on_start_jumping_callback) unless @on_start_jumping_callback.nil?
|
225
|
+
end
|
226
|
+
|
227
|
+
def on_start_falling_do
|
228
|
+
instance_exec(&@on_start_falling_callback) unless @on_start_falling_callback.nil?
|
229
|
+
end
|
230
|
+
|
231
|
+
|
232
|
+
|
119
233
|
def collisions
|
120
|
-
Global.actors.reject { |e| e == self }.select { |e| e.solid? }.select do |
|
121
|
-
|
234
|
+
Global.actors.reject { |e| e == self }.select { |e| e.solid? }.select do |other|
|
235
|
+
if(
|
236
|
+
(@collision_with == "all" || @collision_with.include?(other.name)) &&
|
237
|
+
(other.collision_with == "all" || other.collision_with.include?(self.name))
|
238
|
+
)
|
239
|
+
Utils.collision? self, other
|
240
|
+
end
|
122
241
|
end
|
123
242
|
end
|
124
243
|
|
125
244
|
def destroy
|
126
|
-
|
245
|
+
on_destroy_do
|
127
246
|
Global.actors.delete(self)
|
128
247
|
end
|
129
248
|
|
@@ -133,15 +252,21 @@ class Actor
|
|
133
252
|
actor.name = @name
|
134
253
|
actor.position = @position.clone
|
135
254
|
actor.direction = @direction.clone
|
255
|
+
|
136
256
|
actor.speed = @speed
|
137
257
|
actor.scale = @scale
|
138
258
|
actor.moving_with_cursors if @moving_with_cursors
|
139
259
|
actor.solid = @solid
|
140
260
|
actor.layer = @layer
|
261
|
+
actor.gravity = @gravity
|
262
|
+
actor.jump = @jump
|
263
|
+
actor.collision_with = @collision_with
|
141
264
|
|
142
265
|
actor.on_after_move_callback = @on_after_move_callback
|
143
266
|
actor.on_collision_callback = @on_collision_callback
|
144
267
|
actor.on_destroy_callback = @on_destroy_callback
|
268
|
+
actor.on_start_jumping = @on_start_jumping_callback
|
269
|
+
actor.on_start_falling = @on_start_falling_callback
|
145
270
|
|
146
271
|
actor
|
147
272
|
end
|
@@ -159,4 +284,12 @@ class Actor
|
|
159
284
|
def on_destroy_callback=(block)
|
160
285
|
@on_destroy_callback = block
|
161
286
|
end
|
287
|
+
|
288
|
+
def on_start_jumping=(block)
|
289
|
+
@on_start_jumping_callback = block
|
290
|
+
end
|
291
|
+
|
292
|
+
def on_start_falling=(block)
|
293
|
+
@on_start_falling_callback = block
|
294
|
+
end
|
162
295
|
end
|
data/lib/fantasy/coordinates.rb
CHANGED
data/lib/fantasy/global.rb
CHANGED
@@ -116,11 +116,22 @@ module Global
|
|
116
116
|
@hud_images.clear
|
117
117
|
@backgrounds.clear
|
118
118
|
@tile_maps.clear
|
119
|
+
@camera.position = Coordinates.zero
|
119
120
|
|
120
121
|
@clocks.reject(&:persistent?).each do |clock|
|
121
122
|
clock.stop unless clock.thread == Thread.current # no stop current Thread
|
122
123
|
end
|
123
124
|
|
125
|
+
# clear callbacks
|
126
|
+
@button_proc = nil
|
127
|
+
@space_bar_proc = nil
|
128
|
+
@cursor_up_proc = nil
|
129
|
+
@cursor_down_proc = nil
|
130
|
+
@cursor_left_proc = nil
|
131
|
+
@cursor_right_proc = nil
|
132
|
+
@mouse_button_left_proc = nil
|
133
|
+
@mouse_button_right_proc = nil
|
134
|
+
|
124
135
|
@background = Color.new(r: 0, g: 0, b: 0)
|
125
136
|
end
|
126
137
|
|
data/lib/fantasy/hud_image.rb
CHANGED
@@ -37,7 +37,7 @@ class HudImage
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def draw_debug
|
40
|
-
Global.
|
40
|
+
Global.pixel_fonts["medium"].draw_text("#{@position.x.floor},#{@position.y.floor}", @position.x, @position.y - 20, 1)
|
41
41
|
end
|
42
42
|
|
43
43
|
def destroy
|
data/lib/fantasy/hud_text.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class HudText
|
2
|
-
attr_accessor :text, :size, :color, :visible, :layer, :in_world, :position
|
2
|
+
attr_accessor :text, :size, :color, :visible, :layer, :in_world, :position, :alignment
|
3
3
|
|
4
4
|
def initialize(position:, text: "")
|
5
5
|
@position = position
|
@@ -9,6 +9,7 @@ class HudText
|
|
9
9
|
@visible = true
|
10
10
|
@layer = 100
|
11
11
|
@in_world = false
|
12
|
+
@alignment = "top-left"
|
12
13
|
|
13
14
|
Global.hud_texts.push(self)
|
14
15
|
end
|
@@ -17,8 +18,8 @@ class HudText
|
|
17
18
|
|
18
19
|
def draw
|
19
20
|
if visible
|
20
|
-
font.
|
21
|
-
font.
|
21
|
+
font.draw_markup_rel(text, screen_position.x + shadow_offset, screen_position.y + shadow_offset, 1, position_rel.x, position_rel.y, 1, 1, Gosu::Color::BLACK)
|
22
|
+
font.draw_markup_rel(text, screen_position.x, screen_position.y, 1, position_rel.x, position_rel.y, 1, 1, color)
|
22
23
|
end
|
23
24
|
|
24
25
|
draw_debug if Global.debug
|
@@ -27,11 +28,24 @@ class HudText
|
|
27
28
|
def font
|
28
29
|
found_font = Global.pixel_fonts[@size]
|
29
30
|
if found_font.nil?
|
30
|
-
raise "HudText.size not valid '#{@size}'. Valid
|
31
|
+
raise "HudText.size value not valid '#{@size}'. Valid values: 'small, medium, big, huge'"
|
31
32
|
end
|
32
33
|
found_font
|
33
34
|
end
|
34
35
|
|
36
|
+
def position_rel
|
37
|
+
case @alignment
|
38
|
+
when "top-left"
|
39
|
+
Coordinates.new(0, 0)
|
40
|
+
when "top-right"
|
41
|
+
Coordinates.new(1, 0)
|
42
|
+
when "center"
|
43
|
+
Coordinates.new(0.5, 0.5)
|
44
|
+
else
|
45
|
+
raise "HudText.alignment value not valid '#{@alignment}'. Valid values: 'top-left, top-right, center'"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
35
49
|
def shadow_offset
|
36
50
|
case @size
|
37
51
|
when "small"
|
@@ -43,7 +57,7 @@ class HudText
|
|
43
57
|
when "huge"
|
44
58
|
4
|
45
59
|
else
|
46
|
-
raise "HudText.size not valid '#{@size}'. Valid sizes: 'small, medium, big, huge'"
|
60
|
+
raise "HudText.size value not valid '#{@size}'. Valid sizes: 'small, medium, big, huge'"
|
47
61
|
end
|
48
62
|
end
|
49
63
|
|
@@ -60,6 +74,6 @@ class HudText
|
|
60
74
|
end
|
61
75
|
|
62
76
|
def draw_debug
|
63
|
-
Global.pixel_fonts["medium"].draw_text("#{@position.x.floor},#{@position.y.floor}",
|
77
|
+
Global.pixel_fonts["medium"].draw_text("#{@position.x.floor},#{@position.y.floor}", screen_position.x, screen_position.y, 1)
|
64
78
|
end
|
65
79
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Jumper
|
2
|
+
def add_force_by_jump
|
3
|
+
if Gosu.button_down?(Gosu::KB_SPACE) && @move_with_cursors_jump && !@jumping && @on_floor
|
4
|
+
execute_jump
|
5
|
+
end
|
6
|
+
|
7
|
+
if @jumping
|
8
|
+
continue_jump
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute_jump
|
13
|
+
@jumping = true
|
14
|
+
@on_floor = false
|
15
|
+
@final_vertical_position = @position.y - @jump
|
16
|
+
|
17
|
+
on_start_jumping_do
|
18
|
+
end
|
19
|
+
|
20
|
+
def continue_jump
|
21
|
+
add_force(Coordinates.up * @jump)
|
22
|
+
|
23
|
+
if(@position.y <= @final_vertical_position)
|
24
|
+
@position.y = @final_vertical_position
|
25
|
+
@jumping = false
|
26
|
+
|
27
|
+
on_start_falling_do
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,15 +1,26 @@
|
|
1
1
|
module MoveByCursor
|
2
|
-
def
|
3
|
-
if Gosu.button_down?(Gosu::KB_DOWN)
|
4
|
-
|
5
|
-
elsif Gosu.button_down?(Gosu::KB_UP)
|
6
|
-
|
7
|
-
elsif Gosu.button_down?(Gosu::KB_RIGHT)
|
8
|
-
|
9
|
-
elsif Gosu.button_down?(Gosu::KB_LEFT)
|
10
|
-
|
2
|
+
def add_forces_by_cursors
|
3
|
+
if Gosu.button_down?(Gosu::KB_DOWN) && @move_with_cursors_down
|
4
|
+
add_force(Coordinates.down * @speed)
|
5
|
+
elsif Gosu.button_down?(Gosu::KB_UP) && @move_with_cursors_up
|
6
|
+
add_force(Coordinates.up * @speed)
|
7
|
+
elsif Gosu.button_down?(Gosu::KB_RIGHT) && @move_with_cursors_right
|
8
|
+
add_force(Coordinates.right * @speed)
|
9
|
+
elsif Gosu.button_down?(Gosu::KB_LEFT) && @move_with_cursors_left
|
10
|
+
add_force(Coordinates.left * @speed)
|
11
11
|
else
|
12
|
-
@
|
12
|
+
# @velocity.x = 0
|
13
13
|
end
|
14
|
+
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
def move_with_cursors(down: true, up: true, left: true, right: true, jump: false)
|
19
|
+
puts "#{@name}: move_with_cursors(down: #{down}, up: #{up}, left: #{left}, right: #{right}), jump: #{jump}"
|
20
|
+
@move_with_cursors_down = down
|
21
|
+
@move_with_cursors_up = up
|
22
|
+
@move_with_cursors_left = left
|
23
|
+
@move_with_cursors_right = right
|
24
|
+
@move_with_cursors_jump = jump
|
14
25
|
end
|
15
26
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Mover
|
2
|
+
def add_force(force)
|
3
|
+
@acceleration ||= Coordinates.zero
|
4
|
+
@acceleration += force
|
5
|
+
end
|
6
|
+
|
7
|
+
def apply_forces(max_speed:)
|
8
|
+
@acceleration ||= Coordinates.zero
|
9
|
+
@velocity ||= Coordinates.zero
|
10
|
+
|
11
|
+
@velocity += @acceleration
|
12
|
+
|
13
|
+
unless @velocity.length.zero?
|
14
|
+
@velocity = @velocity.normalize * max_speed * Global.frame_time
|
15
|
+
@position += @velocity
|
16
|
+
end
|
17
|
+
|
18
|
+
@acceleration = Coordinates.zero
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Music
|
2
|
+
class << self
|
3
|
+
@@musics = {}
|
4
|
+
@@actual_song = nil
|
5
|
+
|
6
|
+
def play(music_name)
|
7
|
+
stop
|
8
|
+
|
9
|
+
@@actual_song = locate_music(music_name)
|
10
|
+
@@actual_song.play(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
def stop
|
14
|
+
@@actual_song.stop unless @@actual_song.nil?
|
15
|
+
end
|
16
|
+
|
17
|
+
def volume
|
18
|
+
@@actual_song&.volume
|
19
|
+
end
|
20
|
+
|
21
|
+
def volume=(value)
|
22
|
+
@@actual_song.volume = value unless @@actual_song.nil?
|
23
|
+
end
|
24
|
+
|
25
|
+
def locate_music(music_name)
|
26
|
+
return @@musics[music_name] if @@musics[music_name]
|
27
|
+
|
28
|
+
puts "Initialize Music: '#{music_name}'"
|
29
|
+
|
30
|
+
file_name = Dir.entries(base_path).find { |e| e =~ /^#{music_name}($|\.)/ }
|
31
|
+
|
32
|
+
raise "Music file not found with name '#{music_name}'" if file_name.nil?
|
33
|
+
|
34
|
+
@@musics[music_name] = Gosu::Song.new("#{base_path}/#{file_name}")
|
35
|
+
|
36
|
+
return @@musics[music_name]
|
37
|
+
end
|
38
|
+
|
39
|
+
def preload_musics
|
40
|
+
Dir.each_child(base_path) do |file_name|
|
41
|
+
locate_music(file_name) unless file_name.start_with?(".")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def base_path
|
46
|
+
"#{Dir.pwd}/musics"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/fantasy/version.rb
CHANGED
data/lib/fantasy.rb
CHANGED
@@ -2,12 +2,17 @@
|
|
2
2
|
require "gosu"
|
3
3
|
|
4
4
|
require_relative "fantasy/version"
|
5
|
+
|
6
|
+
require_relative "fantasy/coordinates"
|
5
7
|
require_relative "fantasy/includes/move_by_cursors"
|
8
|
+
require_relative "fantasy/includes/move_by_direction"
|
9
|
+
require_relative "fantasy/includes/mover"
|
10
|
+
require_relative "fantasy/includes/gravitier"
|
11
|
+
require_relative "fantasy/includes/jumper"
|
6
12
|
require_relative "fantasy/tween"
|
7
13
|
require_relative "fantasy/draggable"
|
8
14
|
require_relative "fantasy/color"
|
9
15
|
require_relative "fantasy/actor"
|
10
|
-
require_relative "fantasy/coordinates"
|
11
16
|
require_relative "fantasy/utils"
|
12
17
|
require_relative "fantasy/global"
|
13
18
|
require_relative "fantasy/clock"
|
@@ -16,6 +21,7 @@ require_relative "fantasy/hud_text"
|
|
16
21
|
require_relative "fantasy/hud_image"
|
17
22
|
require_relative "fantasy/background"
|
18
23
|
require_relative "fantasy/sound"
|
24
|
+
require_relative "fantasy/music"
|
19
25
|
require_relative "fantasy/camera"
|
20
26
|
require_relative "fantasy/image"
|
21
27
|
require_relative "fantasy/tilemap"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fantasy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fernando Guillen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gosu
|
@@ -69,8 +69,13 @@ files:
|
|
69
69
|
- lib/fantasy/hud_image.rb
|
70
70
|
- lib/fantasy/hud_text.rb
|
71
71
|
- lib/fantasy/image.rb
|
72
|
+
- lib/fantasy/includes/gravitier.rb
|
73
|
+
- lib/fantasy/includes/jumper.rb
|
72
74
|
- lib/fantasy/includes/move_by_cursors.rb
|
75
|
+
- lib/fantasy/includes/move_by_direction.rb
|
76
|
+
- lib/fantasy/includes/mover.rb
|
73
77
|
- lib/fantasy/loop.rb
|
78
|
+
- lib/fantasy/music.rb
|
74
79
|
- lib/fantasy/sound.rb
|
75
80
|
- lib/fantasy/tilemap.rb
|
76
81
|
- lib/fantasy/tween.rb
|