Skip to content

Commit

Permalink
Code generalization
Browse files Browse the repository at this point in the history
  • Loading branch information
Zac8668 committed Jan 4, 2024
1 parent 794983c commit 09fc762
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 77 deletions.
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
world
/target
.vscode/
.vscode/
/assets/worlds/**
96 changes: 33 additions & 63 deletions src/chunk_manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,12 @@ pub struct ChunkManager {
pub dt: u8,
}

//If true the direction is 1, if false the direction is -1
pub enum MoveDir {
X(i32),
Y(i32),
}

impl ChunkManager {
pub fn get_atom(&self, pos: &ChunkPos) -> Option<&Atom> {
if let Some(chunk) = self.chunks.get(&pos.chunk) {
Expand All @@ -35,72 +41,37 @@ impl ChunkManager {
}

//Still needs to save file chunks to file after this function is called
pub fn move_x(
pub fn move_manager(
&mut self,
commands: &mut Commands,
images: &mut ResMut<Assets<Image>>,
chunk_textures: &Entity,
image_entities: &Query<(&Parent, Entity, &Handle<Image>)>,
file_chunks: &mut HashMap<IVec2, Chunk>,
dir: i32,
move_dir: MoveDir,
) {
let mut images_vec = vec![];
let mut to_remove = vec![];
for i in 0..LOAD_HEIGHT {
{
//Save far chunks
let pos = self.pos + ivec2(if dir == -1 { LOAD_WIDTH - 1 } else { 0 }, i);
let changed_chunk = self.chunks.remove(&pos).unwrap();

to_remove.push(changed_chunk.texture.clone());
images.remove(changed_chunk.texture.clone());

if let Some(chunk) = file_chunks.get_mut(&pos) {
*chunk = changed_chunk;
} else {
file_chunks.insert(pos, changed_chunk);
}
let (for_load, vec_load, dir, y) = match move_dir {
MoveDir::X(dir) => {
self.pos.x += dir;
(LOAD_HEIGHT, LOAD_WIDTH, dir, false)
}

{
//Load new chunks
let pos = self.pos + ivec2(if dir == 1 { LOAD_WIDTH } else { dir }, i);
let chunk = if let Some(file_chunk) = file_chunks.get(&pos) {
file_chunk.clone()
} else {
Chunk::new(Handle::default(), pos)
};

images_vec.push(add_chunk(commands, images, self, chunk, pos));
MoveDir::Y(dir) => {
self.pos.y += dir;
(LOAD_WIDTH, LOAD_HEIGHT, dir, true)
}
}

for (parent, ent, handle) in image_entities.iter() {
if parent.get() == *chunk_textures && to_remove.contains(handle) {
commands.get_entity(ent).unwrap().despawn();
}
}
let mut chunk_textures = commands.get_entity(*chunk_textures).unwrap();
chunk_textures.insert_children(0, &images_vec);

self.pos += ivec2(dir, 0);
}
};

pub fn move_y(
&mut self,
commands: &mut Commands,
images: &mut ResMut<Assets<Image>>,
chunk_textures: &Entity,
image_entities: &Query<(&Parent, Entity, &Handle<Image>)>,
mut file_chunks: HashMap<IVec2, Chunk>,
dir: i32,
) {
let mut images_vec = vec![];
let mut to_remove = vec![];
for i in 0..LOAD_WIDTH {
for i in 0..for_load {
{
//Save far chunks
let pos = self.pos + ivec2(i, if dir == -1 { LOAD_HEIGHT - 1 } else { 0 });
let mut to_add = ivec2(if dir == -1 { vec_load } else { -1 }, i);
if y {
to_add = to_add.yx()
}
let pos = self.pos + to_add;

let changed_chunk = self.chunks.remove(&pos).unwrap();
to_remove.push(changed_chunk.texture.clone());
images.remove(changed_chunk.texture.clone());
Expand All @@ -114,7 +85,12 @@ impl ChunkManager {

{
//Load new chunks
let pos = self.pos + ivec2(i, if dir == 1 { LOAD_HEIGHT } else { dir });
let mut to_add = ivec2(if dir == 1 { vec_load - 1 } else { 0 }, i);
if y {
to_add = to_add.yx()
}
let pos = self.pos + to_add;

let chunk = if let Some(file_chunk) = file_chunks.get(&pos) {
file_chunk.clone()
} else {
Expand All @@ -124,20 +100,14 @@ impl ChunkManager {
images_vec.push(add_chunk(commands, images, self, chunk, pos));
}
}
//Save file
let mut f = BufWriter::new(File::open("world").unwrap());
serialize_into(&mut f, &file_chunks).unwrap();

for (parent, ent, handle) in image_entities.iter() {
if parent.get() == *chunk_textures && to_remove.contains(handle) {
commands.get_entity(ent).unwrap().despawn();
}
}

let mut chunk_textures = commands.get_entity(*chunk_textures).unwrap();
chunk_textures.insert_children(0, &images_vec);

self.pos += ivec2(dir, 0);
}
}

Expand Down Expand Up @@ -244,7 +214,7 @@ pub fn manager_setup(
let (width, height) = (LOAD_WIDTH, LOAD_HEIGHT);

let mut images_vec = vec![];
chunk_manager.pos = ivec2(-16, 0);
chunk_manager.pos = ivec2(-16, -16);
for (x, y) in (chunk_manager.pos.x..chunk_manager.pos.x + width)
.cartesian_product(chunk_manager.pos.y..chunk_manager.pos.y + height)
{
Expand Down Expand Up @@ -587,7 +557,7 @@ fn prepare_chunk_gpu_textures(

pub fn save_to_file(chunk_manager: Res<ChunkManager>, input: Res<Input<KeyCode>>) {
if input.just_pressed(KeyCode::K) {
let file = File::open("world").unwrap_or(File::create("world").unwrap());
let file = File::open("assets/worlds/world").unwrap_or(File::create("assets/worlds/world").unwrap());
let mut file_chunks: HashMap<IVec2, Chunk> =
bincode::deserialize_from(BufReader::new(file)).unwrap_or_default();

Expand All @@ -599,7 +569,7 @@ pub fn save_to_file(chunk_manager: Res<ChunkManager>, input: Res<Input<KeyCode>>
}
}

let mut f = BufWriter::new(File::open("world").unwrap());
let mut f = BufWriter::new(File::open("assets/worlds/world").unwrap());
serialize_into(&mut f, &file_chunks).unwrap();
}
}
Expand All @@ -618,7 +588,7 @@ pub fn load_from_file(
chunk_manager.chunks = HashMap::new();

chunk_manager.chunks = HashMap::new();
let file = File::open("world").unwrap();
let file = File::open("assets/worlds/world").unwrap();
let file_chunks: HashMap<IVec2, Chunk> =
bincode::deserialize_from(BufReader::new(file)).unwrap();

Expand Down
38 changes: 26 additions & 12 deletions src/player.rs
Original file line number Diff line number Diff line change
Expand Up @@ -261,14 +261,18 @@ pub fn update_player_sprite(

pub fn send_manager_task(
mut commands: Commands,
mut images: ResMut<Assets<Image>>,
chunk_textures: Query<Entity, With<ChunkTextures>>,
image_entities: Query<(&Parent, Entity, &Handle<Image>)>,
mut chunk_manager: ResMut<ChunkManager>,
player: Query<&Actor, With<Player>>,
resources: (
ResMut<SavingTask>,
ResMut<ChunkManager>,
ResMut<Assets<Image>>,
),
mut task_executor: AsyncTaskRunner<(HashMap<IVec2, Chunk>, IVec2)>,
mut saving_task: ResMut<SavingTask>
) {
let (mut saving_task, mut chunk_manager, mut images) = resources;

let mut player_pos = player.single().pos;
if player_pos.x < 0 {
player_pos.x -= CHUNK_LENGHT as i32
Expand All @@ -292,38 +296,47 @@ pub fn send_manager_task(
}
}

if new_diff.x != 0 {
if new_diff != IVec2::ZERO {
task_executor.start(async move {
let file = fs::read("world").unwrap_or_default();
let file = fs::read("assets/worlds/world").unwrap_or_default();
let chunks: HashMap<IVec2, Chunk> =
bincode::deserialize(&file).unwrap_or_default();
(chunks, new_diff)
});
}
}
AsyncTaskStatus::Pending => {
return;
}
AsyncTaskStatus::Finished((mut file, diff)) => {
let chunk_textures = chunk_textures.single();
for _ in 0..diff.x.abs() {
chunk_manager.move_x(
chunk_manager.move_manager(
&mut commands,
&mut images,
&chunk_textures,
&image_entities,
&mut file,
MoveDir::X(diff.x.signum()),
);
}

for _ in 0..diff.y.abs() {
chunk_manager.move_manager(
&mut commands,
&mut images,
&chunk_textures,
&image_entities,
&mut file,
diff.x.signum(),
MoveDir::Y(diff.y.signum()),
);
}

let pool = AsyncComputeTaskPool::get();
saving_task.0 = Some(pool.spawn(async move {
let data = bincode::serialize(&file).unwrap();
//Save file
let _ = File::create("world").unwrap().write(&data).unwrap();
let _ = File::create("assets/worlds/world").unwrap().write(&data).unwrap();
}));
}
AsyncTaskStatus::Pending => {}
}
}

Expand All @@ -340,7 +353,8 @@ impl Plugin for PlayerPlugin {
update_player_sprite.after(update_actors),
send_manager_task,
),
).insert_resource(SavingTask::default())
)
.insert_resource(SavingTask::default())
.add_systems(PostStartup, player_setup.after(manager_setup));
}
}

0 comments on commit 09fc762

Please sign in to comment.