diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-16 02:02:14 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-16 02:02:14 +0200 |
commit | 1ab54f3155eff431fb1bd65a0bcad71701e9d9b5 (patch) | |
tree | 8f58d6846a45db402cf167f62960ae6647ebd8d8 /light-client/src/tilemap.rs | |
parent | 1671370f1e95b3ae0cdede6e16511fd91ea4feac (diff) | |
download | hurrycurry-1ab54f3155eff431fb1bd65a0bcad71701e9d9b5.tar hurrycurry-1ab54f3155eff431fb1bd65a0bcad71701e9d9b5.tar.bz2 hurrycurry-1ab54f3155eff431fb1bd65a0bcad71701e9d9b5.tar.zst |
render connected tiles
Diffstat (limited to 'light-client/src/tilemap.rs')
-rw-r--r-- | light-client/src/tilemap.rs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/light-client/src/tilemap.rs b/light-client/src/tilemap.rs new file mode 100644 index 00000000..cd0f13ac --- /dev/null +++ b/light-client/src/tilemap.rs @@ -0,0 +1,77 @@ +use crate::sprite_renderer::SpriteRenderer; +use hurrycurry_protocol::{glam::IVec2, TileIndex}; +use sdl2::rect::{FRect, Rect}; +use std::collections::HashMap; + +#[derive(Default)] +pub struct Tilemap { + tile_srcs: Vec<[Rect; 16]>, + tiles: HashMap<IVec2, (Rect, FRect)>, +} + +impl Tilemap { + pub fn init(&mut self, tile_names: &[String], sprite_rects: &HashMap<String, Rect>) { + self.tile_srcs = tile_names + .iter() + .map(|name| { + let fallback = sprite_rects + .get(&format!("{name}+a")) + .copied() + .unwrap_or(Rect::new(0, 0, 0, 0)); + + [ + sprite_rects.get(&format!("{name}+")), + sprite_rects.get(&format!("{name}+w")), + sprite_rects.get(&format!("{name}+e")), + sprite_rects.get(&format!("{name}+we")), + sprite_rects.get(&format!("{name}+n")), + sprite_rects.get(&format!("{name}+wn")), + sprite_rects.get(&format!("{name}+en")), + sprite_rects.get(&format!("{name}+wen")), + sprite_rects.get(&format!("{name}+s")), + sprite_rects.get(&format!("{name}+ws")), + sprite_rects.get(&format!("{name}+es")), + sprite_rects.get(&format!("{name}+wes")), + sprite_rects.get(&format!("{name}+ns")), + sprite_rects.get(&format!("{name}+wns")), + sprite_rects.get(&format!("{name}+ens")), + sprite_rects.get(&format!("{name}+wens")), + ] + .map(|e| e.copied().unwrap_or(fallback)) + }) + .collect(); + } + + pub fn set(&mut self, pos: IVec2, tile: Option<TileIndex>, neighbors: [Option<TileIndex>; 4]) { + let Some(tile) = tile else { + self.tiles.remove(&pos); + return; + }; + + let mut idx = 0; + idx |= 0b0100 * (Some(tile) == neighbors[0]) as usize; + idx |= 0b0001 * (Some(tile) == neighbors[1]) as usize; + idx |= 0b1000 * (Some(tile) == neighbors[2]) as usize; + idx |= 0b0010 * (Some(tile) == neighbors[3]) as usize; + + let src = self.tile_srcs[tile.0][idx]; + self.tiles.insert( + pos, + ( + src, + FRect::new( + pos.x as f32, + pos.y as f32 + 1. - src.height() as f32 / 24., + src.width() as f32 / 32., + src.height() as f32 / 24., + ), + ), + ); + } + + pub fn draw(&self, ctx: &mut SpriteRenderer) { + for &(src, dst) in self.tiles.values() { + ctx.draw(((dst.y + dst.h) * 32.) as i32, src, dst); + } + } +} |