render 5 segments and despawn

This commit is contained in:
Mikkel Troels Kongsted 2026-04-09 16:15:28 +02:00
parent 651138a249
commit bf3b8275ac
3 changed files with 181 additions and 16 deletions

118
game/Cargo.lock generated
View File

@ -8,6 +8,23 @@ version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" 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]] [[package]]
name = "lazy_static" name = "lazy_static"
version = "1.5.0" version = "1.5.0"
@ -20,6 +37,63 @@ version = "0.2.183"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" 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]] [[package]]
name = "sdl3" name = "sdl3"
version = "0.17.3" version = "0.17.3"
@ -42,5 +116,49 @@ checksum = "1d73fc820b0b6b9bd0557de7b799ec9da1ca4f35fcd1cb42f7ceb85e640d1477"
name = "skate-slope" name = "skate-slope"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"rand",
"sdl3", "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",
]

View File

@ -5,3 +5,4 @@ edition = "2021"
[dependencies] [dependencies]
sdl3 = "0.17.3" sdl3 = "0.17.3"
rand = "0.8"

View File

@ -2,6 +2,7 @@
mod engine; mod engine;
mod server; mod server;
use rand::Rng;
use core::panic; use core::panic;
use std::{ use std::{
@ -154,7 +155,6 @@ struct Game {
skateboard: Skateboard, skateboard: Skateboard,
segments: Vec<Segment>, segments: Vec<Segment>,
camera_pos: V3, camera_pos: V3,
next_object_id: u32,
keys_pressed: HashSet<Key>, keys_pressed: HashSet<Key>,
} }
@ -173,7 +173,6 @@ impl Game {
}, },
camera_pos: V3(0.0, 0.0, -1.0), camera_pos: V3(0.0, 0.0, -1.0),
segments: Vec::new(), segments: Vec::new(),
next_object_id: 0,
keys_pressed: HashSet::new(), keys_pressed: HashSet::new(),
} }
} }
@ -186,7 +185,7 @@ impl Game {
let index = self let index = self
.segments .segments
.iter() .iter()
.position(|o| o.id == id) .position(|s| s.id == id)
.expect("doesn't exist"); .expect("doesn't exist");
self.segments.remove(index); self.segments.remove(index);
} }
@ -222,7 +221,22 @@ impl<R: Renderer> engine::Game<R> for Game {
.segments .segments
.iter() .iter()
.enumerate() .enumerate()
.map(|(i, object)| (i, object.id)) .map(|(i, segment)| (i, segment.id))
.rev()
.collect::<Vec<_>>();
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::<Vec<_>>(); .collect::<Vec<_>>();
let mut cx = UpdateCx { let mut cx = UpdateCx {
@ -230,9 +244,8 @@ impl<R: Renderer> engine::Game<R> for Game {
}; };
for (i, id) in ids { for (i, id) in ids {
let object = &mut self.segments[i]; let segment = &mut self.segments[i];
segment.update(&mut cx, delta_time);
object.update(&mut cx, delta_time);
} }
} }
@ -252,19 +265,21 @@ impl<R: Renderer> engine::Game<R> for Game {
}; };
} }
} }
#[derive(Clone, Copy)]
struct Obstacle { struct Obstacle {
pos: V3, pos: V3,
vel: V3, vel: V3,
size: V3, size: V3,
} }
#[derive(Clone, Copy)]
struct Ground { struct Ground {
pos: V3, pos: V3,
rot: V3, rot: V3,
grid_item_size: f64, grid_item_size: f64,
grid_width: i32, grid_width: i32,
grid_depth: i32, grid_depth: i32,
render_depth: i32,
} }
struct Segment { struct Segment {
@ -306,11 +321,9 @@ impl Segment {
} }
} }
if cx.skateboard.pos.2 if cx.skateboard.pos.2
>= cx.skateboard.start_pos.2 >= self.ground.pos.2 + self.ground.grid_depth as f64 * self.ground.grid_item_size as f64
+ self.ground.grid_depth as f64 * self.ground.grid_item_size as f64
{ {
cx.skateboard.pos.2 -= self.should_despawn = true
self.ground.grid_depth as f64 * self.ground.grid_item_size as f64;
} }
} }
@ -395,11 +408,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
}) })
.unwrap(); .unwrap();
}); });
t.join().unwrap();
let mut sdl_io = engine::SdlIo::new()?; let mut sdl_io = engine::SdlIo::new()?;
let mut game = Game::new(); let mut game = Game::new();
let segments: Vec<Segment> = vec![Segment::new(
let first_segment: Segment = Segment::new(
0, 0,
vec![Obstacle { vec![Obstacle {
pos: V3(0.0, -0.248, 1.0), pos: V3(0.0, -0.248, 1.0),
@ -412,9 +425,42 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
grid_item_size: 0.1, grid_item_size: 0.1,
grid_width: 10, grid_width: 10,
grid_depth: 20, grid_depth: 20,
render_depth: 5,
}, },
)]; );
let mut rng = rand::thread_rng();
let mut segments: Vec<Segment> = 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 { for segment in segments {
game.spawn(segment); game.spawn(segment);