summaryrefslogtreecommitdiffhomepage
path: root/samples/99_genre_mario
diff options
context:
space:
mode:
author_Tradam <[email protected]>2021-12-16 19:22:26 -0500
committerGitHub <[email protected]>2021-12-16 19:22:26 -0500
commit5954b9beb4d4a3b4f248d72d1851195f030558a8 (patch)
treefecd8aa840a25afdb502915b0fdb4d03b7ed339a /samples/99_genre_mario
parent2f845281f133849256b57bb08fd3e9ae57600784 (diff)
parenteaa29e72939f5edf61735ccbb73c36ee89369f65 (diff)
downloaddragonruby-game-toolkit-contrib-master.tar.gz
dragonruby-game-toolkit-contrib-master.zip
Merge branch 'DragonRuby:master' into masterHEADmaster
Diffstat (limited to 'samples/99_genre_mario')
-rw-r--r--samples/99_genre_mario/01_jumping/app/main.rb78
-rw-r--r--samples/99_genre_mario/01_jumping/replay.txt52
-rw-r--r--samples/99_genre_mario/01_jumping/sprites/square/red.pngbin0 -> 335 bytes
-rw-r--r--samples/99_genre_mario/02_jumping_and_collisions/app/main.rb281
-rw-r--r--samples/99_genre_mario/02_jumping_and_collisions/replay.txt159
-rw-r--r--samples/99_genre_mario/02_jumping_and_collisions/sprites/square/red.pngbin0 -> 335 bytes
-rw-r--r--samples/99_genre_mario/02_jumping_and_collisions/sprites/square/white.pngbin0 -> 325 bytes
7 files changed, 570 insertions, 0 deletions
diff --git a/samples/99_genre_mario/01_jumping/app/main.rb b/samples/99_genre_mario/01_jumping/app/main.rb
new file mode 100644
index 0000000..2d12a22
--- /dev/null
+++ b/samples/99_genre_mario/01_jumping/app/main.rb
@@ -0,0 +1,78 @@
+def tick args
+ defaults args
+ render args
+ input args
+ calc args
+end
+
+def defaults args
+ args.state.player.x ||= args.grid.w.half
+ args.state.player.y ||= 0
+ args.state.player.size ||= 100
+ args.state.player.dy ||= 0
+ args.state.player.action ||= :jumping
+ args.state.jump.power = 20
+ args.state.jump.increase_frames = 10
+ args.state.jump.increase_power = 1
+ args.state.gravity = -1
+end
+
+def render args
+ args.outputs.sprites << {
+ x: args.state.player.x -
+ args.state.player.size.half,
+ y: args.state.player.y,
+ w: args.state.player.size,
+ h: args.state.player.size,
+ path: 'sprites/square/red.png'
+ }
+end
+
+def input args
+ if args.inputs.keyboard.key_down.space
+ if args.state.player.action == :standing
+ args.state.player.action = :jumping
+ args.state.player.dy = args.state.jump.power
+
+ # record when the action took place
+ current_frame = args.state.tick_count
+ args.state.player.action_at = current_frame
+ end
+ end
+
+ # if the space bar is being held
+ if args.inputs.keyboard.key_held.space
+ # is the player jumping
+ is_jumping = args.state.player.action == :jumping
+
+ # when was the jump performed
+ time_of_jump = args.state.player.action_at
+
+ # how much time has passed since the jump
+ jump_elapsed_time = time_of_jump.elapsed_time
+
+ # how much time is allowed for increasing power
+ time_allowed = args.state.jump.increase_frames
+
+ # if the player is jumping
+ # and the elapsed time is less than
+ # the allowed time
+ if is_jumping && jump_elapsed_time < time_allowed
+ # increase the dy by the increase power
+ power_to_add = args.state.jump.increase_power
+ args.state.player.dy += power_to_add
+ end
+ end
+end
+
+def calc args
+ if args.state.player.action == :jumping
+ args.state.player.y += args.state.player.dy
+ args.state.player.dy += args.state.gravity
+ end
+
+ if args.state.player.y < 0
+ args.state.player.y = 0
+ args.state.player.action = :standing
+ end
+end
diff --git a/samples/99_genre_mario/01_jumping/replay.txt b/samples/99_genre_mario/01_jumping/replay.txt
new file mode 100644
index 0000000..d56d585
--- /dev/null
+++ b/samples/99_genre_mario/01_jumping/replay.txt
@@ -0,0 +1,52 @@
+replay_version 2.0
+stopped_at 574
+seed 100
+recorded_at 2021-11-20 16:44:37 -0600
+[:mouse_button_up, 1, 0, 1, 1, 3]
+[:key_down_raw, 32, 0, 2, 2, 89]
+[:key_up_raw, 32, 0, 2, 3, 92]
+[:key_down_raw, 32, 0, 2, 4, 193]
+[:key_up_raw, 32, 0, 2, 5, 195]
+[:key_down_raw, 32, 0, 2, 6, 258]
+[:key_down_raw, 32, 0, 2, 7, 273]
+[:key_down_raw, 32, 0, 2, 8, 275]
+[:key_down_raw, 32, 0, 2, 9, 277]
+[:key_down_raw, 32, 0, 2, 10, 279]
+[:key_down_raw, 32, 0, 2, 11, 281]
+[:key_down_raw, 32, 0, 2, 12, 283]
+[:key_down_raw, 32, 0, 2, 13, 285]
+[:key_down_raw, 32, 0, 2, 14, 287]
+[:key_down_raw, 32, 0, 2, 15, 289]
+[:key_down_raw, 32, 0, 2, 16, 291]
+[:key_down_raw, 32, 0, 2, 17, 293]
+[:key_down_raw, 32, 0, 2, 18, 295]
+[:key_down_raw, 32, 0, 2, 19, 297]
+[:key_down_raw, 32, 0, 2, 20, 299]
+[:key_down_raw, 32, 0, 2, 21, 301]
+[:key_down_raw, 32, 0, 2, 22, 303]
+[:key_down_raw, 32, 0, 2, 23, 305]
+[:key_down_raw, 32, 0, 2, 24, 307]
+[:key_up_raw, 32, 0, 2, 25, 307]
+[:key_down_raw, 32, 0, 2, 26, 336]
+[:key_up_raw, 32, 0, 2, 27, 339]
+[:key_down_raw, 32, 0, 2, 28, 389]
+[:key_up_raw, 32, 0, 2, 29, 392]
+[:key_down_raw, 32, 0, 2, 30, 444]
+[:key_down_raw, 32, 0, 2, 31, 459]
+[:key_down_raw, 32, 0, 2, 32, 461]
+[:key_down_raw, 32, 0, 2, 33, 463]
+[:key_down_raw, 32, 0, 2, 34, 465]
+[:key_down_raw, 32, 0, 2, 35, 467]
+[:key_down_raw, 32, 0, 2, 36, 469]
+[:key_down_raw, 32, 0, 2, 37, 471]
+[:key_down_raw, 32, 0, 2, 38, 473]
+[:key_down_raw, 32, 0, 2, 39, 475]
+[:key_down_raw, 32, 0, 2, 40, 477]
+[:key_down_raw, 32, 0, 2, 41, 479]
+[:key_down_raw, 32, 0, 2, 42, 481]
+[:key_down_raw, 32, 0, 2, 43, 483]
+[:key_down_raw, 32, 0, 2, 44, 485]
+[:key_up_raw, 32, 0, 2, 45, 485]
+[:key_down_raw, 96, 0, 2, 46, 509]
+[:key_up_raw, 96, 0, 2, 47, 512]
+[:key_down_raw, 13, 0, 2, 48, 574]
diff --git a/samples/99_genre_mario/01_jumping/sprites/square/red.png b/samples/99_genre_mario/01_jumping/sprites/square/red.png
new file mode 100644
index 0000000..a59443e
--- /dev/null
+++ b/samples/99_genre_mario/01_jumping/sprites/square/red.png
Binary files differ
diff --git a/samples/99_genre_mario/02_jumping_and_collisions/app/main.rb b/samples/99_genre_mario/02_jumping_and_collisions/app/main.rb
new file mode 100644
index 0000000..52d9135
--- /dev/null
+++ b/samples/99_genre_mario/02_jumping_and_collisions/app/main.rb
@@ -0,0 +1,281 @@
+class Game
+ attr_gtk
+
+ def tick
+ defaults
+ render
+ input
+ calc
+ end
+
+ def defaults
+ return if state.tick_count != 0
+
+ player.x = 64
+ player.y = 800
+ player.size = 50
+ player.dx = 0
+ player.dy = 0
+ player.action = :falling
+
+ player.max_speed = 20
+ player.jump_power = 15
+ player.jump_air_time = 15
+ player.jump_increase_power = 1
+
+ state.gravity = -1
+ state.drag = 0.001
+ state.tile_size = 64
+ state.tiles ||= [
+ { ordinal_x: 0, ordinal_y: 0 },
+ { ordinal_x: 1, ordinal_y: 0 },
+ { ordinal_x: 2, ordinal_y: 0 },
+ { ordinal_x: 3, ordinal_y: 0 },
+ { ordinal_x: 4, ordinal_y: 0 },
+ { ordinal_x: 5, ordinal_y: 0 },
+ { ordinal_x: 6, ordinal_y: 0 },
+ { ordinal_x: 7, ordinal_y: 0 },
+ { ordinal_x: 8, ordinal_y: 0 },
+ { ordinal_x: 9, ordinal_y: 0 },
+ { ordinal_x: 10, ordinal_y: 0 },
+ { ordinal_x: 11, ordinal_y: 0 },
+ { ordinal_x: 12, ordinal_y: 0 },
+
+ { ordinal_x: 9, ordinal_y: 3 },
+ { ordinal_x: 10, ordinal_y: 3 },
+ { ordinal_x: 11, ordinal_y: 3 },
+ ]
+
+ tiles.each do |t|
+ t.rect = { x: t.ordinal_x * 64,
+ y: t.ordinal_y * 64,
+ w: 64,
+ h: 64 }
+ end
+ end
+
+ def render
+ render_player
+ render_tiles
+ # render_grid
+ end
+
+ def input
+ input_jump
+ input_move
+ end
+
+ def calc
+ calc_player_rect
+ calc_left
+ calc_right
+ calc_below
+ calc_above
+ calc_player_dy
+ calc_player_dx
+ calc_game_over
+ end
+
+ def render_player
+ outputs.sprites << {
+ x: player.x,
+ y: player.y,
+ w: player.size,
+ h: player.size,
+ path: 'sprites/square/red.png'
+ }
+ end
+
+ def render_tiles
+ outputs.sprites << state.tiles.map do |t|
+ t.merge path: 'sprites/square/white.png',
+ x: t.ordinal_x * 64,
+ y: t.ordinal_y * 64,
+ w: 64,
+ h: 64
+ end
+ end
+
+ def render_grid
+ if state.tick_count == 0
+ outputs[:grid].background_color = [0, 0, 0, 0]
+ outputs[:grid].borders << available_brick_locations
+ outputs[:grid].labels << available_brick_locations.map do |b|
+ [
+ b.merge(text: "#{b.ordinal_x},#{b.ordinal_y}",
+ x: b.x + 2,
+ y: b.y + 2,
+ size_enum: -3,
+ vertical_alignment_enum: 0,
+ blendmode_enum: 0),
+ b.merge(text: "#{b.x},#{b.y}",
+ x: b.x + 2,
+ y: b.y + 2 + 20,
+ size_enum: -3,
+ vertical_alignment_enum: 0,
+ blendmode_enum: 0)
+ ]
+ end
+ end
+
+ outputs.sprites << { x: 0, y: 0, w: 1280, h: 720, path: :grid }
+ end
+
+ def input_jump
+ if inputs.keyboard.key_down.space
+ player_jump
+ end
+
+ if inputs.keyboard.key_held.space
+ player_jump_increase_air_time
+ end
+ end
+
+ def input_move
+ if player.dx.abs < 20
+ if inputs.keyboard.left
+ player.dx -= 2
+ elsif inputs.keyboard.right
+ player.dx += 2
+ end
+ end
+ end
+
+ def calc_game_over
+ if player.y < -64
+ player.x = 64
+ player.y = 800
+ player.dx = 0
+ player.dy = 0
+ end
+ end
+
+ def calc_player_rect
+ player.rect = player_current_rect
+ player.next_rect = player_next_rect
+ player.prev_rect = player_prev_rect
+ end
+
+ def calc_player_dx
+ player.dx = player_next_dx
+ player.x += player.dx
+ end
+
+ def calc_player_dy
+ player.y += player.dy
+ player.dy = player_next_dy
+ end
+
+ def calc_below
+ return unless player.dy < 0
+ tiles_below = tiles_find { |t| t.rect.top <= player.prev_rect.y }
+ collision = tiles_find_colliding tiles_below, (player.rect.merge y: player.next_rect.y)
+ if collision
+ player.y = collision.rect.y + state.tile_size
+ player.dy = 0
+ player.action = :standing
+ else
+ player.action = :falling
+ end
+ end
+
+ def calc_left
+ return unless player.dx < 0 && player_next_dx < 0
+ tiles_left = tiles_find { |t| t.rect.right <= player.prev_rect.left }
+ collision = tiles_find_colliding tiles_left, (player.rect.merge x: player.next_rect.x)
+ return unless collision
+ player.x = collision.rect.right
+ player.dx = 0
+ end
+
+ def calc_right
+ return unless player.dx > 0 && player_next_dx > 0
+ tiles_right = tiles_find { |t| t.rect.left >= player.prev_rect.right }
+ collision = tiles_find_colliding tiles_right, (player.rect.merge x: player.next_rect.x)
+ return unless collision
+ player.x = collision.rect.left - player.rect.w
+ player.dx = 0
+ end
+
+ def calc_above
+ return unless player.dy > 0
+ tiles_above = tiles_find { |t| t.rect.y >= player.prev_rect.y }
+ collision = tiles_find_colliding tiles_above, (player.rect.merge y: player.next_rect.y)
+ return unless collision
+ player.dy = 0
+ player.y = collision.rect.bottom - player.rect.h
+ end
+
+ def player_current_rect
+ { x: player.x, y: player.y, w: player.size, h: player.size }
+ end
+
+ def available_brick_locations
+ (0..19).to_a
+ .product(0..11)
+ .map do |(ordinal_x, ordinal_y)|
+ { ordinal_x: ordinal_x,
+ ordinal_y: ordinal_y,
+ x: ordinal_x * 64,
+ y: ordinal_y * 64,
+ w: 64,
+ h: 64 }
+ end
+ end
+
+ def player
+ state.player ||= args.state.new_entity :player
+ end
+
+ def player_next_dy
+ player.dy + state.gravity + state.drag ** 2 * -1
+ end
+
+ def player_next_dx
+ player.dx * 0.8
+ end
+
+ def player_next_rect
+ player.rect.merge x: player.x + player_next_dx,
+ y: player.y + player_next_dy
+ end
+
+ def player_prev_rect
+ player.rect.merge x: player.x - player.dx,
+ y: player.y - player.dy
+ end
+
+ def player_jump
+ return if player.action != :standing
+ player.action = :jumping
+ player.dy = state.player.jump_power
+ current_frame = state.tick_count
+ player.action_at = current_frame
+ end
+
+ def player_jump_increase_air_time
+ return if player.action != :jumping
+ return if player.action_at.elapsed_time >= player.jump_air_time
+ player.dy += player.jump_increase_power
+ end
+
+ def tiles
+ state.tiles
+ end
+
+ def tiles_find_colliding tiles, target
+ tiles.find { |t| t.rect.intersect_rect? target }
+ end
+
+ def tiles_find &block
+ tiles.find_all(&block)
+ end
+end
+
+def tick args
+ $game ||= Game.new
+ $game.args = args
+ $game.tick
+end
+
+$gtk.reset
diff --git a/samples/99_genre_mario/02_jumping_and_collisions/replay.txt b/samples/99_genre_mario/02_jumping_and_collisions/replay.txt
new file mode 100644
index 0000000..17e610f
--- /dev/null
+++ b/samples/99_genre_mario/02_jumping_and_collisions/replay.txt
@@ -0,0 +1,159 @@
+replay_version 2.0
+stopped_at 913
+seed 100
+recorded_at 2021-11-20 17:04:30 -0600
+[:mouse_move, 784, 90, 2, 1, 1]
+[:mouse_button_up, 1, 0, 1, 2, 4]
+[:mouse_move, 785, 90, 2, 3, 7]
+[:key_down_raw, 1073741903, 0, 2, 4, 63]
+[:key_down_raw, 1073741903, 0, 2, 5, 78]
+[:key_down_raw, 1073741903, 0, 2, 6, 81]
+[:key_down_raw, 1073741903, 0, 2, 7, 83]
+[:key_down_raw, 1073741903, 0, 2, 8, 85]
+[:key_down_raw, 1073741903, 0, 2, 9, 87]
+[:key_down_raw, 1073741903, 0, 2, 10, 89]
+[:key_down_raw, 1073741903, 0, 2, 11, 91]
+[:key_down_raw, 1073741903, 0, 2, 12, 93]
+[:key_down_raw, 1073741903, 0, 2, 13, 95]
+[:key_down_raw, 1073741903, 0, 2, 14, 97]
+[:key_down_raw, 1073741903, 0, 2, 15, 99]
+[:key_down_raw, 1073741903, 0, 2, 16, 101]
+[:key_down_raw, 1073741903, 0, 2, 17, 103]
+[:key_down_raw, 1073741903, 0, 2, 18, 105]
+[:key_down_raw, 1073741903, 0, 2, 19, 107]
+[:key_down_raw, 1073741903, 0, 2, 20, 109]
+[:key_down_raw, 1073741903, 0, 2, 21, 111]
+[:key_down_raw, 1073741903, 0, 2, 22, 113]
+[:key_down_raw, 1073741903, 0, 2, 23, 115]
+[:key_down_raw, 1073741903, 0, 2, 24, 117]
+[:key_down_raw, 1073741903, 0, 2, 25, 119]
+[:key_down_raw, 1073741903, 0, 2, 26, 121]
+[:key_up_raw, 1073741903, 0, 2, 27, 121]
+[:key_down_raw, 1073741904, 0, 2, 28, 155]
+[:key_up_raw, 1073741904, 0, 2, 29, 159]
+[:key_down_raw, 32, 0, 2, 30, 170]
+[:key_up_raw, 32, 0, 2, 31, 176]
+[:key_down_raw, 1073741903, 0, 2, 32, 189]
+[:key_up_raw, 1073741903, 0, 2, 33, 199]
+[:key_down_raw, 1073741904, 0, 2, 34, 235]
+[:key_up_raw, 1073741904, 0, 2, 35, 249]
+[:key_down_raw, 32, 0, 2, 36, 258]
+[:key_down_raw, 1073741903, 0, 2, 37, 262]
+[:key_down_raw, 1073741903, 0, 2, 38, 277]
+[:key_down_raw, 1073741903, 0, 2, 39, 279]
+[:key_down_raw, 1073741903, 0, 2, 40, 281]
+[:key_down_raw, 1073741903, 0, 2, 41, 283]
+[:key_down_raw, 1073741903, 0, 2, 42, 285]
+[:key_down_raw, 1073741903, 0, 2, 43, 287]
+[:key_up_raw, 32, 0, 2, 44, 288]
+[:key_down_raw, 1073741903, 0, 2, 45, 289]
+[:key_up_raw, 1073741903, 0, 2, 46, 290]
+[:key_down_raw, 1073741904, 0, 2, 47, 309]
+[:key_down_raw, 32, 0, 2, 48, 320]
+[:key_up_raw, 32, 0, 2, 49, 330]
+[:key_down_raw, 32, 0, 2, 50, 335]
+[:key_up_raw, 32, 0, 2, 51, 339]
+[:key_up_raw, 1073741904, 0, 2, 52, 355]
+[:key_down_raw, 1073741903, 0, 2, 53, 361]
+[:key_down_raw, 1073741903, 0, 2, 54, 376]
+[:key_down_raw, 1073741903, 0, 2, 55, 378]
+[:key_down_raw, 1073741903, 0, 2, 56, 380]
+[:key_down_raw, 1073741903, 0, 2, 57, 382]
+[:key_down_raw, 1073741903, 0, 2, 58, 384]
+[:key_down_raw, 1073741903, 0, 2, 59, 386]
+[:key_down_raw, 1073741903, 0, 2, 60, 388]
+[:key_down_raw, 1073741903, 0, 2, 61, 390]
+[:key_down_raw, 1073741903, 0, 2, 62, 392]
+[:key_down_raw, 1073741903, 0, 2, 63, 394]
+[:key_down_raw, 1073741903, 0, 2, 64, 396]
+[:key_down_raw, 1073741903, 0, 2, 65, 398]
+[:key_down_raw, 1073741903, 0, 2, 66, 400]
+[:key_down_raw, 1073741903, 0, 2, 67, 402]
+[:key_up_raw, 1073741903, 0, 2, 68, 403]
+[:key_down_raw, 32, 0, 2, 69, 408]
+[:key_up_raw, 32, 0, 2, 70, 415]
+[:key_down_raw, 32, 0, 2, 71, 435]
+[:key_up_raw, 32, 0, 2, 72, 450]
+[:key_down_raw, 32, 0, 2, 73, 461]
+[:key_up_raw, 32, 0, 2, 74, 473]
+[:key_down_raw, 1073741903, 0, 2, 75, 480]
+[:key_up_raw, 1073741903, 0, 2, 76, 491]
+[:key_down_raw, 32, 0, 2, 77, 495]
+[:key_down_raw, 32, 0, 2, 78, 509]
+[:key_down_raw, 32, 0, 2, 79, 511]
+[:key_down_raw, 32, 0, 2, 80, 515]
+[:key_down_raw, 32, 0, 2, 81, 515]
+[:key_down_raw, 32, 0, 2, 82, 517]
+[:key_up_raw, 32, 0, 2, 83, 519]
+[:key_down_raw, 1073741903, 0, 2, 84, 525]
+[:key_down_raw, 32, 0, 2, 85, 537]
+[:key_up_raw, 1073741903, 0, 2, 86, 539]
+[:key_up_raw, 32, 0, 2, 87, 549]
+[:key_down_raw, 1073741904, 0, 2, 88, 567]
+[:key_down_raw, 1073741904, 0, 2, 89, 582]
+[:key_down_raw, 1073741904, 0, 2, 90, 584]
+[:key_down_raw, 1073741904, 0, 2, 91, 586]
+[:key_down_raw, 1073741904, 0, 2, 92, 588]
+[:key_down_raw, 1073741904, 0, 2, 93, 591]
+[:key_down_raw, 1073741904, 0, 2, 94, 593]
+[:key_down_raw, 1073741904, 0, 2, 95, 594]
+[:key_up_raw, 1073741904, 0, 2, 96, 595]
+[:key_down_raw, 1073741904, 0, 2, 97, 623]
+[:key_down_raw, 1073741904, 0, 2, 98, 640]
+[:key_down_raw, 1073741904, 0, 2, 99, 640]
+[:key_down_raw, 1073741904, 0, 2, 100, 642]
+[:key_down_raw, 1073741904, 0, 2, 101, 645]
+[:key_down_raw, 1073741904, 0, 2, 102, 647]
+[:key_down_raw, 1073741904, 0, 2, 103, 649]
+[:key_down_raw, 1073741904, 0, 2, 104, 651]
+[:key_up_raw, 1073741904, 0, 2, 105, 652]
+[:key_down_raw, 1073741903, 0, 2, 106, 683]
+[:key_down_raw, 1073741903, 0, 2, 107, 698]
+[:key_down_raw, 1073741903, 0, 2, 108, 700]
+[:key_down_raw, 1073741903, 0, 2, 109, 702]
+[:key_down_raw, 1073741903, 0, 2, 110, 704]
+[:key_down_raw, 1073741903, 0, 2, 111, 706]
+[:key_down_raw, 1073741903, 0, 2, 112, 708]
+[:key_down_raw, 1073741903, 0, 2, 113, 710]
+[:key_down_raw, 1073741903, 0, 2, 114, 712]
+[:key_down_raw, 1073741903, 0, 2, 115, 714]
+[:key_down_raw, 1073741903, 0, 2, 116, 716]
+[:key_down_raw, 1073741903, 0, 2, 117, 718]
+[:key_down_raw, 1073741903, 0, 2, 118, 720]
+[:key_down_raw, 1073741903, 0, 2, 119, 722]
+[:key_down_raw, 1073741903, 0, 2, 120, 724]
+[:key_down_raw, 1073741903, 0, 2, 121, 726]
+[:key_down_raw, 1073741903, 0, 2, 122, 728]
+[:key_down_raw, 1073741903, 0, 2, 123, 730]
+[:key_down_raw, 1073741903, 0, 2, 124, 732]
+[:key_down_raw, 1073741903, 0, 2, 125, 734]
+[:key_down_raw, 1073741903, 0, 2, 126, 736]
+[:key_down_raw, 1073741903, 0, 2, 127, 738]
+[:key_down_raw, 1073741903, 0, 2, 128, 740]
+[:key_down_raw, 1073741903, 0, 2, 129, 742]
+[:key_down_raw, 1073741903, 0, 2, 130, 744]
+[:key_down_raw, 1073741903, 0, 2, 131, 746]
+[:key_down_raw, 1073741903, 0, 2, 132, 748]
+[:key_down_raw, 32, 0, 2, 133, 748]
+[:key_down_raw, 32, 0, 2, 134, 763]
+[:key_down_raw, 32, 0, 2, 135, 765]
+[:key_down_raw, 32, 0, 2, 136, 767]
+[:key_down_raw, 32, 0, 2, 137, 769]
+[:key_down_raw, 32, 0, 2, 138, 771]
+[:key_up_raw, 32, 0, 2, 139, 773]
+[:key_down_raw, 1073741904, 0, 2, 140, 775]
+[:key_up_raw, 1073741903, 0, 2, 141, 776]
+[:key_down_raw, 1073741904, 0, 2, 142, 790]
+[:key_down_raw, 1073741904, 0, 2, 143, 792]
+[:key_down_raw, 1073741904, 0, 2, 144, 794]
+[:key_down_raw, 1073741904, 0, 2, 145, 796]
+[:key_down_raw, 1073741904, 0, 2, 146, 798]
+[:key_down_raw, 1073741904, 0, 2, 147, 801]
+[:key_down_raw, 1073741904, 0, 2, 148, 803]
+[:key_down_raw, 1073741904, 0, 2, 149, 804]
+[:key_down_raw, 1073741904, 0, 2, 150, 807]
+[:key_down_raw, 1073741904, 0, 2, 151, 809]
+[:key_up_raw, 1073741904, 0, 2, 152, 810]
+[:key_down_raw, 96, 0, 2, 153, 854]
+[:key_up_raw, 96, 0, 2, 154, 858]
+[:key_down_raw, 13, 0, 2, 155, 913]
diff --git a/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/red.png b/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/red.png
new file mode 100644
index 0000000..a59443e
--- /dev/null
+++ b/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/red.png
Binary files differ
diff --git a/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/white.png b/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/white.png
new file mode 100644
index 0000000..7a233ea
--- /dev/null
+++ b/samples/99_genre_mario/02_jumping_and_collisions/sprites/square/white.png
Binary files differ