Complete tutorial
This commit is contained in:
60
Cargo.lock
generated
60
Cargo.lock
generated
@@ -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"
|
||||
|
||||
@@ -5,6 +5,7 @@ edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
rusty_engine = "7.0.0"
|
||||
rand = "0.8"
|
||||
|
||||
[profile.dev]
|
||||
opt-level = 3
|
||||
|
||||
138
src/main.rs
138
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user