From bf3b8275ac4a15abab46cd470d67bab4a3f2ccb3 Mon Sep 17 00:00:00 2001 From: Mikkel Troels Kongsted Date: Thu, 9 Apr 2026 16:15:28 +0200 Subject: [PATCH] render 5 segments and despawn --- game/Cargo.lock | 118 +++++++++++++++++++++++++++++++++++++++++++++++ game/Cargo.toml | 1 + game/src/main.rs | 78 ++++++++++++++++++++++++------- 3 files changed, 181 insertions(+), 16 deletions(-) diff --git a/game/Cargo.lock b/game/Cargo.lock index 399e5b4..0d7efc4 100644 --- a/game/Cargo.lock +++ b/game/Cargo.lock @@ -8,6 +8,23 @@ version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[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 = "lazy_static" version = "1.5.0" @@ -20,6 +37,63 @@ version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[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", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "sdl3" version = "0.17.3" @@ -42,5 +116,49 @@ checksum = "1d73fc820b0b6b9bd0557de7b799ec9da1ca4f35fcd1cb42f7ceb85e640d1477" name = "skate-slope" version = "0.1.0" dependencies = [ + "rand", "sdl3", ] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/game/Cargo.toml b/game/Cargo.toml index 0ec6a64..ef3aa1c 100644 --- a/game/Cargo.toml +++ b/game/Cargo.toml @@ -5,3 +5,4 @@ edition = "2021" [dependencies] sdl3 = "0.17.3" +rand = "0.8" diff --git a/game/src/main.rs b/game/src/main.rs index 7bc504a..c422249 100644 --- a/game/src/main.rs +++ b/game/src/main.rs @@ -2,6 +2,7 @@ mod engine; mod server; +use rand::Rng; use core::panic; use std::{ @@ -154,7 +155,6 @@ struct Game { skateboard: Skateboard, segments: Vec, camera_pos: V3, - next_object_id: u32, keys_pressed: HashSet, } @@ -173,7 +173,6 @@ impl Game { }, camera_pos: V3(0.0, 0.0, -1.0), segments: Vec::new(), - next_object_id: 0, keys_pressed: HashSet::new(), } } @@ -186,7 +185,7 @@ impl Game { let index = self .segments .iter() - .position(|o| o.id == id) + .position(|s| s.id == id) .expect("doesn't exist"); self.segments.remove(index); } @@ -222,7 +221,22 @@ impl engine::Game for Game { .segments .iter() .enumerate() - .map(|(i, object)| (i, object.id)) + .map(|(i, segment)| (i, segment.id)) + .rev() + .collect::>(); + + for (i, id) in ids { + let segment = &self.segments[i]; + if segment.should_despawn { + self.despawn(segment.id); + } + } + + let ids = self + .segments + .iter() + .enumerate() + .map(|(i, segment)| (i, segment.id)) .collect::>(); let mut cx = UpdateCx { @@ -230,9 +244,8 @@ impl engine::Game for Game { }; for (i, id) in ids { - let object = &mut self.segments[i]; - - object.update(&mut cx, delta_time); + let segment = &mut self.segments[i]; + segment.update(&mut cx, delta_time); } } @@ -252,19 +265,21 @@ impl engine::Game for Game { }; } } +#[derive(Clone, Copy)] struct Obstacle { pos: V3, vel: V3, size: V3, } +#[derive(Clone, Copy)] + struct Ground { pos: V3, rot: V3, grid_item_size: f64, grid_width: i32, grid_depth: i32, - render_depth: i32, } struct Segment { @@ -306,11 +321,9 @@ impl Segment { } } if cx.skateboard.pos.2 - >= cx.skateboard.start_pos.2 - + self.ground.grid_depth as f64 * self.ground.grid_item_size as f64 + >= self.ground.pos.2 + self.ground.grid_depth as f64 * self.ground.grid_item_size as f64 { - cx.skateboard.pos.2 -= - self.ground.grid_depth as f64 * self.ground.grid_item_size as f64; + self.should_despawn = true } } @@ -395,11 +408,11 @@ fn main() -> Result<(), Box> { }) .unwrap(); }); - t.join().unwrap(); let mut sdl_io = engine::SdlIo::new()?; let mut game = Game::new(); - let segments: Vec = vec![Segment::new( + + let first_segment: Segment = Segment::new( 0, vec![Obstacle { pos: V3(0.0, -0.248, 1.0), @@ -412,9 +425,42 @@ fn main() -> Result<(), Box> { grid_item_size: 0.1, grid_width: 10, grid_depth: 20, - render_depth: 5, }, - )]; + ); + let mut rng = rand::thread_rng(); + + let mut segments: Vec = Vec::new(); + for i in 0..5 { + let ground = first_segment.ground; + let obstacle = first_segment.obstacles[0]; + segments.push(Segment::new( + first_segment.id + i, + vec![Obstacle { + pos: V3( + obstacle.pos.0 + rng.gen_range(-0.5..0.5), + obstacle.pos.1, + obstacle.pos.2 + obstacle.pos.2 * i as f64, + ), + vel: obstacle.vel, + size: obstacle.size, + }], + Ground { + pos: V3( + ground.pos.0, + ground.pos.1, + ground.pos.2 + + ground.grid_depth as f64 + * ground.grid_item_size + * ground.pos.2.abs() + * i as f64, + ), + rot: ground.rot, + grid_item_size: ground.grid_item_size, + grid_width: ground.grid_width, + grid_depth: ground.grid_depth, + }, + )) + } for segment in segments { game.spawn(segment);