fantasy 0.1.5.1 → 0.1.11

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 58bcb1e825d5cdf5185a26d5bd1dd972fb585ddeefa8fab964984e4ddd975584
4
- data.tar.gz: eea7d4e258d2a3f949b97b187fd540e9e7702515fcac381c5ae53b244f06c546
3
+ metadata.gz: fb68d8561352d746b2ccdbec94196c568436a0164619f325f0762c200d9d4a71
4
+ data.tar.gz: a11a5b19442edc60fc11d3c803ec40df543c9f1a176f7f7d6a3b11ad4dcf2eed
5
5
  SHA512:
6
- metadata.gz: 9a4ec479708e117036d068ddcf3c5f33f0338a85e324ca7708bd1922c41c632804e90733fea5c3d2dc258f2d00e2b8fbf37e30d4cf4e0afec70e663af2125319
7
- data.tar.gz: 2beeb1fdb476866e25db35ee12559c7571656e07a0ab9c112d832ec1a0fdffa520f471fc4054bc67a4e14154f445aa9e9b8d5e889d988f64920f04931c53bb01
6
+ metadata.gz: e705ad65f134cf775e3bf2ef847643bbd8a2efcc49630837f555f57df019573c9356190db394cddb647ed95420441ea0ce8d42099ba43f006c89e05b63452fa9
7
+ data.tar.gz: c6e6506581053c11940b0fd3bed2205ae4b003a2efd35016a84e04640cc75ad9300a8276ff8562ec8f33eba229b3017c7ba4f38306d165271d637e7c0e51b66a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
- ## [Unreleased]
1
+ ## [0.1.11] - 2022-03-26
2
+
3
+ - Better jumping and gravity physics
4
+ - Support Shape.rectangle
5
+ - Support on_click callback on Shapes and Actors
6
+ - Support on_cursor_* callbacks on Shapes and Actors
7
+ - Support Color.palette with 150 colors + transparent
8
+
9
+
10
+ ## [0.1.9] - 2022-03-25
11
+
12
+ - Adding platformer support
13
+ - Jump
14
+ - Gravity
15
+ - Music background support
16
+
17
+
18
+ ## [0.1.7] - 2022-03-17
19
+
20
+ - HudText accepts alignment property. Valid values: 'top-left, top-right, center'
21
+
22
+
23
+ ## [0.1.5] - 2022-03-16
24
+
25
+ - Background color or image
26
+ - Tilemap
27
+ - Camera can be controlled by cursors
28
+ - Background image can be replicable
29
+
2
30
 
3
31
  ## [0.1.0] - 2022-03-11
4
32
 
5
33
  - Initial release
