From 8372690bc05e7f6f280f1a64bee1d9cbeccbf23d Mon Sep 17 00:00:00 2001 From: dani Date: Mon, 24 Jul 2023 17:26:09 +0000 Subject: [PATCH] changed tilemap to background --- examples/basic.rs | 6 +++--- examples/gfx.gif | Bin 18072 -> 22496 bytes src/{tilemap.rs => background.rs} | 12 ++++++------ src/gsa.rs | 15 ++++++++------- src/gsa_render_to_screen.rs | 14 +++++++------- src/lib.rs | 16 ++++++++-------- src/run.rs | 2 +- 7 files changed, 33 insertions(+), 32 deletions(-) rename src/{tilemap.rs => background.rs} (59%) diff --git a/examples/basic.rs b/examples/basic.rs index 9e26568..d302b57 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -6,8 +6,8 @@ struct Game {} fn init(gsa: &mut Gsa) -> Game { gsa.sprites[0].tile = 0x0300; gsa.sprites[1].tile = 0x0200; - gsa.maps[0].tiles[1][1] = 0x0300; - gsa.maps[1].half_tile = true; + gsa.bgs[0].tiles[1][1] = 0x0300; + gsa.bgs[1].half_tile = true; gsa.write_string(1, IVec2::ONE, "Hello world nyaa~"); Game {} } @@ -15,7 +15,7 @@ fn init(gsa: &mut Gsa) -> Game { fn update(_game: &mut Game, gsa: &mut Gsa) { gsa.sprites[0].pos.x = (gsa.sprites[0].pos.x + 1) % 300; gsa.sprites[1].pos += gsa.input_dir(); - gsa.maps[1].scroll.x += 1; + gsa.bgs[1].scroll.x += 1; if gsa.button_pressed(FACE_DOWN) { gsa.sprites[1].tile += 1; } diff --git a/examples/gfx.gif b/examples/gfx.gif index a2f494414c3e49250b051781841c9b3395cce107..b4b5f42c6e5676d5fdaea336ae3bdddfde794edf 100644 GIT binary patch delta 11005 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 r3td9581H4@euLIdZSwdi delta 6569 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, /// Camera scroll (negative draw offset) for rendering pub scroll: IVec2, @@ -11,10 +11,10 @@ pub struct Tilemap { pub half_tile: bool, } -impl Default for Tilemap { +impl Default for Background { fn default() -> Self { - let row = vec![0u16; TILEMAP_MAX_SIZE]; - let tiles = vec![row; TILEMAP_MAX_SIZE]; + let row = vec![0u16; BACKGROUND_MAX_SIZE]; + let tiles = vec![row; BACKGROUND_MAX_SIZE]; Self { tiles, scroll: IVec2::ZERO, diff --git a/src/gsa.rs b/src/gsa.rs index b1b8995..1b24fdd 100644 --- a/src/gsa.rs +++ b/src/gsa.rs @@ -1,8 +1,9 @@ +use crate::background::Background; use crate::rgb::Rgb; use crate::sprite::Sprite; -use crate::tilemap::Tilemap; use crate::{ - Buttons, DPAD_DOWN, DPAD_LEFT, DPAD_RIGHT, DPAD_UP, MAX_SPRITES, MAX_TILEMAPS, TILEMAP_MAX_SIZE, + Buttons, BACKGROUND_MAX_SIZE, DPAD_DOWN, DPAD_LEFT, DPAD_RIGHT, DPAD_UP, MAX_BACKGROUNDS, + MAX_SPRITES, }; use ascii::{AsciiChar, AsciiStr}; use glam::IVec2; @@ -16,7 +17,7 @@ pub struct Gsa { pub palette: [Rgb; 256], /// Tilemap layers available - pub maps: [Tilemap; MAX_TILEMAPS], + pub bgs: [Background; MAX_BACKGROUNDS], /// Currently selected font /// @@ -36,9 +37,9 @@ impl Gsa { /// Sets all tiles of map to val pub fn fill_map(&mut self, map: usize, val: u16) { - for x in 0..TILEMAP_MAX_SIZE { - for y in 0..TILEMAP_MAX_SIZE { - self.maps[map].tiles[x][y] = val; + for x in 0..BACKGROUND_MAX_SIZE { + for y in 0..BACKGROUND_MAX_SIZE { + self.bgs[map].tiles[x][y] = val; } } } @@ -72,7 +73,7 @@ impl Gsa { pub fn write_string(&mut self, map: usize, pos: IVec2, str: &str) { let str = AsciiStr::from_ascii(str).unwrap(); for (i, ch) in str.into_iter().enumerate() { - self.maps[map].tiles[pos.x as usize + i][pos.y as usize] = self.get_char_tile(*ch); + self.bgs[map].tiles[pos.x as usize + i][pos.y as usize] = self.get_char_tile(*ch); } } diff --git a/src/gsa_render_to_screen.rs b/src/gsa_render_to_screen.rs index 3856ee3..e0b0154 100644 --- a/src/gsa_render_to_screen.rs +++ b/src/gsa_render_to_screen.rs @@ -1,6 +1,6 @@ use crate::{ - Gsa, Rgb, Tilemap, HALF_TILE_SIZE, MAX_TILEMAPS, SCREEN_HEIGHT, SCREEN_WIDTH, TILEMAP_MAX_SIZE, - TILESET_SIZE, TILE_SIZE, + Background, Gsa, Rgb, BACKGROUND_MAX_SIZE, HALF_TILE_SIZE, MAX_BACKGROUNDS, SCREEN_HEIGHT, + SCREEN_WIDTH, TILESET_SIZE, TILE_SIZE, }; use glam::IVec2; use softbuffer::Buffer; @@ -24,7 +24,7 @@ fn draw_tile(target: &mut [u8], pos: IVec2, tile: u16, tileset: &[u8], half: boo } } -fn render_map(target: &mut [u8], map: &Tilemap, tileset: &[u8]) { +fn render_map(target: &mut [u8], map: &Background, tileset: &[u8]) { let tcmult = if map.half_tile { 2 } else { 1 }; let tilesize = if map.half_tile { HALF_TILE_SIZE @@ -33,8 +33,8 @@ fn render_map(target: &mut [u8], map: &Tilemap, tileset: &[u8]) { } as i32; let mut startx = map.scroll.x / tilesize; let mut starty = map.scroll.y / tilesize; - let endx = (TILEMAP_MAX_SIZE as i32).min(startx + 20 * tcmult); - let endy = (TILEMAP_MAX_SIZE as i32).min(starty + 12 * tcmult); + let endx = (BACKGROUND_MAX_SIZE as i32).min(startx + 20 * tcmult); + let endy = (BACKGROUND_MAX_SIZE as i32).min(starty + 12 * tcmult); startx = 0.max(startx); starty = 0.max(starty); for x in startx..endx { @@ -57,8 +57,8 @@ fn render_map(target: &mut [u8], map: &Tilemap, tileset: &[u8]) { } pub(crate) fn render_to_screen(target: &mut [u8], gsa: &Gsa, tileset: &[u8]) { - for i in 0..MAX_TILEMAPS { - render_map(target, &gsa.maps[i], tileset); + for i in 0..MAX_BACKGROUNDS { + render_map(target, &gsa.bgs[i], tileset); for sprite in &gsa.sprites { if sprite.tile > 0 && sprite.priority == i as u8 { draw_tile(target, sprite.pos, sprite.tile, tileset, false); diff --git a/src/lib.rs b/src/lib.rs index b17ab6c..a11d689 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,10 +9,10 @@ //! - Tilesize: 16x16 (or 8x8 for half-tiles) //! - Tileset: 65536 tiles, indexed via 0xYYXX //! - Sprites: 256 of size 16x16 (pondering allowing larger sprites) -//! - Tilemaps: 4 of size 1024x1024, scrollable +//! - Backgrounds: 4 of size 1024x1024, scrollable //! //! ## Features not yet implemented -//! - Tilemap effects +//! - Background effects //! - Rotation? Scaling? //! - Mosaic? //! - Mode7? @@ -27,21 +27,21 @@ //! - Gamepad text keyboard input //! - Menus +mod background; mod buttons; mod gsa; mod gsa_render_to_screen; mod rgb; mod run; mod sprite; -mod tilemap; mod tileset; +pub use crate::background::*; pub use crate::buttons::*; pub use crate::gsa::*; pub use crate::rgb::*; pub use crate::run::run; pub use crate::sprite::*; -pub use crate::tilemap::*; /// Amount of sprites in [Gsa::sprites] pub const MAX_SPRITES: usize = 0xff; @@ -52,8 +52,8 @@ pub const SCREEN_WIDTH: usize = 304; /// Screen Height in pixels pub const SCREEN_HEIGHT: usize = 176; -/// X and y dimensions of maps in [Gsa::maps] -pub const TILEMAP_MAX_SIZE: usize = 1024; +/// X and y dimensions of maps in [Gsa::bgs] +pub const BACKGROUND_MAX_SIZE: usize = 1024; /// Width and height (in tiles) of tileset pub const TILESET_SIZE: usize = 0x100; @@ -64,5 +64,5 @@ pub const TILE_SIZE: usize = 16; /// Width and height of a tile in half-tile mode pub const HALF_TILE_SIZE: usize = 8; -/// Amount of tile maps in [Gsa::maps] -pub const MAX_TILEMAPS: usize = 4; +/// Amount of tile maps in [Gsa::bgs] +pub const MAX_BACKGROUNDS: usize = 4; diff --git a/src/run.rs b/src/run.rs index f018b85..67156c5 100644 --- a/src/run.rs +++ b/src/run.rs @@ -39,7 +39,7 @@ pub fn run( let mut gsa = Gsa { sprites: [Sprite::default(); MAX_SPRITES], - maps: Default::default(), + bgs: Default::default(), palette, font: 0x1010, pressed: 0,