Fullscreen scrolling, initial cut at game logic

This commit is contained in:
Jeremy Penner 2019-01-20 11:44:42 -05:00
parent b1366fe3b2
commit e5d1ac5c79
2 changed files with 86 additions and 16 deletions

102
testbed.c
View file

@ -469,7 +469,7 @@ int tifLoad(FILE *f, TifImageMeta_t meta, unsigned int *planeBuf, int maxY, int
// 89ABCDEF 01234567 << 3 => BCDEFXXX 3456789A byteswap => 3456789A BCDEFXXX
#define PAGE_TILES_W 21
#define PAGE_TILES_H 12
#define PAGE_TILES_H 14
#define PAGE_TILES_COUNT (PAGE_TILES_H * PAGE_TILES_W)
#define PAGE_STRIDE (PAGE_TILES_W << 1)
@ -511,7 +511,7 @@ typedef struct {
unsigned char firstBuffer;
} TiledScreen_t;
TiledScreen_t screen = { 0, 0, 0, 0, { 0x0400, 0x2400 }, 0, 0, NULL, NULL,
TiledScreen_t screen = { 0, 0, 0, 0, { 0x0600, 0x2B00 }, 0, 0, NULL, NULL,
0, 0, 0, 0, 0 };
void loadTiles(unsigned int tilesOffset, unsigned int *memTiles) {
@ -598,7 +598,7 @@ void drawSprite(unsigned int *sprite, int x, int y) {
void scroll(int newX, int newY) {
newX = min(max(newX, 0), (screen.w << 4) - 320);
newY = min(max(newY, 0), (screen.h << 4) - 176);
newY = min(max(newY, 0), (screen.h << 4) - 200);
if ((screen.scrollX & 0xfff0) != (newX & 0xfff0) ||
(screen.scrollY & 0xfff0) != (newY & 0xfff0)) {
int mapX, mapY;
@ -675,7 +675,7 @@ void drawScreen() {
/*** S C R A T C H ***/
#define NUM_TILES 128
#define NUM_SPRITES 64
#define OFF_TILES 0x4840
#define OFF_TILES 0x5000
#define TILE_STRIDE 64
#define SPRITE_STRIDE 80
unsigned int tiles[NUM_TILES * TILE_STRIDE];
@ -695,10 +695,64 @@ void fillMap() {
}
}
#define DIR_N 0
#define DIR_E 1
#define DIR_W 2
#define DIR_S 3
#define STATE_MAP 0
#define STATE_DIALOG 1
struct entity;
typedef struct entity Entity_t;
struct entity {
int x;
int y;
int dir;
int sprites[4];
};
void drawEntity(Entity_t *entity) {
int isprite = entity->sprites[entity->dir];
drawSprite(&sprites[isprite * SPRITE_STRIDE], entity->x, entity->y);
}
void playerThink(Entity_t *self) {
if (keyPressed(K_LEFT)) { self->x -= 3; self->dir = DIR_W; }
if (keyPressed(K_RIGHT)) { self->x += 3; self->dir = DIR_E; }
if (keyPressed(K_UP)) { self->y -= 3; self->dir = DIR_N; }
if (keyPressed(K_DOWN)) { self->y += 3; self->dir = DIR_S; }
}
typedef struct {
int dy;
int y;
int debounce;
} Footer_t;
typedef struct {
Entity_t player;
Footer_t footer;
int state;
} Game_t;
Game_t game;
void game_init() {
FILE *f;
TifImageMeta_t meta;
game.player.x = 100;
game.player.y = 100;
game.player.dir = DIR_E;
game.player.sprites[DIR_E] = 0;
game.player.sprites[DIR_N] = 1;
game.player.sprites[DIR_W] = 2;
game.player.sprites[DIR_S] = 3;
game.footer.y = 0;
game.state = STATE_MAP;
setEGAMode();
atexit(vid_cleanup);
@ -721,7 +775,7 @@ void game_init() {
tifLoad(f, meta, sprites, NUM_SPRITES * 16, 16, 5);
fclose(f);
setSplitScreen(351);
// setSplitScreen(351);
loadTiles(OFF_TILES, tiles);
loadMap(map, 100, 100);
@ -729,21 +783,37 @@ void game_init() {
}
int main() {
int x = -1;
int y = -1;
int dir = 0;
game_init();
kbd_init();
while (!keyPressed(K_ESC)) {
if (keyPressed(K_LEFT)) { x -= 3; dir = 2; }
if (keyPressed(K_RIGHT)) { x += 3; dir = 0; }
if (keyPressed(K_UP)) { y -= 3; dir = 1; }
if (keyPressed(K_DOWN)) { y += 3; dir = 3; }
scroll(x - 152, y - 90);
drawSprite(&sprites[dir * SPRITE_STRIDE], x, y);
if (game.state == STATE_MAP) {
if (keyPressed(K_SPACE)) {
game.state = STATE_DIALOG;
game.footer.debounce = 1;
game.footer.dy = 1;
}
playerThink(&game.player);
scroll(game.player.x - 152, game.player.y - 92);
} else if (game.state == STATE_DIALOG) {
if (game.footer.debounce && !keyPressed(K_SPACE)) {
game.footer.debounce = 0;
}
if (!game.footer.debounce && keyPressed(K_SPACE)) {
game.footer.dy = -1;
}
game.footer.y += game.footer.dy;
if (game.footer.dy > 0 && game.footer.y > 24) {
game.footer.y = 24;
game.footer.dy = 0;
} else if (game.footer.dy < 0 && game.footer.y < 0) {
game.footer.y = 0;
game.footer.dy = 0;
game.state = STATE_MAP;
}
setSplitScreen(399 - (game.footer.y << 1));
}
drawEntity(&game.player);
drawScreen();
}

Binary file not shown.