2048-homework/src/gui.c

118 lines
3.8 KiB
C
Raw Normal View History

2021-12-05 14:31:33 +00:00
#include "gui.h"
2021-12-10 21:05:59 +00:00
#include <stdbool.h>
2021-12-05 14:31:33 +00:00
2021-12-10 21:05:59 +00:00
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
2021-12-05 14:31:33 +00:00
const SCREEN_WIDTH = 800;
2021-12-14 16:18:34 +00:00
const SCREEN_HEIGHT = 920;
2021-12-05 14:31:33 +00:00
SDL_Window* window = NULL;
2021-12-10 21:05:59 +00:00
// SDL_Surface* screenSurface = NULL;
SDL_Renderer *window_renderer = NULL;
SDL_Texture* tile_texture = NULL;
2021-12-14 16:18:34 +00:00
SDL_Texture* tile_textures[13];
SDL_Rect tile_size;
SDL_Texture *texture_from_png(char *n) {
SDL_Surface *s = IMG_Load(n);
SDL_Texture *t = SDL_CreateTextureFromSurface( window_renderer, s);
SDL_FreeSurface(s);
return t;
}
2021-12-05 14:31:33 +00:00
void gui_init() {
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
}
window = SDL_CreateWindow( "2048", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
if( window == NULL )
{
printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
}
2021-12-10 21:05:59 +00:00
// screenSurface = SDL_GetWindowSurface(window);
// SDL_FillRect(screenSurface, NULL, SDL_MapRGB(screenSurface->format, 255, 255, 255));
// create renderer and render white window
window_renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
SDL_SetRenderDrawColor(window_renderer, 0xFF, 0xFF, 0xFF, 0xFF );
SDL_RenderClear(window_renderer);
SDL_RenderPresent(window_renderer);
// SDL_UpdateWindowSurface(window);
// load up textures
2021-12-14 16:18:34 +00:00
tile_texture = texture_from_png("res/tile.png");
2021-12-14 16:47:10 +00:00
tile_textures[0] = tile_texture;
2021-12-14 16:18:34 +00:00
tile_textures[1] = texture_from_png("res/2.png");
tile_textures[3] = texture_from_png("res/4.png");
tile_textures[4] = texture_from_png("res/8.png");
tile_textures[5] = texture_from_png("res/16.png");
tile_textures[6] = texture_from_png("res/32.png");
tile_textures[7] = texture_from_png("res/64.png");
tile_textures[8] = texture_from_png("res/128.png");
tile_textures[9] = texture_from_png("res/256.png");
tile_textures[10] = texture_from_png("res/512.png");
tile_textures[11] = texture_from_png("res/1024.png");
tile_textures[12] = texture_from_png("res/2048.png");
tile_size.x = 0;
tile_size.y = 0;
SDL_QueryTexture(tile_texture, NULL, NULL, &tile_size.w, &tile_size.h);
2021-12-05 14:31:33 +00:00
}
2021-12-10 21:05:59 +00:00
void gui_destroy() {
2021-12-05 14:31:33 +00:00
//Destroy window
SDL_DestroyWindow( window );
2021-12-10 21:05:59 +00:00
SDL_DestroyRenderer(window_renderer);
2021-12-05 14:31:33 +00:00
//Quit SDL subsystems
SDL_Quit();
}
void gui_loop(Game *game) {
2021-12-10 21:05:59 +00:00
bool quit = false;
2021-12-14 16:18:34 +00:00
bool needs_redraw = true; // there's no need to redraw window when nothing's changed. will be set to false later. first run has to be always done
2021-12-10 21:05:59 +00:00
SDL_Event e;
2021-12-14 16:18:34 +00:00
2021-12-10 21:05:59 +00:00
while(!quit) {
while( SDL_PollEvent( &e ) != 0 )
{
2021-12-14 16:18:34 +00:00
needs_redraw = true;
2021-12-10 21:05:59 +00:00
//User requests quit
if( e.type == SDL_QUIT )
{
quit = true;
}
}
2021-12-14 16:18:34 +00:00
if (needs_redraw) {
SDL_RenderClear(window_renderer);
SDL_Rect tile_rect = tile_size;
for (int i = 0; i < game->field_size_x; i++) {
tile_rect.x = i * 175;
for (int j = 0; j < game->field_size_y; j++) {
tile_rect.y = j * 175;
2021-12-14 16:47:10 +00:00
// get texture index from value
for (int k = 0; k < 13; k++) {
if (!(game->field[i][j] >> k)) {
SDL_RenderCopy( window_renderer, tile_textures[k], NULL, &tile_rect);
break;
}
}
// SDL_RenderCopy( window_renderer, tile_texture, NULL, &tile_rect);
2021-12-14 16:18:34 +00:00
}
}
SDL_RenderPresent(window_renderer);
needs_redraw = false;
}
2021-12-10 21:05:59 +00:00
}
2021-12-05 14:31:33 +00:00
}