From e45db4758fe5ed1f5c9280e646a676b94e954fa9 Mon Sep 17 00:00:00 2001 From: Kishan Takoordyal Date: Wed, 27 May 2026 13:10:14 +0400 Subject: [PATCH] Complete tutorial --- Cargo.lock | 60 ++++++++++++++++++++--- Cargo.toml | 1 + src/main.rs | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 191 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e31b397..a30ddb0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -860,7 +860,7 @@ dependencies = [ "glam", "itertools 0.14.0", "libm", - "rand", + "rand 0.9.4", "rand_distr", "serde", "thiserror 2.0.18", @@ -2210,6 +2210,17 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "getrandom" version = "0.3.4" @@ -2278,7 +2289,7 @@ dependencies = [ "bytemuck", "encase", "libm", - "rand", + "rand 0.9.4", "serde_core", ] @@ -3634,14 +3645,35 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "019b4b213425016d7d84a153c4c73afb0946fbb4840e4eece7ba8848b9d6da22" +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + [[package]] name = "rand" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ - "rand_chacha", - "rand_core", + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", ] [[package]] @@ -3651,7 +3683,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", ] [[package]] @@ -3670,7 +3711,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand", + "rand 0.9.4", ] [[package]] @@ -3880,6 +3921,7 @@ dependencies = [ name = "rusty_engine_tutorial" version = "0.1.0" dependencies = [ + "rand 0.8.6", "rusty_engine", ] @@ -4509,6 +4551,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + [[package]] name = "wasip2" version = "1.0.3+wasi-0.2.9" diff --git a/Cargo.toml b/Cargo.toml index d3b48cb..5e80761 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2024" [dependencies] rusty_engine = "7.0.0" +rand = "0.8" [profile.dev] opt-level = 3 diff --git a/src/main.rs b/src/main.rs index b1d0bc6..dc99bd9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,143 @@ +use rand::prelude::*; use rusty_engine::prelude::*; +#[derive(Resource)] +struct GameState { + high_score: u32, + score: u32, + enemy_index: i32, + spawn_timer: Timer, +} + +impl Default for GameState { + fn default() -> Self { + Self { + high_score: 0, + score: 0, + enemy_index: 0, + spawn_timer: Timer::from_seconds(2.0, TimerMode::Repeating), + } + } +} + fn main() { let mut game = Game::new(); - // setup game here + game.window_settings(Window { + title: "Rusty Engine Tutorial".to_string(), + ..Default::default() + }); - game.run(()); + game.audio_manager + .play_music(MusicPreset::WhimsicalPopsicle, 0.2); + + let player = game.add_sprite("player", SpritePreset::RacingCarBlue); + player.collision = true; + // player.translation = Vec2::new(200.0, 100.0); + // player.rotation = UP; + // player.scale = 3.0; + // player.layer = 0.0; + + let score = game.add_text("score", "Score: 0"); + score.translation = Vec2::new(520.0, 320.0); + + let high_score = game.add_text("high_score", "High Score: 0"); + high_score.translation = Vec2::new(-520.0, 320.0); + + game.add_logic(game_logic); + game.run(GameState::default()); +} + +fn game_logic(engine: &mut Engine, game_state: &mut GameState) { + if engine.keyboard_state.just_pressed(KeyCode::KeyQ) { + engine.should_exit = true; + } + + let offset = ((engine.time_since_startup_f64 * 3.0).cos() * 5.0) as f32; + + let score = engine.texts.get_mut("score").unwrap(); + score.translation.x = engine.window_dimensions.x / 2.0 - 80.0; + score.translation.y = engine.window_dimensions.y / 2.0 - 30.0 + offset; + let high_score = engine.texts.get_mut("high_score").unwrap(); + high_score.translation.x = -engine.window_dimensions.x / 2.0 + 110.0; + high_score.translation.y = engine.window_dimensions.y / 2.0 - 30.0; + + // game_state.current_score += 1; + // println!("Current Score: {}", game_state.current_score); + engine.show_colliders = true; + + for event in engine.collision_events.drain(..) { + println!( + "Collision detected between {} and {}", + event.pair.0, event.pair.1 + ); + + if event.state == CollisionState::Begin && event.pair.one_starts_with("player") { + for label in [event.pair.0, event.pair.1] { + if label != "player" { + engine.sprites.remove(&label); + } + } + + game_state.score += 1; + let score = engine.texts.get_mut("score").unwrap(); + score.value = format!("Current Score: {}", game_state.score); + + if game_state.score > game_state.high_score { + game_state.high_score = game_state.score; + let high_score = engine.texts.get_mut("high_score").unwrap(); + high_score.value = format!("High Score: {}", game_state.high_score); + } + + engine.audio_manager.play_sfx(SfxPreset::Minimize1, 0.5); + } + } + + const MOVEMENT_SPEED: f32 = 100.0; + let player = engine.sprites.get_mut("player").unwrap(); + if engine + .keyboard_state + .pressed_any(&[KeyCode::KeyW, KeyCode::ArrowUp]) + { + player.translation.y += MOVEMENT_SPEED * engine.delta_f32; + } + if engine + .keyboard_state + .pressed_any(&[KeyCode::KeyS, KeyCode::ArrowDown]) + { + player.translation.y -= MOVEMENT_SPEED * engine.delta_f32; + } + if engine + .keyboard_state + .pressed_any(&[KeyCode::KeyD, KeyCode::ArrowRight]) + { + player.translation.x += MOVEMENT_SPEED * engine.delta_f32; + } + if engine + .keyboard_state + .pressed_any(&[KeyCode::KeyA, KeyCode::ArrowLeft]) + { + player.translation.x -= MOVEMENT_SPEED * engine.delta_f32; + } + + if game_state.spawn_timer.tick(engine.delta).just_finished() { + let enemy_label = format!("enemy_{}", game_state.enemy_index); + game_state.enemy_index += 1; + + let enemy = engine.add_sprite(&enemy_label, SpritePreset::RacingCarGreen); + enemy.translation.x = thread_rng().gen_range(-550.0..550.0); + enemy.translation.y = thread_rng().gen_range(-300.0..300.0); + enemy.collision = true; + } + + // if engine.mouse_state.just_pressed(MouseButton::Left) { + // if let Some(mouse_location) = engine.mouse_state.location() { + // } + // } + + if engine.keyboard_state.just_pressed(KeyCode::KeyR) { + game_state.score = 0; + let score = engine.texts.get_mut("score").unwrap(); + score.value = format!("Current Score: {}", game_state.score); + } }