diff --git a/Cargo.toml b/Cargo.toml index 74dbe53..b4118b1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,3 +51,7 @@ path = "examples/scenarios/road_race.rs" [[example]] name = "extreme_drivers_ed" path = "examples/scenarios/extreme_drivers_ed.rs" + +[[example]] +name = "invaders" +path = "examples/scenarios/invaders.rs" diff --git a/assets/sprite/space/block_blank_blue.collider b/assets/sprite/space/block_blank_blue.collider new file mode 100644 index 0000000..9254b6b --- /dev/null +++ b/assets/sprite/space/block_blank_blue.collider @@ -0,0 +1,14 @@ +Poly([ + (-17.0, -11.5), + (-17.0, 11.5), + (-15.0, 14.5), + (-12.0, 16.5), + (11.0, 16.5), + (14.0, 14.5), + (16.0, 11.5), + (16.0, -11.5), + (14.0, -14.5), + (11.0, -16.5), + (-12.0, -16.5), + (-15.0, -14.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/block_blank_blue.png b/assets/sprite/space/block_blank_blue.png new file mode 100644 index 0000000..1118e1b Binary files /dev/null and b/assets/sprite/space/block_blank_blue.png differ diff --git a/assets/sprite/space/block_blank_red.collider b/assets/sprite/space/block_blank_red.collider new file mode 100644 index 0000000..9254b6b --- /dev/null +++ b/assets/sprite/space/block_blank_red.collider @@ -0,0 +1,14 @@ +Poly([ + (-17.0, -11.5), + (-17.0, 11.5), + (-15.0, 14.5), + (-12.0, 16.5), + (11.0, 16.5), + (14.0, 14.5), + (16.0, 11.5), + (16.0, -11.5), + (14.0, -14.5), + (11.0, -16.5), + (-12.0, -16.5), + (-15.0, -14.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/block_blank_red.png b/assets/sprite/space/block_blank_red.png new file mode 100644 index 0000000..645f1e3 Binary files /dev/null and b/assets/sprite/space/block_blank_red.png differ diff --git a/assets/sprite/space/block_bolt_blue.collider b/assets/sprite/space/block_bolt_blue.collider new file mode 100644 index 0000000..9254b6b --- /dev/null +++ b/assets/sprite/space/block_bolt_blue.collider @@ -0,0 +1,14 @@ +Poly([ + (-17.0, -11.5), + (-17.0, 11.5), + (-15.0, 14.5), + (-12.0, 16.5), + (11.0, 16.5), + (14.0, 14.5), + (16.0, 11.5), + (16.0, -11.5), + (14.0, -14.5), + (11.0, -16.5), + (-12.0, -16.5), + (-15.0, -14.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/block_bolt_blue.png b/assets/sprite/space/block_bolt_blue.png new file mode 100644 index 0000000..28f7aeb Binary files /dev/null and b/assets/sprite/space/block_bolt_blue.png differ diff --git a/assets/sprite/space/block_bolt_red.collider b/assets/sprite/space/block_bolt_red.collider new file mode 100644 index 0000000..9254b6b --- /dev/null +++ b/assets/sprite/space/block_bolt_red.collider @@ -0,0 +1,14 @@ +Poly([ + (-17.0, -11.5), + (-17.0, 11.5), + (-15.0, 14.5), + (-12.0, 16.5), + (11.0, 16.5), + (14.0, 14.5), + (16.0, 11.5), + (16.0, -11.5), + (14.0, -14.5), + (11.0, -16.5), + (-12.0, -16.5), + (-15.0, -14.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/block_bolt_red.png b/assets/sprite/space/block_bolt_red.png new file mode 100644 index 0000000..ddd1417 Binary files /dev/null and b/assets/sprite/space/block_bolt_red.png differ diff --git a/assets/sprite/space/block_shield_blue.collider b/assets/sprite/space/block_shield_blue.collider new file mode 100644 index 0000000..9254b6b --- /dev/null +++ b/assets/sprite/space/block_shield_blue.collider @@ -0,0 +1,14 @@ +Poly([ + (-17.0, -11.5), + (-17.0, 11.5), + (-15.0, 14.5), + (-12.0, 16.5), + (11.0, 16.5), + (14.0, 14.5), + (16.0, 11.5), + (16.0, -11.5), + (14.0, -14.5), + (11.0, -16.5), + (-12.0, -16.5), + (-15.0, -14.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/block_shield_blue.png b/assets/sprite/space/block_shield_blue.png new file mode 100644 index 0000000..b6f2d4c Binary files /dev/null and b/assets/sprite/space/block_shield_blue.png differ diff --git a/assets/sprite/space/block_shield_red.collider b/assets/sprite/space/block_shield_red.collider new file mode 100644 index 0000000..9254b6b --- /dev/null +++ b/assets/sprite/space/block_shield_red.collider @@ -0,0 +1,14 @@ +Poly([ + (-17.0, -11.5), + (-17.0, 11.5), + (-15.0, 14.5), + (-12.0, 16.5), + (11.0, 16.5), + (14.0, 14.5), + (16.0, 11.5), + (16.0, -11.5), + (14.0, -14.5), + (11.0, -16.5), + (-12.0, -16.5), + (-15.0, -14.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/block_shield_red.png b/assets/sprite/space/block_shield_red.png new file mode 100644 index 0000000..7e0efd5 Binary files /dev/null and b/assets/sprite/space/block_shield_red.png differ diff --git a/assets/sprite/space/block_star_blue.collider b/assets/sprite/space/block_star_blue.collider new file mode 100644 index 0000000..9254b6b --- /dev/null +++ b/assets/sprite/space/block_star_blue.collider @@ -0,0 +1,14 @@ +Poly([ + (-17.0, -11.5), + (-17.0, 11.5), + (-15.0, 14.5), + (-12.0, 16.5), + (11.0, 16.5), + (14.0, 14.5), + (16.0, 11.5), + (16.0, -11.5), + (14.0, -14.5), + (11.0, -16.5), + (-12.0, -16.5), + (-15.0, -14.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/block_star_blue.png b/assets/sprite/space/block_star_blue.png new file mode 100644 index 0000000..eeda7bc Binary files /dev/null and b/assets/sprite/space/block_star_blue.png differ diff --git a/assets/sprite/space/block_star_red.collider b/assets/sprite/space/block_star_red.collider new file mode 100644 index 0000000..9254b6b --- /dev/null +++ b/assets/sprite/space/block_star_red.collider @@ -0,0 +1,14 @@ +Poly([ + (-17.0, -11.5), + (-17.0, 11.5), + (-15.0, 14.5), + (-12.0, 16.5), + (11.0, 16.5), + (14.0, 14.5), + (16.0, 11.5), + (16.0, -11.5), + (14.0, -14.5), + (11.0, -16.5), + (-12.0, -16.5), + (-15.0, -14.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/block_star_red.png b/assets/sprite/space/block_star_red.png new file mode 100644 index 0000000..ea98f39 Binary files /dev/null and b/assets/sprite/space/block_star_red.png differ diff --git a/assets/sprite/space/enemy_black.collider b/assets/sprite/space/enemy_black.collider new file mode 100644 index 0000000..2eb164d --- /dev/null +++ b/assets/sprite/space/enemy_black.collider @@ -0,0 +1,10 @@ +Poly([ + (-46.500004, 14.000001), + (-46.500004, 17.0), + (-29.500002, 42.0), + (29.500002, 42.0), + (46.500004, 16.5), + (46.500004, 14.000001), + (25.500002, -41.0), + (-25.500002, -41.0), +]) \ No newline at end of file diff --git a/assets/sprite/space/enemy_black.png b/assets/sprite/space/enemy_black.png new file mode 100644 index 0000000..bc2fa4c Binary files /dev/null and b/assets/sprite/space/enemy_black.png differ diff --git a/assets/sprite/space/enemy_blue.collider b/assets/sprite/space/enemy_blue.collider new file mode 100644 index 0000000..268b0d2 --- /dev/null +++ b/assets/sprite/space/enemy_blue.collider @@ -0,0 +1,14 @@ +Poly([ + (-52.0, 8.0), + (-52.0, 14.0), + (-50.0, 16.0), + (-1.0, 42.0), + (1.0, 42.0), + (50.0, 16.0), + (52.0, 14.0), + (52.0, 8.0), + (24.0, -41.0), + (16.0, -42.0), + (-16.0, -42.0), + (-24.0, -41.0), +]) \ No newline at end of file diff --git a/assets/sprite/space/enemy_blue.png b/assets/sprite/space/enemy_blue.png new file mode 100644 index 0000000..bf3bd0c Binary files /dev/null and b/assets/sprite/space/enemy_blue.png differ diff --git a/assets/sprite/space/enemy_green.collider b/assets/sprite/space/enemy_green.collider new file mode 100644 index 0000000..459f039 --- /dev/null +++ b/assets/sprite/space/enemy_green.collider @@ -0,0 +1,11 @@ +Poly([ + (-38.5, -42.0), + (-51.5, 0.0), + (-51.5, 4.0), + (-26.5, 36.0), + (-8.5, 42.0), + (8.5, 42.0), + (25.5, 36.0), + (51.5, 3.0), + (38.5, -42.0), +]) \ No newline at end of file diff --git a/assets/sprite/space/enemy_green.png b/assets/sprite/space/enemy_green.png new file mode 100644 index 0000000..74e2bca Binary files /dev/null and b/assets/sprite/space/enemy_green.png differ diff --git a/assets/sprite/space/enemy_red.collider b/assets/sprite/space/enemy_red.collider new file mode 100644 index 0000000..0d58daf --- /dev/null +++ b/assets/sprite/space/enemy_red.collider @@ -0,0 +1,10 @@ +Poly([ + (-41.0, -20.0), + (-41.0, 29.0), + (-20.0, 42.0), + (20.0, 42.0), + (41.0, 29.0), + (41.0, -20.0), + (11.0, -42.0), + (-11.0, -42.0), +]) \ No newline at end of file diff --git a/assets/sprite/space/enemy_red.png b/assets/sprite/space/enemy_red.png new file mode 100644 index 0000000..a3216d4 Binary files /dev/null and b/assets/sprite/space/enemy_red.png differ diff --git a/assets/sprite/space/explosion.collider b/assets/sprite/space/explosion.collider new file mode 100644 index 0000000..b18e633 --- /dev/null +++ b/assets/sprite/space/explosion.collider @@ -0,0 +1,14 @@ +Poly([ + (-32.0, -1.5), + (-32.0, 1.5), + (-27.0, 26.5), + (-2.0, 31.5), + (2.0, 31.5), + (27.0, 26.5), + (32.0, 2.5), + (32.0, -1.5), + (27.0, -26.5), + (2.0, -31.5), + (-2.0, -31.5), + (-27.0, -26.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/explosion.png b/assets/sprite/space/explosion.png new file mode 100644 index 0000000..c3dce2b Binary files /dev/null and b/assets/sprite/space/explosion.png differ diff --git a/assets/sprite/space/laser_blue.collider b/assets/sprite/space/laser_blue.collider new file mode 100644 index 0000000..72f5bd6 --- /dev/null +++ b/assets/sprite/space/laser_blue.collider @@ -0,0 +1,10 @@ +Poly([ + (-1.5, -27.0), + (-4.5, -13.0), + (-4.5, 25.0), + (-2.5, 27.0), + (2.5, 27.0), + (4.5, 25.0), + (4.5, -13.0), + (1.5, -27.0), +]) \ No newline at end of file diff --git a/assets/sprite/space/laser_blue.png b/assets/sprite/space/laser_blue.png new file mode 100644 index 0000000..b76aaf7 Binary files /dev/null and b/assets/sprite/space/laser_blue.png differ diff --git a/assets/sprite/space/laser_red.collider b/assets/sprite/space/laser_red.collider new file mode 100644 index 0000000..72f5bd6 --- /dev/null +++ b/assets/sprite/space/laser_red.collider @@ -0,0 +1,10 @@ +Poly([ + (-1.5, -27.0), + (-4.5, -13.0), + (-4.5, 25.0), + (-2.5, 27.0), + (2.5, 27.0), + (4.5, 25.0), + (4.5, -13.0), + (1.5, -27.0), +]) \ No newline at end of file diff --git a/assets/sprite/space/laser_red.png b/assets/sprite/space/laser_red.png new file mode 100644 index 0000000..5e467b6 Binary files /dev/null and b/assets/sprite/space/laser_red.png differ diff --git a/assets/sprite/space/life_blue.collider b/assets/sprite/space/life_blue.collider new file mode 100644 index 0000000..6016cfc --- /dev/null +++ b/assets/sprite/space/life_blue.collider @@ -0,0 +1,12 @@ +Poly([ + (-18.5, -4.0), + (-18.5, 0.0), + (-2.5, 13.0), + (1.5, 13.0), + (17.5, -0.0), + (17.5, -4.0), + (11.5, -12.0), + (3.5, -13.0), + (-4.5, -13.0), + (-12.5, -12.0), +]) \ No newline at end of file diff --git a/assets/sprite/space/life_blue.png b/assets/sprite/space/life_blue.png new file mode 100644 index 0000000..17478e6 Binary files /dev/null and b/assets/sprite/space/life_blue.png differ diff --git a/assets/sprite/space/life_red.collider b/assets/sprite/space/life_red.collider new file mode 100644 index 0000000..6016cfc --- /dev/null +++ b/assets/sprite/space/life_red.collider @@ -0,0 +1,12 @@ +Poly([ + (-18.5, -4.0), + (-18.5, 0.0), + (-2.5, 13.0), + (1.5, 13.0), + (17.5, -0.0), + (17.5, -4.0), + (11.5, -12.0), + (3.5, -13.0), + (-4.5, -13.0), + (-12.5, -12.0), +]) \ No newline at end of file diff --git a/assets/sprite/space/life_red.png b/assets/sprite/space/life_red.png new file mode 100644 index 0000000..abada85 Binary files /dev/null and b/assets/sprite/space/life_red.png differ diff --git a/assets/sprite/space/ship_blue.collider b/assets/sprite/space/ship_blue.collider new file mode 100644 index 0000000..c50c5ae --- /dev/null +++ b/assets/sprite/space/ship_blue.collider @@ -0,0 +1,10 @@ +Poly([ + (-49.0, -21.5), + (-4.0, 37.5), + (4.0, 37.5), + (49.0, -22.5), + (49.0, -28.5), + (14.0, -37.5), + (-14.0, -37.5), + (-49.0, -29.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/ship_blue.png b/assets/sprite/space/ship_blue.png new file mode 100644 index 0000000..f34faf0 Binary files /dev/null and b/assets/sprite/space/ship_blue.png differ diff --git a/assets/sprite/space/ship_red.collider b/assets/sprite/space/ship_red.collider new file mode 100644 index 0000000..c50c5ae --- /dev/null +++ b/assets/sprite/space/ship_red.collider @@ -0,0 +1,10 @@ +Poly([ + (-49.0, -21.5), + (-4.0, 37.5), + (4.0, 37.5), + (49.0, -22.5), + (49.0, -28.5), + (14.0, -37.5), + (-14.0, -37.5), + (-49.0, -29.5), +]) \ No newline at end of file diff --git a/assets/sprite/space/ship_red.png b/assets/sprite/space/ship_red.png new file mode 100644 index 0000000..796e81d Binary files /dev/null and b/assets/sprite/space/ship_red.png differ diff --git a/assets/sprite/space/ufo.collider b/assets/sprite/space/ufo.collider new file mode 100644 index 0000000..1cf78f5 --- /dev/null +++ b/assets/sprite/space/ufo.collider @@ -0,0 +1,18 @@ +Poly([ + (46.0, 0.0), + (42.49846, 17.603437), + (32.526913, 32.526913), + (17.603437, 42.49846), + (0.0, 46.0), + (-17.603437, 42.49846), + (-32.526913, 32.526913), + (-42.49846, 17.603437), + (-46.0, 0.0), + (-42.49846, -17.603437), + (-32.526913, -32.526913), + (-17.603437, -42.49846), + (0.0, -46.0), + (17.603437, -42.49846), + (32.526913, -32.526913), + (42.49846, -17.603437), +]) \ No newline at end of file diff --git a/assets/sprite/space/ufo.png b/assets/sprite/space/ufo.png new file mode 100644 index 0000000..7d441b2 Binary files /dev/null and b/assets/sprite/space/ufo.png differ diff --git a/examples/scenarios/invaders.rs b/examples/scenarios/invaders.rs new file mode 100644 index 0000000..0a9fe5b --- /dev/null +++ b/examples/scenarios/invaders.rs @@ -0,0 +1,72 @@ +use rusty_engine::prelude::*; + +struct GameState { + string_vec: Vec, +} + +fn main() { + let mut game = Game::new(); + + // create and position the player + let player = game.add_sprite("player", "sprite/space/ship_blue.png"); + player.translation.y = -275.0; + player.collision = true; + + for i in 0..5 { + place_barrier( + &mut game, + format!("barrier{}", i), + Vec2::new(-624.0 + (i * (160 + 96)) as f32 + 32.0, -230.0), + ); + } + // pre-populate laser labels + let mut game_state = GameState { + string_vec: Vec::new(), + }; + for i in 0..2 { + game_state.string_vec.push(format!("laser{}", i)); + } + + game.add_logic(logic); + game.run(game_state); +} + +fn logic(engine: &mut Engine, game_state: &mut GameState) { + // Player movement + let player = engine.sprites.get_mut("player").unwrap(); + if let Some(location) = engine.mouse_state.location() { + player.translation.x = player + .translation + .lerp(Vec2::new(location.x, player.translation.y), 0.1) + .x; + } + + // Lasers!!! + let player_translation = player.translation; + if engine.mouse_state.just_pressed(MouseButton::Left) + || engine.keyboard_state.just_pressed(KeyCode::Space) + { + if let Some(label) = game_state.string_vec.pop() { + let laser = + engine.add_sprite(format!("laser{}", label), SpritePreset::RacingBarrierWhite); + laser.rotation = UP; + laser.scale = 0.25; + laser.translation = player_translation; + } + } +} + +fn place_barrier(engine: &mut Engine, prefix: String, location: Vec2) { + for x in 0..5 { + for y in 0..3 { + if y == 2 && (x == 0 || x == 4) { + continue; + } + let block = engine.add_sprite( + format!("{}-{}-{}", prefix, x, y), + SpritePreset::RollingBlockSmall, + ); + block.translation = Vec2::new(x as f32 * 32.0, y as f32 * 32.0) + location; + } + } +} diff --git a/scenarios/space_invaders.md b/scenarios/space_invaders.md index 55fb6ee..cf7c2c9 100644 --- a/scenarios/space_invaders.md +++ b/scenarios/space_invaders.md @@ -2,7 +2,7 @@ Evil aliens are invading! Shoot them down. -Similar to the classic [Space Invaders](https://en.wikipedia.org/wiki/Space_Invaders) arcade game, evil car aliens are invading and you must shoot them down! Cars will be set up in a grid near tho top of the screen. They will march back and forth the screen as they come lower and lower, moving faster the less of them that there are. You are aboard the only trusty green triangle that can shoot them down! +Similar to the classic [Space Invaders](https://en.wikipedia.org/wiki/Space_Invaders) arcade game, evil aliens are invading and you must shoot them down! Aliens will be set up in a grid near the top of the screen. They will march back and forth the screen as they come lower and lower, moving faster the less of them that there are. You are aboard the only spaceship left that can shoot them down! ## Common Setup