34
+
35
+
36
+ ## [Unreleased]
data/COLOR_PALETTE.md ADDED
@@ -0,0 +1,159 @@
1
+ # Color.palette
2
+
3
+ ```ruby
4
+ Color.palette.orange
5
+ Color.palette.crimson
6
+ Color.palette.transparent
7
+ [...]
8
+ ```
9
+
10
+ - ![orange](https://via.placeholder.com/150x50/ffa500/000000?text=+) orange
11
+ - ![red](https://via.placeholder.com/150x50/ff0000/000000?text=+) red
12
+ - ![orange_red](https://via.placeholder.com/150x50/ff4500/000000?text=+) orange_red
13
+ - ![tomato](https://via.placeholder.com/150x50/ff6347/000000?text=+) tomato
14
+ - ![dark_red](https://via.placeholder.com/150x50/8b0000/000000?text=+) dark_red
15
+ - ![fire_brick](https://via.placeholder.com/150x50/b22222/000000?text=+) fire_brick
16
+ - ![crimson](https://via.placeholder.com/150x50/dc143c/000000?text=+) crimson
17
+ - ![deep_pink](https://via.placeholder.com/150x50/ff1493/000000?text=+) deep_pink
18
+ - ![maroon](https://via.placeholder.com/150x50/b03060/000000?text=+) maroon
19
+ - ![indian_red](https://via.placeholder.com/150x50/cd5c5c/000000?text=+) indian_red
20
+ - ![medium_violet_red](https://via.placeholder.com/150x50/c71585/000000?text=+) medium_violet_red
21
+ - ![violet_red](https://via.placeholder.com/150x50/d02090/000000?text=+) violet_red
22
+ - ![light_coral](https://via.placeholder.com/150x50/f08080/000000?text=+) light_coral
23
+ - ![hot_pink](https://via.placeholder.com/150x50/ff69b4/000000?text=+) hot_pink
24
+ - ![pale_violet_red](https://via.placeholder.com/150x50/db7093/000000?text=+) pale_violet_red
25
+ - ![light_pink](https://via.placeholder.com/150x50/ffb6c1/000000?text=+) light_pink
26
+ - ![rosy_brown](https://via.placeholder.com/150x50/bc8f8f/000000?text=+) rosy_brown
27
+ - ![pink](https://via.placeholder.com/150x50/ffc0cb/000000?text=+) pink
28
+ - ![orchid](https://via.placeholder.com/150x50/da70d6/000000?text=+) orchid
29
+ - ![lavender_blush](https://via.placeholder.com/150x50/fff0f5/000000?text=+) lavender_blush
30
+ - ![snow](https://via.placeholder.com/150x50/fffafa/000000?text=+) snow
31
+ - ![chocolate](https://via.placeholder.com/150x50/d2691e/000000?text=+) chocolate
32
+ - ![saddle_brown](https://via.placeholder.com/150x50/8b4513/000000?text=+) saddle_brown
33
+ - ![brown](https://via.placeholder.com/150x50/843c24/000000?text=+) brown
34
+ - ![dark_orange](https://via.placeholder.com/150x50/ff8c00/000000?text=+) dark_orange
35
+ - ![coral](https://via.placeholder.com/150x50/ff7f50/000000?text=+) coral
36
+ - ![sienna](https://via.placeholder.com/150x50/a0522d/000000?text=+) sienna
37
+ - ![salmon](https://via.placeholder.com/150x50/fa8072/000000?text=+) salmon
38
+ - ![peru](https://via.placeholder.com/150x50/cd853f/000000?text=+) peru
39
+ - ![dark_goldenrod](https://via.placeholder.com/150x50/b8860b/000000?text=+) dark_goldenrod
40
+ - ![goldenrod](https://via.placeholder.com/150x50/daa520/000000?text=+) goldenrod
41
+ - ![sandy_brown](https://via.placeholder.com/150x50/f4a460/000000?text=+) sandy_brown
42
+ - ![light_salmon](https://via.placeholder.com/150x50/ffa07a/000000?text=+) light_salmon
43
+ - ![dark_salmon](https://via.placeholder.com/150x50/e9967a/000000?text=+) dark_salmon
44
+ - ![gold](https://via.placeholder.com/150x50/ffd700/000000?text=+) gold
45
+ - ![yellow](https://via.placeholder.com/150x50/ffff00/000000?text=+) yellow
46
+ - ![olive](https://via.placeholder.com/150x50/808000/000000?text=+) olive
47
+ - ![burlywood](https://via.placeholder.com/150x50/deb887/000000?text=+) burlywood
48
+ - ![tan](https://via.placeholder.com/150x50/d2b48c/000000?text=+) tan
49
+ - ![navajo_white](https://via.placeholder.com/150x50/ffdead/000000?text=+) navajo_white
50
+ - ![peach_puff](https://via.placeholder.com/150x50/ffdab9/000000?text=+) peach_puff
51
+ - ![khaki](https://via.placeholder.com/150x50/f0e68c/000000?text=+) khaki
52
+ - ![dark_khaki](https://via.placeholder.com/150x50/bdb76b/000000?text=+) dark_khaki
53
+ - ![moccasin](https://via.placeholder.com/150x50/ffe4b5/000000?text=+) moccasin
54
+ - ![wheat](https://via.placeholder.com/150x50/f5deb3/000000?text=+) wheat
55
+ - ![bisque](https://via.placeholder.com/150x50/ffe4c4/000000?text=+) bisque
56
+ - ![pale_goldenrod](https://via.placeholder.com/150x50/eee8aa/000000?text=+) pale_goldenrod
57
+ - ![blanched_almond](https://via.placeholder.com/150x50/ffebcd/000000?text=+) blanched_almond
58
+ - ![medium_goldenrod](https://via.placeholder.com/150x50/eaeaad/000000?text=+) medium_goldenrod
59
+ - ![papaya_whip](https://via.placeholder.com/150x50/ffefd5/000000?text=+) papaya_whip
60
+ - ![misty_rose](https://via.placeholder.com/150x50/ffe4e1/000000?text=+) misty_rose
61
+ - ![lemon_chiffon](https://via.placeholder.com/150x50/fffacd/000000?text=+) lemon_chiffon
62
+ - ![antique_white](https://via.placeholder.com/150x50/faebd7/000000?text=+) antique_white
63
+ - ![cornsilk](https://via.placeholder.com/150x50/fff8dc/000000?text=+) cornsilk
64
+ - ![light_goldenrod_yellow](https://via.placeholder.com/150x50/fafad2/000000?text=+) light_goldenrod_yellow
65
+ - ![old_lace](https://via.placeholder.com/150x50/fdf5e6/000000?text=+) old_lace
66
+ - ![linen](https://via.placeholder.com/150x50/faf0e6/000000?text=+) linen
67
+ - ![light_yellow](https://via.placeholder.com/150x50/ffffe0/000000?text=+) light_yellow
68
+ - ![seashell](https://via.placeholder.com/150x50/fff5ee/000000?text=+) seashell
69
+ - ![beige](https://via.placeholder.com/150x50/f5f5dc/000000?text=+) beige
70
+ - ![floral_white](https://via.placeholder.com/150x50/fffaf0/000000?text=+) floral_white
71
+ - ![ivory](https://via.placeholder.com/150x50/fffff0/000000?text=+) ivory
72
+ - ![green](https://via.placeholder.com/150x50/00ff00/000000?text=+) green
73
+ - ![lawn_green](https://via.placeholder.com/150x50/7cfc00/000000?text=+) lawn_green
74
+ - ![chartreuse](https://via.placeholder.com/150x50/7fff00/000000?text=+) chartreuse
75
+ - ![green_yellow](https://via.placeholder.com/150x50/adff2f/000000?text=+) green_yellow
76
+ - ![yellow_green](https://via.placeholder.com/150x50/9acd32/000000?text=+) yellow_green
77
+ - ![medium_forest_green](https://via.placeholder.com/150x50/6b8e23/000000?text=+) medium_forest_green
78
+ - ![olive_drab](https://via.placeholder.com/150x50/6b8e23/000000?text=+) olive_drab
79
+ - ![dark_olive_green](https://via.placeholder.com/150x50/556b2f/000000?text=+) dark_olive_green
80
+ - ![dark_sea_green](https://via.placeholder.com/150x50/8fbc8b/000000?text=+) dark_sea_green
81
+ - ![lime](https://via.placeholder.com/150x50/00ff00/000000?text=+) lime
82
+ - ![dark_green](https://via.placeholder.com/150x50/006400/000000?text=+) dark_green
83
+ - ![lime_green](https://via.placeholder.com/150x50/32cd32/000000?text=+) lime_green
84
+ - ![forest_green](https://via.placeholder.com/150x50/228b22/000000?text=+) forest_green
85
+ - ![spring_green](https://via.placeholder.com/150x50/00ff7f/000000?text=+) spring_green
86
+ - ![medium_spring_green](https://via.placeholder.com/150x50/00fa9a/000000?text=+) medium_spring_green
87
+ - ![sea_green](https://via.placeholder.com/150x50/2e8b57/000000?text=+) sea_green
88
+ - ![medium_sea_green](https://via.placeholder.com/150x50/3cb371/000000?text=+) medium_sea_green
89
+ - ![aquamarine](https://via.placeholder.com/150x50/70d890/000000?text=+) aquamarine
90
+ - ![light_green](https://via.placeholder.com/150x50/90ee90/000000?text=+) light_green
91
+ - ![pale_green](https://via.placeholder.com/150x50/98fb98/000000?text=+) pale_green
92
+ - ![medium_aquamarine](https://via.placeholder.com/150x50/66cdaa/000000?text=+) medium_aquamarine
93
+ - ![turquoise](https://via.placeholder.com/150x50/40e0d0/000000?text=+) turquoise
94
+ - ![light_sea_green](https://via.placeholder.com/150x50/20b2aa/000000?text=+) light_sea_green
95
+ - ![medium_turquoise](https://via.placeholder.com/150x50/48d1cc/000000?text=+) medium_turquoise
96
+ - ![honeydew](https://via.placeholder.com/150x50/f0fff0/000000?text=+) honeydew
97
+ - ![mint_cream](https://via.placeholder.com/150x50/f5fffa/000000?text=+) mint_cream
98
+ - ![royal_blue](https://via.placeholder.com/150x50/4169e1/000000?text=+) royal_blue
99
+ - ![dodger_blue](https://via.placeholder.com/150x50/1e90ff/000000?text=+) dodger_blue
100
+ - ![deep_sky_blue](https://via.placeholder.com/150x50/00bfff/000000?text=+) deep_sky_blue
101
+ - ![cornflower_blue](https://via.placeholder.com/150x50/6495ed/000000?text=+) cornflower_blue
102
+ - ![steel_blue](https://via.placeholder.com/150x50/4682b4/000000?text=+) steel_blue
103
+ - ![light_sky_blue](https://via.placeholder.com/150x50/87cefa/000000?text=+) light_sky_blue
104
+ - ![dark_turquoise](https://via.placeholder.com/150x50/00ced1/000000?text=+) dark_turquoise
105
+ - ![cyan](https://via.placeholder.com/150x50/00ffff/000000?text=+) cyan
106
+ - ![aqua](https://via.placeholder.com/150x50/00ffff/000000?text=+) aqua
107
+ - ![dark_cyan](https://via.placeholder.com/150x50/008b8b/000000?text=+) dark_cyan
108
+ - ![teal](https://via.placeholder.com/150x50/008080/000000?text=+) teal
109
+ - ![sky_blue](https://via.placeholder.com/150x50/87ceeb/000000?text=+) sky_blue
110
+ - ![cadet_blue](https://via.placeholder.com/150x50/5f9ea0/000000?text=+) cadet_blue
111
+ - ![dark_slate_gray](https://via.placeholder.com/150x50/2f4f4f/000000?text=+) dark_slate_gray
112
+ - ![dark_slate_grey](https://via.placeholder.com/150x50/2f4f4f/000000?text=+) dark_slate_grey
113
+ - ![light_slate_gray](https://via.placeholder.com/150x50/778899/000000?text=+) light_slate_gray
114
+ - ![light_slate_grey](https://via.placeholder.com/150x50/778899/000000?text=+) light_slate_grey
115
+ - ![slate_gray](https://via.placeholder.com/150x50/708090/000000?text=+) slate_gray
116
+ - ![slate_grey](https://via.placeholder.com/150x50/708090/000000?text=+) slate_grey
117
+ - ![light_steel_blue](https://via.placeholder.com/150x50/b0c4de/000000?text=+) light_steel_blue
118
+ - ![light_blue](https://via.placeholder.com/150x50/add8e6/000000?text=+) light_blue
119
+ - ![powder_blue](https://via.placeholder.com/150x50/b0e0e6/000000?text=+) powder_blue
120
+ - ![pale_turquoise](https://via.placeholder.com/150x50/afeeee/000000?text=+) pale_turquoise
121
+ - ![light_cyan](https://via.placeholder.com/150x50/e0ffff/000000?text=+) light_cyan
122
+ - ![alice_blue](https://via.placeholder.com/150x50/f0f8ff/000000?text=+) alice_blue
123
+ - ![azure](https://via.placeholder.com/150x50/f0ffff/000000?text=+) azure
124
+ - ![medium_blue](https://via.placeholder.com/150x50/0000cd/000000?text=+) medium_blue
125
+ - ![dark_blue](https://via.placeholder.com/150x50/00008b/000000?text=+) dark_blue
126
+ - ![midnight_blue](https://via.placeholder.com/150x50/191970/000000?text=+) midnight_blue
127
+ - ![navy](https://via.placeholder.com/150x50/24248c/000000?text=+) navy
128
+ - ![blue](https://via.placeholder.com/150x50/0000ff/000000?text=+) blue
129
+ - ![indigo](https://via.placeholder.com/150x50/4b0082/000000?text=+) indigo
130
+ - ![blue_violet](https://via.placeholder.com/150x50/8a2be2/000000?text=+) blue_violet
131
+ - ![medium_slate_blue](https://via.placeholder.com/150x50/7b68ee/000000?text=+) medium_slate_blue
132
+ - ![slate_blue](https://via.placeholder.com/150x50/6a5acd/000000?text=+) slate_blue
133
+ - ![purple](https://via.placeholder.com/150x50/a020f0/000000?text=+) purple
134
+ - ![dark_slate_blue](https://via.placeholder.com/150x50/483d8b/000000?text=+) dark_slate_blue
135
+ - ![dark_violet](https://via.placeholder.com/150x50/9400d3/000000?text=+) dark_violet
136
+ - ![dark_orchid](https://via.placeholder.com/150x50/9932cc/000000?text=+) dark_orchid
137
+ - ![medium_purple](https://via.placeholder.com/150x50/9370db/000000?text=+) medium_purple
138
+ - ![medium_orchid](https://via.placeholder.com/150x50/ba55d3/000000?text=+) medium_orchid
139
+ - ![magenta](https://via.placeholder.com/150x50/ff00ff/000000?text=+) magenta
140
+ - ![fuchsia](https://via.placeholder.com/150x50/ff00ff/000000?text=+) fuchsia
141
+ - ![dark_magenta](https://via.placeholder.com/150x50/8b008b/000000?text=+) dark_magenta
142
+ - ![violet](https://via.placeholder.com/150x50/ee82ee/000000?text=+) violet
143
+ - ![plum](https://via.placeholder.com/150x50/dda0dd/000000?text=+) plum
144
+ - ![lavender](https://via.placeholder.com/150x50/e6e6fa/000000?text=+) lavender
145
+ - ![thistle](https://via.placeholder.com/150x50/d8bfd8/000000?text=+) thistle
146
+ - ![ghost_white](https://via.placeholder.com/150x50/f8f8ff/000000?text=+) ghost_white
147
+ - ![white](https://via.placeholder.com/150x50/ffffff/000000?text=+) white
148
+ - ![white_smoke](https://via.placeholder.com/150x50/f5f5f5/000000?text=+) white_smoke
149
+ - ![gainsboro](https://via.placeholder.com/150x50/dcdcdc/000000?text=+) gainsboro
150
+ - ![light_gray](https://via.placeholder.com/150x50/d3d3d3/000000?text=+) light_gray
151
+ - ![light_grey](https://via.placeholder.com/150x50/d3d3d3/000000?text=+) light_grey
152
+ - ![silver](https://via.placeholder.com/150x50/c0c0c0/000000?text=+) silver
153
+ - ![gray](https://via.placeholder.com/150x50/bebebe/000000?text=+) gray
154
+ - ![grey](https://via.placeholder.com/150x50/bebebe/000000?text=+) grey
155
+ - ![dark_gray](https://via.placeholder.com/150x50/a9a9a9/000000?text=+) dark_gray
156
+ - ![dark_grey](https://via.placeholder.com/150x50/a9a9a9/000000?text=+) dark_grey
157
+ - ![dim_gray](https://via.placeholder.com/150x50/696969/000000?text=+) dim_gray
158
+ - ![dim_grey](https://via.placeholder.com/150x50/696969/000000?text=+) dim_grey
159
+ - ![black](https://via.placeholder.com/150x50/000000/000000?text=+) black
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 (TODO)
121
- - Gravity (TODO)
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
 
@@ -181,9 +182,9 @@ Actors in the game will be rendered in the relative position to this camera.
181
182
  - Allow camera move
182
183
  - Easy to follow one actor
183
184
 
184
- ### Colors palette (TODO)
185
+ ### Colors palette
185
186
 
186
- - Not deal with RGB or anything, just a list of colors (TODO)
187
+ - Not deal with RGB or anything, just a list of colors. See [Color.palette](COLOR_PALETTE.md)
187
188
 
188
189
 
189
190
  ### Pause Game (TODO)
@@ -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
 
@@ -219,12 +222,13 @@ Easy access to keyboard and mouse inputs on any part of the code. Specially in t
219
222
  - Remove "on_space_bar" when changing scene (TODO)
220
223
  - Detect when key/mouse button is pressed in the actual frame in any part of the code (TODO)
221
224
 
222
- ### Tile Map (TODO)
225
+ ### Tilemap (TODO)
223
226
 
224
227
  For easy creation of:
225
228
 
226
- - Top-down map levels (TODO)
229
+ - Top-down map levels
227
230
  - Platformer map levels (TODO)
231
+ - Allow specific map keys like a=>actor_1, b=>actor_2 (TODO)
228
232
 
229
233
  ### Tweens (TODO)
230
234
 
@@ -301,6 +305,7 @@ player.solid = true
301
305
  player.speed = 200
302
306
  player.layer = 1
303
307
  player.move_with_cursors
308
+ player.collision_with = ["enemy", "bullets"] # default "all"
304
309
 
305
310
  player.on_collision do |other|
306
311
  if other.name == "enemy"
@@ -330,6 +335,7 @@ class Player < Actor
330
335
  @speed = 200
331
336
  @layer = 1
332
337
  @direction = Coordinates.zero
338
+ @collision_with = ["enemy", "bullets"] # default "all"
333
339
  move_with_cursors
334
340
  end
335
341
 
@@ -351,6 +357,25 @@ class Player < Actor
351
357
  end
352
358
  ```
353
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_jumping do
370
+ Sound.play("jump")
371
+ player.image = "warrior_jump")
372
+ end
373
+
374
+ player.on_floor do
375
+ player.image = "warrior")
376
+ end
377
+ ```
378
+
354
379
  ### Clock
355
380
 
356
381
  ```ruby
@@ -397,18 +422,43 @@ end
397
422
 
398
423
  ### Sound
399
424
 
425
+ Plays only once:
426
+
400
427
  ```ruby
401
428
  Sound.play("shoot") # ./sounds/shoot.wav
402
429
  ```
403
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
+ ```
404
453
 
405
454
  ### UI
406
455
 
407
456
  #### HUD Text
408
457
 
409
458
  ```ruby
410
- timer = HudText.new(position: Coordinates.new(20, 10))
459
+ timer = HudText.new(position: Coordinates.new(SCREEN_WIDTH / 2, 10))
411
460
  timer.text = 0
461
+ timer.alignment = "center"
412
462
  timer.size = "big"
413
463
 
414
464
  Clock.new { timer.text += 1 }.repeat(seconds: 1)
data/lib/fantasy/actor.rb CHANGED
@@ -1,26 +1,41 @@
1
1
  class Actor
2
2
  include MoveByCursor
3
+ include MoveByDirection
4
+ include Mover
5
+ include Gravitier
6
+ include Jumper
7
+ include UserInputs
3
8
 
4
9
  attr_reader :image, :moving_with_cursors
5
- attr_accessor :image_name, :position, :direction, :speed, :solid, :scale, :name, :layer
10
+ attr_accessor :image_name, :position, :direction, :speed, :jump_force, :gravity, :solid, :scale, :name, :layer
11
+ attr_accessor :collision_with
6
12
 
7
13
  def initialize(image_name)
8
14
  @image_name = image_name
9
15
  @image = Image.new(image_name)
10
16
  @name = image_name
11
- @position = Coordinates.new(0, 0)
12
- @direction = Coordinates.new(0, 0)
17
+ @position = Coordinates.zero
18
+ @direction = Coordinates.zero
13
19
  @speed = 0
14
20
  @scale = 1
15
- @on_after_move_callback = nil
21
+
16
22
  @moving_with_cursors = false
17
23
  @solid = false
18
24
  @draggable_on_debug = true
19
25
  @dragging = false
20
26
  @dragging_offset = nil
21
27
  @layer = 0
28
+ @gravity = 0
29
+ @jump_force = 0
30
+ @collision_with = "all"
22
31
 
32
+ @on_floor = false
33
+
34
+ @on_after_move_callback = nil
23
35
  @on_collision_callback = nil
36
+ @on_destroy_callback = nil
37
+ @on_jumping_callback = nil
38
+ @on_floor_callback = nil
24
39
 
25
40
  Global.actors << self
26
41
  end
@@ -30,20 +45,16 @@ class Actor
30
45
  end
31
46
 
32
47
  def width
33
- @image.width() * @scale
48
+ @image.width * @scale
34
49
  end
35
50
 
36
51
  def height
37
- @image.height() * @scale
38
- end
39
-
40
- def move_with_cursors
41
- @moving_with_cursors = true
52
+ @image.height * @scale
42
53
  end
43
54
 
44
55
  def direction=(value)
45
56
  @direction = value
46
- @direction = @direction.normalize
57
+ @direction = @direction.normalize unless @direction.zero?
47
58
  end
48
59
 
49
60
  def draw
@@ -54,13 +65,32 @@ class Actor
54
65
 
55
66
  def draw_debug
56
67
  Utils.draw_frame(position_in_camera.x, position_in_camera.y, width, height, 1, Gosu::Color::RED) if solid
57
- Global.pixel_font.draw_text("#{@position.x.floor},#{@position.y.floor}", position_in_camera.x, position_in_camera.y - 20, 1)
68
+ Global.pixel_fonts["medium"].draw_text("#{@position.x.floor},#{@position.y.floor}", position_in_camera.x, position_in_camera.y - 20, 1)
58
69
  end
59
70
 
60
71
  def position_in_camera
61
72
  @position - Global.camera.position
62
73
  end
63
74
 
75
+ # TODO: make this work optimized
76
+ # def position_top_left
77
+ # @position - position_delta
78
+ # end
79
+
80
+ # def position_delta
81
+ # case @alignment
82
+ # when "top-left"
83
+ # Coordinates.zero
84
+ # when "center"
85
+ # Coordinates.new(width/2, height/2)
86
+ # else
87
+ # raise "Actor.alignment value not valid '#{@alignment}'. Valid values: 'top-left, center'"
88
+ # end
89
+ # end
90
+
91
+ # TODO: I made more of this code while I was with Covid
92
+ # It looks horrible and it is crap
93
+ # I'll improve it some day :)
64
94
  def move
65
95
  mouse_position = Global.mouse_position + Global.camera.position
66
96
 
@@ -76,30 +106,91 @@ class Actor
76
106
  if @dragging
77
107
  @position = mouse_position - @dragging_offset
78
108
  else
79
- calculate_direction_by_cursors if @moving_with_cursors
109
+ # Direction moving
110
+ unless @direction.zero?
111
+ last_position = @position
112
+ move_by_direction
113
+
114
+ # Check collision after cursor moving
115
+ if @solid && @position != last_position
116
+ manage_collisions(last_position)
117
+ end
118
+ end
80
119
 
81
- if @direction != Coordinates.zero && !@speed.zero?
82
- @last_position = @position
83
- @position = @position + (@direction * @speed * Global.frame_time)
120
+ # Cursors moving
121
+ last_position = @position
122
+ move_by_cursors
84
123
 
85
- if solid?
86
- collisions.each do |actor|
87
- collision_with(actor)
88
- actor.collision_with(self)
89
- end
124
+ # Check collision after cursor moving
125
+ if @solid && @position != last_position
126
+ manage_collisions(last_position)
127
+ end
90
128
 
91
- @position = @last_position if collisions.any? # we don't cache collisions because position may be changed on collision callback
92
- end
129
+ # # Jump moving
130
+ # unless @jump_force.zero?
131
+ # last_position = @position
132
+ # add_force_by_jump
133
+ # apply_forces(max_speed: @jump_speed || @jump_force)
134
+
135
+ # # Check collision after jump moving
136
+ # if @solid && @position != last_position
137
+ # if manage_collisions(last_position)
138
+ # @jumping = false
139
+ # end
140
+ # end
141
+ # end
142
+
143
+ # Gravity force
144
+ if !@gravity.zero?
145
+ add_force_by_gravity
146
+ end
147
+
148
+ # Apply forces
149
+ last_position = @position
150
+ apply_forces(max_speed: @speed)
151
+
152
+ # Check collision after gravity moving
153
+ if @solid && @position != last_position
154
+ @on_floor = false
155
+ manage_collisions(last_position)
93
156
  end
94
157
  end
95
158
 
96
- @on_after_move_callback.call unless @on_after_move_callback.nil?
159
+ on_after_move_do
160
+ end
161
+
162
+ def manage_collisions(last_position)
163
+ collisions.each do |other|
164
+ on_collision_do(other)
165
+ other.on_collision_do(self)
166
+
167
+ if other.position.y > (last_position.y + height)
168
+ on_floor_do unless @on_floor
169
+
170
+ @on_floor = true
171
+ @jumping = false
172
+ @velocity.y = 0
173
+ end
174
+
175
+ if other.position.y + other.height < last_position.y
176
+ @velocity.y = 0
177
+ end
178
+ end
179
+
180
+ if collisions.any? # we don't cache collisions because position may be changed on collision callback
181
+ @position = last_position
182
+
183
+ return true
184
+ end
185
+
186
+ false
97
187
  end
98
188
 
99
189
  def solid?
100
190
  @solid
101
191
  end
102
192
 
193
+ # Set callbacks
103
194
  def on_after_move(&block)
104
195
  @on_after_move_callback = block
105
196
  end
@@ -112,18 +203,50 @@ class Actor
112
203
  @on_destroy_callback = block
113
204
  end
114
205
 
115
- def collision_with(actor)
116
- @on_collision_callback.call(actor) unless @on_collision_callback.nil?
206
+ def on_jumping(&block)
207
+ @on_jumping_callback = block
117
208
  end
118
209
 
210
+ def on_floor(&block)
211
+ @on_floor_callback = block
212
+ end
213
+
214
+
215
+ # Execute callbacks
216
+ def on_after_move_do
217
+ instance_exec(&@on_after_move_callback) unless @on_after_move_callback.nil?
218
+ end
219
+
220
+ def on_collision_do(other)
221
+ instance_exec(other, &@on_collision_callback) unless @on_collision_callback.nil?
222
+ end
223
+
224
+ def on_destroy_do
225
+ instance_exec(&@on_destroy_callback) unless @on_destroy_callback.nil?
226
+ end
227
+
228
+ def on_jumping_do
229
+ instance_exec(&@on_jumping_callback) unless @on_jumping_callback.nil?
230
+ end
231
+
232
+ def on_floor_do
233
+ instance_exec(&@on_floor_callback) unless @on_floor_callback.nil?
234
+ end
235
+
236
+
119
237
  def collisions
120
- Global.actors.reject { |e| e == self }.select { |e| e.solid? }.select do |actor|
121
- Utils.collision? self, actor
238
+ Global.actors.reject { |e| e == self }.select { |e| e.solid? }.select do |other|
239
+ if(
240
+ (@collision_with == "all" || @collision_with.include?(other.name)) &&
241
+ (other.collision_with == "all" || other.collision_with.include?(self.name))
242
+ )
243
+ Utils.collision? self, other
244
+ end
122
245
  end
123
246
  end
124
247
 
125
248
  def destroy
126
- @on_destroy_callback.call unless @on_destroy_callback.nil?
249
+ on_destroy_do
127
250
  Global.actors.delete(self)
128
251
  end
129
252
 
@@ -133,30 +256,37 @@ class Actor
133
256
  actor.name = @name
134
257
  actor.position = @position.clone
135
258
  actor.direction = @direction.clone
259
+
136
260
  actor.speed = @speed
137
261
  actor.scale = @scale
138
262
  actor.moving_with_cursors if @moving_with_cursors
139
263
  actor.solid = @solid
140
264
  actor.layer = @layer
265
+ actor.gravity = @gravity
266
+ actor.jump_force = @jump_force
267
+ actor.collision_with = @collision_with
141
268
 
142
269
  actor.on_after_move_callback = @on_after_move_callback
143
270
  actor.on_collision_callback = @on_collision_callback
144
271
  actor.on_destroy_callback = @on_destroy_callback
272
+ actor.on_jumping_callback = @on_jumping_callback
273
+ actor.on_floor_callback = @on_floor_callback
145
274
 
146
- actor
147
- end
275
+ actor.on_cursor_down_callback = @on_cursor_down_callback
276
+ actor.on_cursor_up_callback = @on_cursor_up_callback
277
+ actor.on_cursor_left_callback = @on_cursor_left_callback
278
+ actor.on_cursor_right_callback = @on_cursor_right_callback
279
+ actor.on_space_bar_callback = @on_space_bar_callback
280
+ actor.on_mouse_button_left_callback = @on_mouse_button_left_callback
148
281
 
149
- protected
282
+ actor.on_click_callback = @on_click_callback
150
283
 
151
- def on_after_move_callback=(block)
152
- @on_after_move_callback = block
284
+ actor
153
285
  end
154
286
 
155
- def on_collision_callback=(block)
156
- @on_collision_callback = block
157
- end
287
+ protected
158
288
 
159
- def on_destroy_callback=(block)
160
- @on_destroy_callback = block
161
- end
289
+ attr_accessor :on_after_move_callback, :on_collision_callback, :on_destroy_callback, :on_jumping_callback, :on_floor_callback
290
+ attr_accessor :on_cursor_down_callback, :on_cursor_up_callback, :on_cursor_left_callback, :on_cursor_right_callback, :on_space_bar_callback, :on_mouse_button_left_callback
291
+ attr_accessor :on_click_callback
162
292
  end
data/lib/fantasy/clock.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  class Clock
2
2
  attr_accessor :persistent
3
+ attr_reader :thread
3
4
 
4
5
  def initialize(&block)
5
6
  @block = block