diff --git a/src/main.c b/src/main.c index dc9fafb..7321d75 100644 --- a/src/main.c +++ b/src/main.c @@ -4,10 +4,23 @@ #define TABLE_LENGTH 720 #define SPEED 5 #define FRAC_BITS 8 +#define TILE_WIDTH 8 +#define TILE_HEIGHT 8 +#define TILE_SIZE (TILE_WIDTH * TILE_HEIGHT / 2) +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 224 +#define SCREEN_TILES_X 40 +#define SCREEN_TILES_Y 28 +#define TILE_EMPTY 0 +#define TILE_FILLED 1 +#define MAP_WIDTH 10 +#define MAP_HEIGHT 10 Line l; s16 angle = 0; s16 x, y; +u8 tileBuffer[TILE_SIZE]; +u16 tileIndex = 0; const u8 map[10][10] = {{1,1,1,1,1,1,1,1,1,1}, @@ -89,7 +102,7 @@ void castRay(s16 angle){ s16 vx = l.pt1.x << FRAC_BITS; s16 vy = l.pt1.y << FRAC_BITS; s16 nTan = -tan; - s16 threshold = (20 << FRAC_BITS); + threshold = (20 << FRAC_BITS); if(nTan > threshold){ nTan = threshold; } @@ -144,128 +157,114 @@ void castRay(s16 angle){ } -void mapscan(){ - u8 mapcolor = 12; - mapcolor |= mapcolor << 4; - int mapscale = 10; - - for(u8 x = 0; x < 10; x++){ - for(u8 y = 0; y < 10; y++){ - if(map[y][x] == 1){ - Vect2D_s16 mapverts[4] = {{x*mapscale,y*mapscale},{(x+1)*mapscale,y*mapscale},{(x+1)*mapscale,(y+1)*mapscale},{x*mapscale,(y+1)*mapscale}}; - BMP_drawPolygon(mapverts, 4, mapcolor); - - } - } - - } +void initTileBuffer(u8 color) { + u8 colorValue = (color << 4) | color; // Color for both nibbles + for (int i = 0; i < TILE_SIZE; i++) { + tileBuffer[i] = colorValue; + } } - -void render(){ - l.pt1.x = x / 10; - l.pt1.y = y / 10; - //Clear the bitmap - BMP_clear(); - - //Draw the line defined above (in the background, hidden) - - mapscan(); - if(angle >= 360) angle = angle - 360; - if(angle < 0) angle = 360 + angle; - castRay(angle-20); - BMP_drawLine(&l); - castRay(angle-10); - BMP_drawLine(&l); - for (int i = 0; i < 16; i++){ - castRay(angle); - BMP_drawLine(&l); - } - castRay(angle+10); - BMP_drawLine(&l); - castRay(angle+20); - BMP_drawLine(&l); - BMP_showFPS(0); - - //Flip the data to the screen - i.e. actually draw the complete image on screen - BMP_flip(1); - - //Increment the destination y coordinate - //l.pt2.y = l.pt2.y + 2; - - //Reset the destination y coordinate if it hits 160 - //if (l.pt2.y == 160) - //{ - //l.pt2.y = 0; - //} - - SYS_doVBlankProcess(); - +void uploadTileDataToVRAM(u16 vramTileIndex) { + VDP_loadTileData(tileBuffer, vramTileIndex, 1, DMA); // Load 1 tile to VRAM } -void update(){ - u16 joy = JOY_readJoypad(JOY_1); - if(joy & BUTTON_LEFT) { - //l.pt1.x -= SPEED; - angle -= 1; - } - if(joy & BUTTON_RIGHT) { - //l.pt1.x += SPEED; - angle += 1; - } - if(joy & BUTTON_UP) { - s16 ind = (int)((float)angle/360.0f*1024.0f); - fix16 dy = sinFix16(ind); - fix16 dx = cosFix16(ind); - y += fix16ToInt(fix16Mul(dy, FIX16(SPEED))); - x += fix16ToInt(fix16Mul(dx, FIX16(SPEED))); - } - if(joy & BUTTON_DOWN) { - s16 ind = (int)((float)angle/360.0f*1024.0f); - fix16 dy = sinFix16(ind); - fix16 dx = cosFix16(ind); - y -= fix16ToInt(fix16Mul(dy, FIX16(SPEED))); - x -= fix16ToInt(fix16Mul(dx, FIX16(SPEED))); - } +void mapscan() { + u8 mapcolor = 12; // map color + mapcolor |= mapcolor << 4; + + for (u8 x = 0; x < 10; x++) { + for (u8 y = 0; y < 10; y++) { + if (map[y][x] == 1) { + // Draw a filled tile for the map block + for (u8 px = 0; px < TILE_WIDTH; px++) { + for (u8 py = 0; py < TILE_HEIGHT; py++) { + setPixelInBuffer(px, py, mapcolor); + } + } + // Upload the filled tile to VRAM + uploadTileDataToVRAM(tileIndex); + VDP_setTileMapXY(VDP_BG_A, tileIndex, x, y); + } + } + } } -void initVDP(){ - SYS_disableInts(); - VDP_setPlaneSize(64,32,TRUE); - SYS_enableInts(); +void clearScreenWithTile(u16 tileIndex) { + // Fill the entire screen with the background tile + VDP_fillTileMapRect(BG_A, TILE_ATTR_FULL(PAL1, 0, FALSE, FALSE, tileIndex), 0, 0, SCREEN_TILES_X, SCREEN_TILES_Y); } -int main() -{ - x = 150; - y = 150; - initVDP(); +void drawMap() { + for (u16 y = 0; y < MAP_HEIGHT; y++) { + for (u16 x = 0; x < MAP_WIDTH; x++) { + u8 tileType = map[y][x] ? TILE_FILLED : TILE_EMPTY; + VDP_setTileMapXY(BG_A, TILE_ATTR_FULL(PAL1, 0, FALSE, FALSE, tileType), x, y); + } + } +} - //Initialise the bitmap engine - BMP_init(FALSE, BG_A, PAL0, FALSE); +void render() { + clearScreenWithTile(TILE_EMPTY); + initTileBuffer(12); // map color + uploadTileDataToVRAM(TILE_FILLED); + initTileBuffer(0); // background color + uploadTileDataToVRAM(TILE_EMPTY); + drawMap(); + VDP_setTextPlane(BG_B); + VDP_setTextPalette(2); + VDP_showFPS(0); + SYS_doVBlankProcess(); +} - //Set the colour of the line. We are using pallete 0 for the bitmap, so we have 0->15. 15 is used for white text, so we set an unused pallet colour, 14 to blue - RGB 0000FF. - u16 colour_blue = RGB24_TO_VDPCOLOR(0x0000ff); - u16 colour_red = RGB24_TO_VDPCOLOR(0x756a4a); - PAL_setColor(14, colour_blue); - PAL_setColor(13, colour_red); - PAL_setColor(12, RGB24_TO_VDPCOLOR(0x00ff00)); - PAL_setColor(15, RGB24_TO_VDPCOLOR(0xff0000)); - VDP_setBackgroundColor(13); +void update() { + u16 joy = JOY_readJoypad(JOY_1); + if (joy & BUTTON_LEFT) { + angle -= 1; + } + if (joy & BUTTON_RIGHT) { + angle += 1; + } + if (joy & BUTTON_UP) { + s16 ind = (int)((float)angle / 360.0f * 1024.0f); + fix16 dy = sinFix16(ind); + fix16 dx = cosFix16(ind); + y += fix16ToInt(fix16Mul(dy, FIX16(SPEED))); + x += fix16ToInt(fix16Mul(dx, FIX16(SPEED))); + } + if (joy & BUTTON_DOWN) { + s16 ind = (int)((float)angle / 360.0f * 1024.0f); + fix16 dy = sinFix16(ind); + fix16 dx = cosFix16(ind); + y -= fix16ToInt(fix16Mul(dy, FIX16(SPEED))); + x -= fix16ToInt(fix16Mul(dx, FIX16(SPEED))); + } +} - //A line needs a source coordinate x,y and a destination coordinate x,y along with a pallete colour. - l.pt1.x = 15; - l.pt1.y = 15; - l.pt2.x = 255; - l.pt2.y = 0; - l.col = 14; - l.col |= l.col << 4; // if we do not left shift the colour, we get gaps in the line +void initVDP() { + SYS_disableInts(); + VDP_setPlaneSize(64, 32, TRUE); + SYS_enableInts(); +} - while(TRUE) - { - render(); - update(); - } - return 0; +int main() { + SYS_disableInts(); + VDP_setPlaneSize(64, 32, TRUE); + SYS_enableInts(); + PAL_setColor(14, RGB24_TO_VDPCOLOR(0x0000ff)); + PAL_setColor(15, RGB24_TO_VDPCOLOR(0xff0000)); + VDP_setBackgroundColor(14); + + // Initialize and upload tile data for TILE_EMPTY and TILE_FILLED + initTileBuffer(12); // Color for TILE_FILLED + VDP_loadTileData(tileBuffer, TILE_FILLED, 1, DMA); + + initTileBuffer(0); // Color for TILE_EMPTY + VDP_loadTileData(tileBuffer, TILE_EMPTY, 1, DMA); + + while (TRUE) { + render(); + } + + return 0; } \ No newline at end of file