From 150233728c892cefbb7f32566773388114005d84 Mon Sep 17 00:00:00 2001 From: dani Date: Sun, 2 Jul 2023 07:40:29 +0000 Subject: [PATCH] added tileset support --- examples/assets/ega-8x14.gif | Bin 0 -> 3536 bytes examples/test.rs | 4 ++- src/image.rs | 11 ++++++--- src/lib.rs | 3 ++- src/tileset.rs | 46 +++++++++++++++++++++++++++++++++-- 5 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 examples/assets/ega-8x14.gif diff --git a/examples/assets/ega-8x14.gif b/examples/assets/ega-8x14.gif new file mode 100644 index 0000000000000000000000000000000000000000..c4b24c5d0c5e7564d77c23eced1a48cd8618e75c GIT binary patch literal 3536 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 literal 0 HcmV?d00001 diff --git a/examples/test.rs b/examples/test.rs index 9ca96ee..cb08283 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -5,6 +5,7 @@ const HEIGHT: i32 = 1080 / 3; struct World { img: Image, + font: Tileset, pos: Vec2, } @@ -18,6 +19,7 @@ impl Game for World { window_state.scramble_palette(); Self { img: Image::load_data(include_bytes!("assets/test.gif")), + font: Tileset::load_data(include_bytes!("assets/ega-8x14.gif"), Vec2 { x: 16, y: 16 }), pos: Vec2::zero(), } } @@ -38,7 +40,7 @@ impl Game for World { fn draw(&self, target: &mut Image) { target.clear(); target.draw_image(Vec2 { x: 200, y: 100 }, &self.img); - target.draw_image(self.pos, &self.img); + target.draw_image(self.pos, self.font.get(68)); target.draw_line( Vec2 { diff --git a/src/image.rs b/src/image.rs index ba0fad5..bef5ea6 100644 --- a/src/image.rs +++ b/src/image.rs @@ -68,15 +68,16 @@ impl Image { //todo: write proper implementation later for y in 0..src_rect.size.y { for x in 0..src_rect.size.x { - let x = x + src_rect.pos.x; - let y = y + src_rect.pos.y; //todo: implement better(very stupid to do per pixel) if x + pos.x >= 0 && y + pos.y >= 0 && x + pos.x < self.size.x && y + pos.y < self.size.y { - let p = image.get_pixel(Vec2 { x, y }); + let p = image.get_pixel(Vec2 { + x: x + src_rect.pos.x, + y: y + src_rect.pos.y, + }); if p > 0 { self.set_pixel( Vec2 { @@ -129,4 +130,8 @@ impl Image { pub fn set_pixel(&mut self, pos: Vec2, color: u8) { self.data[(pos.x + self.size.x * pos.y) as usize] = color; } + + pub fn size(&self) -> Vec2 { + self.size + } } diff --git a/src/lib.rs b/src/lib.rs index 4dea454..60d4fd1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,12 +1,13 @@ mod hexmap; mod image; mod rect; +mod tileset; mod vec2; mod window; -mod tileset; pub use hexmap::*; pub use image::*; pub use rect::*; +pub use tileset::*; pub use vec2::*; pub use window::*; diff --git a/src/tileset.rs b/src/tileset.rs index ab745fe..1b120de 100644 --- a/src/tileset.rs +++ b/src/tileset.rs @@ -1,7 +1,49 @@ -use crate::{Image, Vec2}; +use crate::{Image, Rect, Vec2}; +use std::fs; -struct Tileset { +pub struct Tileset { count: i32, size: Vec2, images: Vec, } + +impl Tileset { + pub fn load(path: &str, tile_count: Vec2) -> Self { + Self::load_data(fs::read(path).unwrap().as_slice(), tile_count) + } + + pub fn load_data(data: &[u8], tile_count: Vec2) -> Self { + let img = Image::load_data(data); + let mut images: Vec = vec![]; + let size = Vec2 { + x: img.size().x / tile_count.x, + y: img.size().y / tile_count.y, + }; + for y in 0..tile_count.y { + for x in 0..tile_count.x { + let mut image = Image::new(size); + image.draw_image_partial( + Vec2::zero(), + &img, + Rect { + pos: Vec2 { + x: x * size.x, + y: y * size.y, + }, + size, + }, + ); + images.push(image); + } + } + Tileset { + count: images.len() as i32, + size, + images, + } + } + + pub fn get(&self, idx: i32) -> &Image { + &self.images[idx as usize] + } +}