Fixed flashing text issue, moved textbox to window layer.
This commit is contained in:
@@ -187,7 +187,7 @@ void main() {
|
|||||||
|
|
||||||
// Fill screen white
|
// Fill screen white
|
||||||
for(j = 0; j < GB_BACKGROUND_COLUMNS * GB_BACKGROUND_ROWS; j++) filled[j] = SPRITE_TILESET_BLACK_LOW;
|
for(j = 0; j < GB_BACKGROUND_COLUMNS * GB_BACKGROUND_ROWS; j++) filled[j] = SPRITE_TILESET_BLACK_LOW;
|
||||||
spriteBufferBackgroundLow(0x00, 0x00, GB_BACKGROUND_COLUMNS, GB_BACKGROUND_ROWS, filled);
|
spriteBufferBackground(0x00, 0x00, GB_BACKGROUND_COLUMNS, GB_BACKGROUND_ROWS, filled);
|
||||||
SCX_REG = 0x00;
|
SCX_REG = 0x00;
|
||||||
SCY_REG = 0x00;
|
SCY_REG = 0x00;
|
||||||
|
|
||||||
|
@@ -44,7 +44,7 @@ void questionBoxSetOptions(char *title, char **options, uint8_t count) {
|
|||||||
|
|
||||||
// Repurpose old array and draw arrow
|
// Repurpose old array and draw arrow
|
||||||
spaces[0] = spriteFontTileFromChar(QUESTION_BOX_CURSOR);
|
spaces[0] = spriteFontTileFromChar(QUESTION_BOX_CURSOR);
|
||||||
spriteBufferBackgroundHigh(0x01, TEXTBOX_WIN_Y + 0x02, 1, 1, spaces);
|
spriteBufferWindow(0x01, TEXTBOX_Y + 0x02, 1, 1, spaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void questionBoxUpdate() {
|
inline void questionBoxUpdate() {
|
||||||
@@ -76,9 +76,9 @@ inline void questionBoxUpdate() {
|
|||||||
} else {
|
} else {
|
||||||
tiles[0] = spriteFontTileFromChar(' ');
|
tiles[0] = spriteFontTileFromChar(' ');
|
||||||
}
|
}
|
||||||
spriteBufferBackgroundHigh(
|
spriteBufferWindow(
|
||||||
0x01 + ((i % 0x02) * QUESTION_BOX_QUESTION_SPACES),
|
0x01 + ((i % 0x02) * QUESTION_BOX_QUESTION_SPACES),
|
||||||
TEXTBOX_WIN_Y + 0x02 + (i / 0x02),
|
TEXTBOX_Y + 0x02 + (i / 0x02),
|
||||||
1, 1,
|
1, 1,
|
||||||
tiles
|
tiles
|
||||||
);
|
);
|
||||||
|
@@ -77,6 +77,8 @@ void conversationTextboxSetText(char *text) {
|
|||||||
// Now we have organized the string nicely we can prep for rendering. Fill the
|
// Now we have organized the string nicely we can prep for rendering. Fill the
|
||||||
// tiles with blank chars.
|
// tiles with blank chars.
|
||||||
textboxFillBlank();
|
textboxFillBlank();
|
||||||
|
WY_REG = TEXTBOX_WINDOW_Y * TILE_HEIGHT;
|
||||||
|
SHOW_WIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void textboxFillBlank() {
|
inline void textboxFillBlank() {
|
||||||
@@ -86,8 +88,8 @@ inline void textboxFillBlank() {
|
|||||||
tiles, TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES, SPRITE_TILESET_WHITE_HIGH
|
tiles, TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES, SPRITE_TILESET_WHITE_HIGH
|
||||||
);
|
);
|
||||||
|
|
||||||
spriteBufferBackgroundHigh(
|
spriteBufferWindow(
|
||||||
0x00, TEXTBOX_WIN_Y,
|
0x00, TEXTBOX_Y,
|
||||||
TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES,
|
TEXTBOX_WIDTH_IN_TILES, TEXTBOX_HEIGHT_IN_TILES,
|
||||||
tiles
|
tiles
|
||||||
);
|
);
|
||||||
@@ -108,6 +110,7 @@ inline void conversationTextboxUpdate() {
|
|||||||
if((TEXTBOX_ROW_COUNT - TEXTBOX_ROW_CURRENT) < TEXTBOX_TILES_ROWS) {
|
if((TEXTBOX_ROW_COUNT - TEXTBOX_ROW_CURRENT) < TEXTBOX_TILES_ROWS) {
|
||||||
TEXTBOX_STATE &= ~TEXTBOX_STATE_VISIBLE;
|
TEXTBOX_STATE &= ~TEXTBOX_STATE_VISIBLE;
|
||||||
HIDE_WIN;
|
HIDE_WIN;
|
||||||
|
LCDC_REG |= LCDCF_BG8000;
|
||||||
conversationQueueNext();
|
conversationQueueNext();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -129,9 +132,9 @@ inline void conversationTextboxUpdate() {
|
|||||||
} else {
|
} else {
|
||||||
tile = spriteFontTileFromChar(c);
|
tile = spriteFontTileFromChar(c);
|
||||||
|
|
||||||
spriteBufferBackgroundHigh(
|
spriteBufferWindow(
|
||||||
0x01 + (TEXTBOX_SCROLL % TEXTBOX_CHARS_PER_ROW),
|
0x01 + (TEXTBOX_SCROLL % TEXTBOX_CHARS_PER_ROW),
|
||||||
TEXTBOX_WIN_Y + 0x01 + (TEXTBOX_SCROLL / TEXTBOX_CHARS_PER_ROW),
|
TEXTBOX_Y + 0x01 + (TEXTBOX_SCROLL / TEXTBOX_CHARS_PER_ROW),
|
||||||
1, 1,
|
1, 1,
|
||||||
&tile
|
&tile
|
||||||
);
|
);
|
||||||
|
@@ -32,7 +32,9 @@
|
|||||||
|
|
||||||
#define TEXTBOX_SCROLL_ROWS_MAX 14
|
#define TEXTBOX_SCROLL_ROWS_MAX 14
|
||||||
|
|
||||||
#define TEXTBOX_WIN_Y (18 - TEXTBOX_HEIGHT_IN_TILES)
|
#define TEXTBOX_Y 0x00
|
||||||
|
#define TEXTBOX_WINDOW_Y (18 - TEXTBOX_HEIGHT_IN_TILES)
|
||||||
|
#define TEXTBOX_SCREEN_Y (TEXTBOX_WINDOW_Y + TEXTBOX_Y)
|
||||||
|
|
||||||
extern char TEXTBOX_TEXTS[TEXTBOX_SCROLL_ROWS_MAX * TEXTBOX_CHARS_PER_ROW];
|
extern char TEXTBOX_TEXTS[TEXTBOX_SCROLL_ROWS_MAX * TEXTBOX_CHARS_PER_ROW];
|
||||||
extern uint8_t TEXTBOX_ROW_COUNT;
|
extern uint8_t TEXTBOX_ROW_COUNT;
|
||||||
|
@@ -9,6 +9,6 @@
|
|||||||
#include "libs.h"
|
#include "libs.h"
|
||||||
#include "conversation/textbox.h"
|
#include "conversation/textbox.h"
|
||||||
|
|
||||||
#define INTERRUPT_TEXTBOX_VRAM ((TEXTBOX_WIN_Y * TILE_HEIGHT) - 1)
|
#define INTERRUPT_TEXTBOX_VRAM ((TEXTBOX_SCREEN_Y * TILE_HEIGHT) - 1)
|
||||||
|
|
||||||
void interruptOnScanline();
|
void interruptOnScanline();
|
@@ -15,4 +15,4 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define TILE_WIDTH 8
|
#define TILE_WIDTH 8
|
||||||
#define TILE_HEIGHT 8
|
#define TILE_HEIGHT TILE_WIDTH
|
16
src/main.c
16
src/main.c
@@ -18,11 +18,21 @@ void main() {
|
|||||||
// Create a critical section for some video stuff
|
// Create a critical section for some video stuff
|
||||||
CRITICAL {
|
CRITICAL {
|
||||||
DISPLAY_OFF;
|
DISPLAY_OFF;
|
||||||
LCDC_REG = LCDCF_OFF | LCDCF_BG8000 | LCDCF_BG9800 | LCDCF_BGON;
|
LCDC_REG = LCDCF_OFF | LCDCF_WIN9C00 | LCDCF_BG8000 | LCDCF_BG9800 | LCDCF_BGON;
|
||||||
|
/*
|
||||||
|
* LCD = Off
|
||||||
|
* WindowBank = 0x9C00
|
||||||
|
* BG Chr = 0x8800
|
||||||
|
* BG Bank = 0x9800
|
||||||
|
* BG = On
|
||||||
|
*/
|
||||||
|
|
||||||
STAT_REG |= STATF_LYC;
|
STAT_REG |= STATF_LYC;
|
||||||
LYC_REG = 0x00;
|
LYC_REG = 0x00;
|
||||||
SCX_REG = 0x00;
|
SCX_REG = 0x00;
|
||||||
SCY_REG = 0x00;
|
SCY_REG = 0x00;
|
||||||
|
WX_REG = TILE_WIDTH;
|
||||||
|
// WY_REG = 0x00;
|
||||||
add_LCD(interruptOnScanline);
|
add_LCD(interruptOnScanline);
|
||||||
}
|
}
|
||||||
set_interrupts(VBL_IFLAG | LCD_IFLAG);
|
set_interrupts(VBL_IFLAG | LCD_IFLAG);
|
||||||
@@ -47,12 +57,12 @@ void main() {
|
|||||||
for(j = 0; j < GB_BACKGROUND_COLUMNS * GB_BACKGROUND_ROWS; j++) {
|
for(j = 0; j < GB_BACKGROUND_COLUMNS * GB_BACKGROUND_ROWS; j++) {
|
||||||
filled[j] = SPRITE_TILESET_WHITE_LOW;
|
filled[j] = SPRITE_TILESET_WHITE_LOW;
|
||||||
}
|
}
|
||||||
spriteBufferBackgroundLow(0x00, 0x00, GB_BACKGROUND_COLUMNS, GB_BACKGROUND_ROWS, filled);
|
spriteBufferBackground(0x00, 0x00, GB_BACKGROUND_COLUMNS, GB_BACKGROUND_ROWS, filled);
|
||||||
|
|
||||||
// Card Test
|
// Card Test
|
||||||
uint8_t cardTiles[SPRITE_CARD_TILE_COUNT];
|
uint8_t cardTiles[SPRITE_CARD_TILE_COUNT];
|
||||||
spriteCardBufferTiles(cardTiles, CARD_SPADES_QUEEN);
|
spriteCardBufferTiles(cardTiles, CARD_SPADES_QUEEN);
|
||||||
spriteBufferBackgroundLow(0x00, 0x00, SPRITE_CARD_WIDTH, SPRITE_CARD_HEIGHT, cardTiles);
|
spriteBufferBackground(0x00, 0x00, SPRITE_CARD_WIDTH, SPRITE_CARD_HEIGHT, cardTiles);
|
||||||
|
|
||||||
// Now turn the screen on
|
// Now turn the screen on
|
||||||
DISPLAY_ON;
|
DISPLAY_ON;
|
||||||
|
@@ -20,7 +20,7 @@ inline void spriteBufferHigh(uint8_t position, uint8_t length, uint8_t *tiles) {
|
|||||||
vmemcpy(vramPosition, tiles, SPRITE_VRAM_SIZE_PER_TILE * length);
|
vmemcpy(vramPosition, tiles, SPRITE_VRAM_SIZE_PER_TILE * length);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void spriteBufferBackgroundLow(
|
inline void spriteBufferBackground(
|
||||||
uint8_t x, uint8_t y,
|
uint8_t x, uint8_t y,
|
||||||
uint8_t width, uint8_t height,
|
uint8_t width, uint8_t height,
|
||||||
uint8_t *tiles
|
uint8_t *tiles
|
||||||
@@ -28,12 +28,11 @@ inline void spriteBufferBackgroundLow(
|
|||||||
set_tiles(
|
set_tiles(
|
||||||
x, y,
|
x, y,
|
||||||
height, width,// Bug?
|
height, width,// Bug?
|
||||||
SPRITE_VRAM_TILEMAP_LOW,
|
SPRITE_VRAM_TILEMAP_BACKGROUND_LOW,
|
||||||
tiles
|
tiles
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
inline void spriteBufferWindow(
|
||||||
inline void spriteBufferBackgroundHigh(
|
|
||||||
uint8_t x, uint8_t y,
|
uint8_t x, uint8_t y,
|
||||||
uint8_t width, uint8_t height,
|
uint8_t width, uint8_t height,
|
||||||
uint8_t *tiles
|
uint8_t *tiles
|
||||||
@@ -41,7 +40,7 @@ inline void spriteBufferBackgroundHigh(
|
|||||||
set_tiles(
|
set_tiles(
|
||||||
x, y,
|
x, y,
|
||||||
height, width,// Bug?
|
height, width,// Bug?
|
||||||
SPRITE_VRAM_TILEMAP_LOW,
|
SPRITE_VRAM_TILEMAP_WINDOW_LOW,
|
||||||
tiles
|
tiles
|
||||||
);
|
);
|
||||||
}
|
}
|
@@ -12,7 +12,8 @@
|
|||||||
#define SPRITE_VRAM_HIGH 0x8800
|
#define SPRITE_VRAM_HIGH 0x8800
|
||||||
#define SPRITE_VRAM_DISTANCE_BETWEEN_LOW_AND_HIGH 0x0800
|
#define SPRITE_VRAM_DISTANCE_BETWEEN_LOW_AND_HIGH 0x0800
|
||||||
#define SPRITE_VRAM_SIZE_PER_TILE 0x10
|
#define SPRITE_VRAM_SIZE_PER_TILE 0x10
|
||||||
#define SPRITE_VRAM_TILEMAP_LOW 0x9800
|
#define SPRITE_VRAM_TILEMAP_BACKGROUND_LOW 0x9800
|
||||||
|
#define SPRITE_VRAM_TILEMAP_WINDOW_LOW 0x9C00
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Buffer tiles data into VRAM in the HIGH space (The upper bounds of VRAM)
|
* Buffer tiles data into VRAM in the HIGH space (The upper bounds of VRAM)
|
||||||
@@ -32,13 +33,13 @@ inline void spriteBufferHigh(uint8_t position, uint8_t length, uint8_t *tiles);
|
|||||||
*/
|
*/
|
||||||
inline void spriteBufferLow(uint8_t position, uint8_t length, uint8_t *tiles);
|
inline void spriteBufferLow(uint8_t position, uint8_t length, uint8_t *tiles);
|
||||||
|
|
||||||
inline void spriteBufferBackgroundLow(
|
inline void spriteBufferBackground(
|
||||||
uint8_t x, uint8_t y,
|
uint8_t x, uint8_t y,
|
||||||
uint8_t width, uint8_t height,
|
uint8_t width, uint8_t height,
|
||||||
uint8_t *tiles
|
uint8_t *tiles
|
||||||
);
|
);
|
||||||
|
|
||||||
inline void spriteBufferBackgroundHigh(
|
inline void spriteBufferWindow(
|
||||||
uint8_t x, uint8_t y,
|
uint8_t x, uint8_t y,
|
||||||
uint8_t width, uint8_t height,
|
uint8_t width, uint8_t height,
|
||||||
uint8_t *tiles
|
uint8_t *tiles
|
||||||
|
Reference in New Issue
Block a user