ground shufflin'

This commit is contained in:
Theis Pieter Hollebeek 2026-04-10 16:22:37 +02:00 committed by Mikkel Troels Kongsted
parent c9bc1b60c3
commit 185e1bb4a9

View File

@ -6,7 +6,7 @@ use rand::Rng;
use core::panic; use core::panic;
use std::{ use std::{
collections::{HashSet, VecDeque}, collections::{vec_deque, HashSet, VecDeque},
f64::consts::PI, f64::consts::PI,
sync::{Arc, Mutex}, sync::{Arc, Mutex},
thread, thread,
@ -18,6 +18,16 @@ use crate::{
server::Server, server::Server,
}; };
struct SegmentFactory;
trait SegmentKind {
fn obstacles(self) -> Vec<Obstacle>;
}
impl SegmentFactory {
fn new() {}
}
struct Skateboard { struct Skateboard {
start_pos: V3, start_pos: V3,
pos: V3, pos: V3,
@ -34,7 +44,9 @@ impl Skateboard {
self.vel.0 = self.pivot_deg * 2.0 * delta_time.as_secs_f64(); self.vel.0 = self.pivot_deg * 2.0 * delta_time.as_secs_f64();
self.pos += self.vel * delta_time.as_secs_f64(); self.pos += self.vel * delta_time.as_secs_f64();
self.nyoom_factor += 16.0 * delta_time.as_secs_f64(); self.nyoom_factor += 16.0 * delta_time.as_secs_f64();
self.pos.0 = self.pos.0.clamp(-0.5 + 0.05, 0.5 - 0.05); if self.pos.0 < -0.5 || self.pos.0 > 0.5 {
panic!("LLLLL");
}
} }
fn render(&self, scene: &mut Scene) { fn render(&self, scene: &mut Scene) {
@ -159,6 +171,48 @@ struct Game {
camera_pos: V3, camera_pos: V3,
keys_pressed: HashSet<Key>, keys_pressed: HashSet<Key>,
event_queue: Arc<Mutex<VecDeque<f64>>>, event_queue: Arc<Mutex<VecDeque<f64>>>,
ground: GroundMicroManager,
}
struct GroundMicroManager {
ground: VecDeque<Ground>,
start_position: V3,
grid_item_size: f64,
grid_width: i32,
grid_depth: i32,
}
impl GroundMicroManager {
pub fn new(start_position: V3, grid_item_size: f64, grid_width: i32, grid_depth: i32) -> Self {
let mut ground = VecDeque::new();
for i in 0..3 {
ground.push_back(Ground {
grid_width,
grid_depth,
grid_item_size,
position: start_position
+ V3(0.0, 0.0, grid_depth as f64 * grid_item_size * i as f64),
});
}
Self {
start_position,
grid_depth,
grid_width,
grid_item_size,
ground,
}
}
pub fn shuffle(&mut self) {
let mut first = self.ground.pop_front().unwrap();
let last = self.ground.back().unwrap();
first.position = last.position + V3(0.0, 0.0, self.grid_depth as f64 * self.grid_item_size);
self.ground.push_back(first);
}
pub fn should_shuffle(&self, z: f64) -> bool {
let first = self.ground.front().unwrap();
first.position.2 + self.grid_depth as f64 * self.grid_item_size > z
}
} }
impl Game { impl Game {
@ -176,9 +230,10 @@ impl Game {
pivot_deg_target: 0.0, pivot_deg_target: 0.0,
}, },
event_queue: Arc::new(Mutex::new(VecDeque::new())), event_queue: Arc::new(Mutex::new(VecDeque::new())),
camera_pos: V3(0.0, 0.0, -0.6), camera_pos: V3(0.0, 0.0, 0.0),
segments: Vec::new(), segments: Vec::new(),
keys_pressed: HashSet::new(), keys_pressed: HashSet::new(),
ground: GroundMicroManager::new(V3(0.0, -0.25, -0.4), 0.1, 10, 20),
} }
} }
@ -204,6 +259,9 @@ impl<R: Renderer> engine::Game<R> for Game {
self.skateboard.pos.1 + 0.15, self.skateboard.pos.1 + 0.15,
self.skateboard.pos.2 - 0.4, self.skateboard.pos.2 - 0.4,
); );
if self.ground.should_shuffle(self.skateboard.pos.2) {
self.ground.shuffle();
}
// if self.keys_pressed.contains(&Key::Left) == self.keys_pressed.contains(&Key::Right) { // if self.keys_pressed.contains(&Key::Left) == self.keys_pressed.contains(&Key::Right) {
// let decay_rate = 1.0 - (4.0 * delta_time.as_secs_f64()); // let decay_rate = 1.0 - (4.0 * delta_time.as_secs_f64());
@ -296,8 +354,7 @@ struct Obstacle {
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
struct Ground { struct Ground {
pos: V3, position: V3,
rot: V3,
grid_item_size: f64, grid_item_size: f64,
grid_width: i32, grid_width: i32,
grid_depth: i32, grid_depth: i32,
@ -306,7 +363,6 @@ struct Ground {
struct Segment { struct Segment {
id: i32, id: i32,
obstacles: Vec<Obstacle>, obstacles: Vec<Obstacle>,
ground: Ground,
should_despawn: bool, should_despawn: bool,
} }
@ -315,7 +371,6 @@ impl Segment {
Self { Self {
id, id,
obstacles, obstacles,
ground,
should_despawn: false, should_despawn: false,
} }
} }
@ -341,11 +396,6 @@ impl Segment {
panic!("You lost 🫵 😂"); panic!("You lost 🫵 😂");
} }
} }
if cx.skateboard.pos.2
>= self.ground.pos.2 + self.ground.grid_depth as f64 * self.ground.grid_item_size as f64
{
self.should_despawn = true
}
} }
fn render(&self, scene: &mut Scene) { fn render(&self, scene: &mut Scene) {
@ -442,13 +492,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
vel: V3(0.0, 0.0, 0.0), vel: V3(0.0, 0.0, 0.0),
size: V3(0.1, 0.1, 0.1), size: V3(0.1, 0.1, 0.1),
}], }],
Ground {
pos: V3(0.0, -0.25, -0.4),
rot: V3(0.0, 0.0, 0.0),
grid_item_size: 0.1,
grid_width: 10,
grid_depth: 20,
},
); );
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
@ -467,21 +510,6 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
vel: obstacle.vel, vel: obstacle.vel,
size: obstacle.size, 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,
},
)) ))
} }