keyboard input mapping

This commit is contained in:
David Husicka 2021-12-14 18:56:37 +01:00
parent fcb13db79e
commit 273b86b77d
3 changed files with 65 additions and 10 deletions

View File

@ -1,8 +1,24 @@
#include "2048.h" #include "2048.h"
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <time.h>
#include <stdbool.h>
void game_add_block(Game game) { void game_add_block(Game game) {
bool is_full = true;
for (int i = 0; i < game.field_size_y; i++) {
for (int j = 0; j < game.field_size_x; j++) {
if (game.field[j][i] == 0) {
is_full = false;
break;
}
}
}
if (is_full) {
game.game_over = true;
return 1;
}
size_t x, y; size_t x, y;
int value; int value;
do { do {
@ -15,6 +31,7 @@ void game_add_block(Game game) {
Game game_init(size_t field_size_x, size_t field_size_y) { Game game_init(size_t field_size_x, size_t field_size_y) {
Game game; Game game;
game.game_over = false;
game.field_size_x = field_size_x; game.field_size_x = field_size_x;
game.field_size_y = field_size_y; game.field_size_y = field_size_y;
game.score = 0; game.score = 0;
@ -38,7 +55,7 @@ void game_destroy(Game game) {
game.field = NULL; game.field = NULL;
} }
uint8_t game_move(Game *game, Direction direction) { void game_move(Game *game, Direction direction) {
for (int i = 0; i < game->field_size_y; i++) { for (int i = 0; i < game->field_size_y; i++) {
uint16_t **field = game->field; uint16_t **field = game->field;
// move everything on one side // move everything on one side
@ -154,5 +171,4 @@ uint8_t game_move(Game *game, Direction direction) {
} }
game_add_block(*game); game_add_block(*game);
return 0;
} }

View File

@ -1,5 +1,6 @@
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdbool.h>
#ifndef HEADER_2048 #ifndef HEADER_2048
#define HEADER_2048 #define HEADER_2048
@ -17,10 +18,11 @@ typedef struct Game
uint32_t score; uint32_t score;
size_t field_size_x, field_size_y; size_t field_size_x, field_size_y;
uint16_t **field; uint16_t **field;
bool game_over;
} Game; } Game;
Game game_init(size_t field_size_x, size_t field_size_y); Game game_init(size_t field_size_x, size_t field_size_y);
uint8_t game_move(Game *game, Direction direction); void game_move(Game *game, Direction direction);
void game_destroy(Game game); void game_destroy(Game game);
#endif #endif

View File

@ -49,7 +49,7 @@ void gui_init() {
// load up textures // load up textures
tile_texture = texture_from_png("res/tile.png"); tile_texture = texture_from_png("res/tile.png");
tile_textures[0] = tile_texture; tile_textures[0] = tile_texture;
tile_textures[1] = texture_from_png("res/2.png"); tile_textures[2] = texture_from_png("res/2.png");
tile_textures[3] = texture_from_png("res/4.png"); tile_textures[3] = texture_from_png("res/4.png");
tile_textures[4] = texture_from_png("res/8.png"); tile_textures[4] = texture_from_png("res/8.png");
tile_textures[5] = texture_from_png("res/16.png"); tile_textures[5] = texture_from_png("res/16.png");
@ -69,6 +69,9 @@ void gui_destroy() {
//Destroy window //Destroy window
SDL_DestroyWindow( window ); SDL_DestroyWindow( window );
SDL_DestroyRenderer(window_renderer); SDL_DestroyRenderer(window_renderer);
for (int i = 0; i < 13; i++) {
SDL_DestroyTexture(tile_textures[i]);
}
//Quit SDL subsystems //Quit SDL subsystems
SDL_Quit(); SDL_Quit();
@ -83,11 +86,42 @@ void gui_loop(Game *game) {
while(!quit) { while(!quit) {
while( SDL_PollEvent( &e ) != 0 ) while( SDL_PollEvent( &e ) != 0 )
{ {
needs_redraw = true; switch( e.type ) {
//User requests quit /* Keyboard event */
if( e.type == SDL_QUIT ) /* Pass the event data onto PrintKeyInfo() */
{ case SDL_KEYDOWN:
quit = true; switch (e.key.keysym.sym) {
case SDLK_h:
case SDLK_LEFT:
case SDLK_4:
needs_redraw = true;
game_move(game, Left);
break;
case SDLK_l:
case SDLK_RIGHT:
case SDLK_6:
needs_redraw = true;
game_move(game, Right);
break;
case SDLK_j:
case SDLK_DOWN:
case SDLK_2:
needs_redraw = true;
game_move(game, Down);
break;
case SDLK_k:
case SDLK_UP:
case SDLK_8:
needs_redraw = true;
game_move(game, Up);
break;
}
break;
/* SDL_QUIT event (window close) */
case SDL_QUIT:
quit = 1;
break;
} }
} }
@ -101,7 +135,7 @@ void gui_loop(Game *game) {
// get texture index from value // get texture index from value
for (int k = 0; k < 13; k++) { for (int k = 0; k < 13; k++) {
if (!(game->field[i][j] >> k)) { if (!(game->field[j][i] >> k)) {
SDL_RenderCopy( window_renderer, tile_textures[k], NULL, &tile_rect); SDL_RenderCopy( window_renderer, tile_textures[k], NULL, &tile_rect);
break; break;
} }
@ -109,6 +143,9 @@ void gui_loop(Game *game) {
// SDL_RenderCopy( window_renderer, tile_texture, NULL, &tile_rect); // SDL_RenderCopy( window_renderer, tile_texture, NULL, &tile_rect);
} }
} }
if (game->game_over) {
// render game over screen
}
SDL_RenderPresent(window_renderer); SDL_RenderPresent(window_renderer);
needs_redraw = false; needs_redraw = false;
} }