Prepared the gui frames.

This commit is contained in:
Linus_Probert 2018-01-23 12:14:44 +01:00
parent e61b20f024
commit 5a95808266
4 changed files with 141 additions and 12 deletions

View File

@ -11,10 +11,20 @@
#define MAP_H_ROOM_COUNT 10 #define MAP_H_ROOM_COUNT 10
#define TILE_DIMENSION 32 #define TILE_DIMENSION 32
#define SPRITE_DIMENSION 16
/* Display stuff */ /* Display stuff */
#define SCREEN_WIDTH MAP_ROOM_WIDTH * TILE_DIMENSION #define GAME_VIEW_WIDTH MAP_ROOM_WIDTH * TILE_DIMENSION
#define SCREEN_HEIGHT MAP_ROOM_HEIGHT * TILE_DIMENSION #define GAME_VIEW_HEIGHT MAP_ROOM_HEIGHT * TILE_DIMENSION
#define RIGHT_GUI_WIDTH 10 * SPRITE_DIMENSION
#define RIGHT_GUI_HEIGHT GAME_VIEW_HEIGHT
#define BOTTOM_GUI_HEIGHT 10 * SPRITE_DIMENSION
#define BOTTOM_GUI_WIDTH GAME_VIEW_WIDTH + RIGHT_GUI_WIDTH
#define SCREEN_WIDTH GAME_VIEW_WIDTH + RIGHT_GUI_WIDTH
#define SCREEN_HEIGHT GAME_VIEW_HEIGHT + BOTTOM_GUI_HEIGHT
/* Windows and compile crap */ /* Windows and compile crap */
#ifdef _WIN32 #ifdef _WIN32

View File

