From dcf0c167e75443e9fcfa76f6377d04a8640f8c7d Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Fri, 19 Nov 2021 12:12:52 -0700 Subject: [PATCH 1/3] WIP car invaders reference --- Cargo.toml | 4 ++ examples/scenarios/car_invaders.rs | 66 ++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 examples/scenarios/car_invaders.rs diff --git a/Cargo.toml b/Cargo.toml index 5185f51..cf4aa9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,10 @@ log = "0.4" env_logger = "0.9" rand = "0.8" +[[example]] +name = "car_invaders" +path = "examples/scenarios/car_invaders.rs" + [[example]] name = "car_shoot" path = "examples/scenarios/car_shoot.rs" diff --git a/examples/scenarios/car_invaders.rs b/examples/scenarios/car_invaders.rs new file mode 100644 index 0000000..4a2fd35 --- /dev/null +++ b/examples/scenarios/car_invaders.rs @@ -0,0 +1,66 @@ +use rusty_engine::prelude::*; + +fn place_barrier(game: &mut Game, prefix: String, location: Vec2) { + for x in 0..5 { + for y in 0..3 { + if y == 2 && (x == 0 || x == 4) { + continue; + } + let block = game.add_actor( + format!("{}-{}-{}", prefix, x, y), + ActorPreset::RollingBlockSmall, + ); + block.translation = Vec2::new(x as f32 * 32.0, y as f32 * 32.0) + location; + } + } +} + +fn main() { + let mut game = Game::new(); + + // create and position the player + let player = game.add_actor("player", ActorPreset::RollingBlockCorner); + player.translation.y = -335.0; + player.rotation = SOUTH_WEST; + player.scale = 0.75; + 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 + for i in 0..2 { + game.game_state_mut().string_vec.push(format!("laser{}", i)); + } + + game.run(logic); +} + +fn logic(game_state: &mut GameState) { + // Player movement + let player = game_state.actors.get_mut("player").unwrap(); + if let Some(location) = game_state.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 game_state.mouse_state.just_pressed(MouseButton::Left) + || game_state.keyboard_state.just_pressed(KeyCode::Space) + { + if let Some(label) = game_state.string_vec.pop() { + let laser = + game_state.add_actor(format!("laser{}", label), ActorPreset::RacingBarrierWhite); + laser.rotation = UP; + laser.scale = 0.25; + laser.translation = player_translation; + } + } +} From 9d4c6cde400106f3c851458410d7cdfe2a8977f4 Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Tue, 15 Mar 2022 13:41:46 -0600 Subject: [PATCH 2/3] upgraded to Rusty Engine 5.0 --- examples/scenarios/car_invaders.rs | 55 +++++++++++++++++------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/examples/scenarios/car_invaders.rs b/examples/scenarios/car_invaders.rs index 4a2fd35..70a1b71 100644 --- a/examples/scenarios/car_invaders.rs +++ b/examples/scenarios/car_invaders.rs @@ -1,30 +1,22 @@ use rusty_engine::prelude::*; -fn place_barrier(game: &mut Game, prefix: String, location: Vec2) { - for x in 0..5 { - for y in 0..3 { - if y == 2 && (x == 0 || x == 4) { - continue; - } - let block = game.add_actor( - format!("{}-{}-{}", prefix, x, y), - ActorPreset::RollingBlockSmall, - ); - block.translation = Vec2::new(x as f32 * 32.0, y as f32 * 32.0) + location; - } - } +#[derive(Default)] +struct GameState { + laser_labels: Vec, } fn main() { let mut game = Game::new(); // create and position the player - let player = game.add_actor("player", ActorPreset::RollingBlockCorner); + let player = game.add_sprite("player", SpritePreset::RollingBlockCorner); player.translation.y = -335.0; player.rotation = SOUTH_WEST; player.scale = 0.75; player.collision = true; + //car.translation.y = car.translation.y.clamp(-360.0, 360.0); + for i in 0..5 { place_barrier( &mut game, @@ -33,17 +25,19 @@ fn main() { ); } // pre-populate laser labels + let mut game_state = GameState::default(); for i in 0..2 { - game.game_state_mut().string_vec.push(format!("laser{}", i)); + game_state.laser_labels.push(format!("laser{}", i)); } - game.run(logic); + game.add_logic(game_logic); + game.run(game_state); } -fn logic(game_state: &mut GameState) { +fn game_logic(engine: &mut Engine, game_state: &mut GameState) { // Player movement - let player = game_state.actors.get_mut("player").unwrap(); - if let Some(location) = game_state.mouse_state.location() { + 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) @@ -52,15 +46,30 @@ fn logic(game_state: &mut GameState) { // Lasers!!! let player_translation = player.translation; - if game_state.mouse_state.just_pressed(MouseButton::Left) - || game_state.keyboard_state.just_pressed(KeyCode::Space) + if engine.mouse_state.just_pressed(MouseButton::Left) + || engine.keyboard_state.just_pressed(KeyCode::Space) { - if let Some(label) = game_state.string_vec.pop() { + if let Some(label) = game_state.laser_labels.pop() { let laser = - game_state.add_actor(format!("laser{}", label), ActorPreset::RacingBarrierWhite); + engine.add_sprite(format!("laser{}", label), SpritePreset::RacingBarrierWhite); laser.rotation = UP; laser.scale = 0.25; laser.translation = player_translation; } } } + +fn place_barrier(game: &mut Game, prefix: String, location: Vec2) { + for x in 0..5 { + for y in 0..3 { + if y == 2 && (x == 0 || x == 4) { + continue; + } + let block = game.add_sprite( + format!("{}-{}-{}", prefix, x, y), + SpritePreset::RollingBlockSmall, + ); + block.translation = Vec2::new(x as f32 * 32.0, y as f32 * 32.0) + location; + } + } +} From a7856fc49fd015b33cda782368f620db800839f0 Mon Sep 17 00:00:00 2001 From: Nathan Stocks Date: Tue, 15 Mar 2022 13:57:42 -0600 Subject: [PATCH 3/3] lasers fire --- examples/scenarios/car_invaders.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/examples/scenarios/car_invaders.rs b/examples/scenarios/car_invaders.rs index 70a1b71..eb30979 100644 --- a/examples/scenarios/car_invaders.rs +++ b/examples/scenarios/car_invaders.rs @@ -14,6 +14,7 @@ fn main() { player.rotation = SOUTH_WEST; player.scale = 0.75; player.collision = true; + player.layer = 2.0; //car.translation.y = car.translation.y.clamp(-360.0, 360.0); @@ -26,7 +27,7 @@ fn main() { } // pre-populate laser labels let mut game_state = GameState::default(); - for i in 0..2 { + for i in 0..3 { game_state.laser_labels.push(format!("laser{}", i)); } @@ -34,6 +35,8 @@ fn main() { game.run(game_state); } +const LASER_SPEED: f32 = 1000.0; + fn game_logic(engine: &mut Engine, game_state: &mut GameState) { // Player movement let player = engine.sprites.get_mut("player").unwrap(); @@ -53,10 +56,31 @@ fn game_logic(engine: &mut Engine, game_state: &mut GameState) { let laser = engine.add_sprite(format!("laser{}", label), SpritePreset::RacingBarrierWhite); laser.rotation = UP; - laser.scale = 0.25; + laser.scale = 0.2; laser.translation = player_translation; + laser.layer = 1.0; + engine.audio_manager.play_sfx(SfxPreset::Forcefield1, 0.4); } } + + // Move lasers + let mut laser_labels_to_recycle = Vec::new(); + for laser in engine + .sprites + .values_mut() + .filter(|sprite| sprite.label.starts_with("laser")) + { + laser.translation.y += LASER_SPEED * engine.delta_f32; + if laser.translation.y > 400.0 { + laser_labels_to_recycle.push(laser.label.clone()); + } + } + + // Recycle lasers + for laser_label in laser_labels_to_recycle { + engine.sprites.remove(&laser_label); + game_state.laser_labels.push(laser_label); + } } fn place_barrier(game: &mut Game, prefix: String, location: Vec2) {