diff --git a/examples/assets/ega-8x14.gif b/examples/assets/ega-8x14.gif new file mode 100644 index 0000000..c4b24c5 Binary files /dev/null and b/examples/assets/ega-8x14.gif differ 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] + } +}