@ -4,6 +4,35 @@
#include "gui.h" #include "gui.h"
#include "util.h" #include "util.h"
static SDL_Rect frame_top_left = { 16, 160, 16, 16 };
static SDL_Rect frame_top_right = { 48, 160, 16, 16 };
static SDL_Rect frame_bottom_left = { 16, 192, 16, 16 };
static SDL_Rect frame_bottom_right = { 48, 192, 16, 16 };
static SDL_Rect frame_top = { 32, 160, 16, 16 };
static SDL_Rect frame_bottom = { 32, 192, 16, 16 };
static SDL_Rect frame_center = { 32, 176, 16, 16 };
static SDL_Rect frame_left = { 16, 176, 16, 16 };
static SDL_Rect frame_right = { 48, 176, 16, 16 };
static char **gui_log;
static unsigned int log_length = 50;
static void
gui_malloc_log(void)
{
static bool log_allocated = false;
if (log_allocated)
return;
unsigned int i;
gui_log = ec_malloc(log_length * sizeof(char*));
for (i = 0; i < log_length; ++i)
gui_log[i] = ec_malloc(200 * sizeof(char));
log_allocated = true;
}
Gui* Gui*
gui_create() gui_create()
{ {
@ -11,6 +40,9 @@ gui_create()
gui->sprites = linkedlist_create(); gui->sprites = linkedlist_create();
gui->health = linkedlist_create(); gui->health = linkedlist_create();
gui->textures = ht_create(5); gui->textures = ht_create(5);
gui_malloc_log();
return gui; return gui;
} }
@ -86,9 +118,46 @@ gui_add_texture(Gui *gui, const char *path, SDL_Renderer *renderer)
return t; return t;
} }
void static void
gui_render(Gui *gui, Camera *cam) gui_render_frame(Gui *gui, unsigned int width, unsigned int height, Camera *cam)
{ {
Texture *texture = ht_get(gui->textures, "assets/GUI/GUI0.png");
Position pos = { 0, 0 };
unsigned int i, j;
for (i = 0; i < width; ++i) {
for (j = 0; j < height; ++j) {
pos.x = i * 16;
pos.y = j * 16;
if (i == 0 && j == 0) {
texture_render_clip(texture, &pos, &frame_top_left, cam);
} else if (i == (width - 1) && j == 0) {
texture_render_clip(texture, &pos, &frame_top_right, cam);
} else if (i == 0 && j == (height - 1)) {
texture_render_clip(texture, &pos, &frame_bottom_left, cam);
} else if (i == (width - 1) && j == (height - 1)) {
texture_render_clip(texture, &pos, &frame_bottom_right, cam);
} else if (i == 0) {
texture_render_clip(texture, &pos, &frame_left, cam);
} else if (i == (width - 1)) {
texture_render_clip(texture, &pos, &frame_right, cam);
} else if (j == 0) {
texture_render_clip(texture, &pos, &frame_top, cam);
} else if (j == (height - 1)) {
texture_render_clip(texture, &pos, &frame_bottom, cam);
} else {
texture_render_clip(texture, &pos, &frame_center, cam);
}
}
}
}
void
gui_render_panel(Gui *gui, unsigned int width, unsigned int height, Camera *cam)
{
gui_render_frame(gui, width/16, height/16, cam);
LinkedList *item = gui->health; LinkedList *item = gui->health;
while (item != NULL) { while (item != NULL) {
Sprite *s = item->data; Sprite *s = item->data;
@ -104,13 +173,36 @@ gui_render(Gui *gui, Camera *cam)
} }
void
gui_render_log(Gui *gui, unsigned int width, unsigned int height, Camera *cam)
{
gui_render_frame(gui, width/16, height/16, cam);
}
static void
destroy_log(void)
{
if (gui_log == NULL)
return;
unsigned int i;
for (i = 0; i < log_length; ++i)
free(gui_log[i]);
free(gui_log);
gui_log = NULL;
}
void void
gui_destroy(Gui *gui) gui_destroy(Gui *gui)
{ {
destroy_log();
while (gui->sprites != NULL) while (gui->sprites != NULL)
sprite_destroy(linkedlist_pop(&gui->sprites)); sprite_destroy(linkedlist_pop(&gui->sprites));
while (gui->health != NULL) while (gui->health != NULL)
sprite_destroy(linkedlist_pop(&gui->health)); sprite_destroy(linkedlist_pop(&gui->health));
ht_destroy_custom(gui->textures, (void (*)(void*)) &texture_destroy); ht_destroy_custom(gui->textures, (void (*)(void*)) &texture_destroy);
free(gui); free(gui);
} }

View File

@ -20,7 +20,9 @@ void gui_set_current_health(Gui*, int current);
Texture* gui_add_texture(Gui*, const char *path, SDL_Renderer*); Texture* gui_add_texture(Gui*, const char *path, SDL_Renderer*);
void gui_render(Gui*, Camera*); void gui_render_panel(Gui*, unsigned int width, unsigned int height, Camera*);
void gui_render_log(Gui*, unsigned int width, unsigned int height, Camera*);
void gui_destroy(Gui*); void gui_destroy(Gui*);

View File

@ -22,9 +22,13 @@ static LinkedList *gSpriteList = NULL;
static Map *gMap = NULL; static Map *gMap = NULL;
static RoomMatrix *gRoomMatrix = NULL; static RoomMatrix *gRoomMatrix = NULL;
static Gui *gGui = NULL; static Gui *gGui = NULL;
static unsigned int cLevel = 1;
static double renderScale = 1.0;
static GameState gGameState; static GameState gGameState;
static Camera gCamera; static Camera gCamera;
static unsigned int cLevel = 1; static SDL_Rect gameViewport;
static SDL_Rect bottomGuiViewport;
static SDL_Rect rightGuiViewport;
static static
bool initSDL(void) bool initSDL(void)
@ -32,12 +36,11 @@ bool initSDL(void)
int imgFlags = IMG_INIT_PNG; int imgFlags = IMG_INIT_PNG;
Dimension dim = getScreenDimensions(); Dimension dim = getScreenDimensions();
//Dimension dim = (Dimension) { 1920, 1080 }; //Dimension dim = (Dimension) { 1920, 1080 };
double scale = 1.0;
if (dim.height > 1080) { if (dim.height > 1080) {
printf("[**] Hi resolution screen detected (%u x %u)\n", dim.width, dim.height); printf("[**] Hi resolution screen detected (%u x %u)\n", dim.width, dim.height);
scale = ((double) dim.height)/1080; renderScale = ((double) dim.height)/1080;
printf("[**] Scaling by %f\n", scale); printf("[**] Scaling by %f\n", renderScale);
} }
if (SDL_Init(SDL_INIT_VIDEO) < 0) if (SDL_Init(SDL_INIT_VIDEO) < 0)
@ -61,8 +64,8 @@ bool initSDL(void)
gWindow = SDL_CreateWindow("Breakhack", gWindow = SDL_CreateWindow("Breakhack",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
(int)(SCREEN_WIDTH * scale), (int)(SCREEN_WIDTH * renderScale),
(int)(SCREEN_HEIGHT * scale), (int)((SCREEN_HEIGHT * renderScale)),
SDL_WINDOW_SHOWN); SDL_WINDOW_SHOWN);
if (gWindow == NULL) if (gWindow == NULL)
{ {
@ -90,10 +93,24 @@ bool initSDL(void)
return true; return true;
} }
static void
initViewports(void)
{
gameViewport = (SDL_Rect) { 0, 0,
GAME_VIEW_WIDTH, GAME_VIEW_HEIGHT };
bottomGuiViewport = (SDL_Rect) { 0, GAME_VIEW_HEIGHT,
BOTTOM_GUI_WIDTH, BOTTOM_GUI_WIDTH };
rightGuiViewport = (SDL_Rect) { GAME_VIEW_WIDTH, 0,
RIGHT_GUI_WIDTH, RIGHT_GUI_HEIGHT };
}
static static
bool initGame(void) bool initGame(void)
{ {
gSpriteList = linkedlist_create(); gSpriteList = linkedlist_create();
initViewports();
gMap = map_lua_generator_run(cLevel, gRenderer); gMap = map_lua_generator_run(cLevel, gRenderer);
return gSpriteList == NULL; return gSpriteList == NULL;
} }
@ -181,10 +198,18 @@ run_game(void)
SDL_RenderClear(gRenderer); SDL_RenderClear(gRenderer);
SDL_RenderSetViewport(gRenderer, &gameViewport);
map_render(gMap, &gCamera); map_render(gMap, &gCamera);
player_render(gPlayer, &gCamera); player_render(gPlayer, &gCamera);
roommatrix_render_lightmap(gRoomMatrix, &gCamera); roommatrix_render_lightmap(gRoomMatrix, &gCamera);
gui_render(gGui, &gCamera);
SDL_RenderSetViewport(gRenderer, &rightGuiViewport);
gui_render_panel(gGui, RIGHT_GUI_WIDTH,
RIGHT_GUI_HEIGHT, &gCamera);
SDL_RenderSetViewport(gRenderer, &bottomGuiViewport);
gui_render_log(gGui, BOTTOM_GUI_WIDTH,
BOTTOM_GUI_HEIGHT, &gCamera);
SDL_RenderPresent(gRenderer); SDL_RenderPresent(gRenderer);