From d8fb314a796f7ff2f5d97351629ed393187ac68c Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Tue, 25 Jul 2023 22:32:41 -0700 Subject: [PATCH] main: primitive map scrolling --- main.cpp | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/main.cpp b/main.cpp index 5430169..364405d 100644 --- a/main.cpp +++ b/main.cpp @@ -79,21 +79,17 @@ uint32_t cell_data(const start_size_t& buf, const uint32_t top) constexpr inline void render_block(const uint32_t base_pattern, const tileset_t& tileset, - const uint32_t map_x, - const uint32_t map_y, + const int32_t map_x, + const int32_t map_y, const uint8_t block) { - for (uint32_t block_y = 0; block_y < 4; block_y++) { - for (uint32_t block_x = 0; block_x < 4; block_x++) { - const uint32_t block_ix = 4 * block_y + block_x; - const uint8_t tile_xy = tileset.blockset.start[block * 4 * 4 + block_ix]; + for (int32_t block_y = 0; block_y < 4; block_y++) { + for (int32_t block_x = 0; block_x < 4; block_x++) { + const int32_t block_ix = 4 * block_y + block_x; + const uint8_t tile_ix = tileset.blockset.start[block * 4 * 4 + block_ix]; - const uint8_t tile_x = (tile_xy >> 0) & 0xf; - const uint8_t tile_y = (tile_xy >> 4) & 0xf; - const uint32_t tile_ix = tile_y * 16 + tile_x; - - const uint32_t cell_y = map_y * 4 + block_y; - const uint32_t cell_x = map_x * 4 + block_x; + const int32_t cell_y = map_y * 4 + block_y; + const int32_t cell_x = map_x * 4 + block_x; // assumes NBG0 map plane_a is at offset 0 vdp2.vram.u16[64 * (cell_y % 64) + (cell_x % 64)] = (base_pattern & 0xfff) + tile_ix; //vdp2.vram.u32[64 * cell_y + cell_x] = base_pattern + tile_ix; @@ -250,16 +246,14 @@ static uint16_t scroll = 0; void render_map() { - /* - if (++scroll > 60) { + if (++scroll > 64) { scroll = 0; state.player.x += 1; state.player.y += 1; } - */ - vdp2.reg.SCXIN0 = state.player.x * 16; - vdp2.reg.SCYIN0 = state.player.y * 16; + vdp2.reg.SCXIN0 = (state.player.x - 1) * 16 + (scroll / 4); + vdp2.reg.SCYIN0 = (state.player.y - 1) * 16 + (scroll / 4); /* vdp2.reg.WPSX0 = 80 << 1; vdp2.reg.WPSY0 = 48; @@ -273,15 +267,22 @@ void render_map() const uint32_t base_pattern = state.draw.base_pattern.tilesets[map.tileset]; vdp2.reg.PNCN0 = PNCN0__N0PNB__1WORD | PNCN0__N0CNSM | PNCN0__N0SCN((base_pattern >> 10) & 0x1f); - int32_t origin_x = state.player.x; - int32_t origin_y = state.player.y; + int32_t origin_x = state.player.x / 2; + int32_t origin_y = state.player.y / 2; + int32_t offset_x = state.player.x & 1; + int32_t offset_y = state.player.y & 1; - for (int32_t y = origin_y - 5; y <= origin_y + 6; y++) { - for (int32_t x = origin_x - 5; x <= origin_x + 5; x++) { - const uint8_t block = - (x < static_cast(map.width) && y < static_cast(map.height) && x > 0 && y > 0) + fill(vdp2.vram.u32, 0, 64 * 64 * 2); + + for (int32_t y = origin_y - 3 + offset_x; y <= (origin_y + 2 + offset_x); y++) { + for (int32_t x = origin_x - 3 + offset_y; x <= (origin_x + 3 + offset_y); x++) { + const uint8_t block = ( (x < static_cast(map.width)) + && (y < static_cast(map.height)) + && (x >= 0) + && (y >= 0)) ? map.blocks.start[map.width * y + x] : border_block; + //const uint8_t block = map.blocks.start[map.width * 0 + 0]; render_block(base_pattern, tilesets[map.tileset],