partial chunking

This commit is contained in:
StephenAdamson
2025-01-07 21:35:44 +00:00
parent 11ba882d54
commit ed88d5bdce
8 changed files with 305 additions and 120 deletions
+51 -1
View File
@@ -1,4 +1,7 @@
use std::process::exit;
use bevy::prelude::*;
use camera::PanningCamera;
mod camera;
mod citizen;
@@ -7,6 +10,7 @@ mod cursor;
mod game;
mod item;
mod tile;
mod tilemap;
mod tiles;
fn main() {
@@ -24,12 +28,14 @@ fn main() {
.set(ImagePlugin::default_nearest()),
)
.insert_resource(ClearColor(Color::srgb(0.0, 0.0, 0.0)))
.add_plugins(tilemap::TilemapPlugin)
.add_systems(
Startup,
(
game::setup_level,
setup_initial_chunks,
camera::spawn_panning_camera,
cursor::setup_cursor,
citizen::spawn_citizens, // New citizen spawning system
),
)
.add_systems(
@@ -47,6 +53,8 @@ fn main() {
camera::camera_movement,
citizen::citizen_movement,
cursor::move_cursor,
check_camera_position_for_chunks,
citizen::check_citizen_positions_for_chunks, // New citizen-based chunk loading system
),
)
.init_resource::<tile::CameraMoved>()
@@ -60,3 +68,45 @@ fn main() {
)
.run();
}
fn setup_initial_chunks(mut event_writer: EventWriter<tilemap::LoadChunkEvent>) {
// Spawn a 3x3 grid of chunks around the origin
for x in -1..=1 {
for y in -1..=1 {
println!("setup_initial_chunks: x = {}, y = {}", x, y);
event_writer.send(tilemap::LoadChunkEvent {
chunk_position: IVec2::new(x, y),
});
}
}
}
// New system to check camera position and load nearby chunks
fn check_camera_position_for_chunks(
camera_query: Query<&Transform, With<Camera>>,
chunk_map: Res<tilemap::ChunkMap>,
mut event_writer: EventWriter<tilemap::LoadChunkEvent>,
) {
let camera_transform = camera_query.single();
let camera_pos = camera_transform.translation;
// Convert camera position to chunk coordinates
let chunk_x =
(camera_pos.x / (tilemap::CHUNK_SIZE as f32 * constants::TILE_SIZE)).floor() as i32;
let chunk_y =
(camera_pos.y / (tilemap::CHUNK_SIZE as f32 * constants::TILE_SIZE)).floor() as i32;
// Check a 3x3 area around the camera's current chunk
for x in (chunk_x - 1)..=(chunk_x + 1) {
for y in (chunk_y - 1)..=(chunk_y + 1) {
let chunk_pos = IVec2::new(x, y);
// Only spawn new chunks if they haven't been loaded yet
if !chunk_map.loaded_chunks.contains_key(&chunk_pos) {
event_writer.send(tilemap::LoadChunkEvent {
chunk_position: chunk_pos,
});
}
}
}
}