add gui for game over
This commit is contained in:
parent
273b86b77d
commit
558086f56f
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
|
@ -0,0 +1,89 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="800"
|
||||||
|
height="920"
|
||||||
|
viewBox="0 0 211.66666 243.41667"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5"
|
||||||
|
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20, custom)"
|
||||||
|
sodipodi:docname="game_over.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview7"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
showgrid="false"
|
||||||
|
units="px"
|
||||||
|
width="800px"
|
||||||
|
inkscape:zoom="1.0180501"
|
||||||
|
inkscape:cx="379.64733"
|
||||||
|
inkscape:cy="362.4576"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1011"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1" />
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<rect
|
||||||
|
x="70.262996"
|
||||||
|
y="57.504998"
|
||||||
|
width="686.5568"
|
||||||
|
height="303.83988"
|
||||||
|
id="rect12444" />
|
||||||
|
<rect
|
||||||
|
x="16.997874"
|
||||||
|
y="64.511345"
|
||||||
|
width="142.45095"
|
||||||
|
height="94.937476"
|
||||||
|
id="rect9954" />
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<rect
|
||||||
|
style="fill:#ededed;fill-opacity:0.91326994;stroke:none;stroke-width:4.99999;stroke-linejoin:round;paint-order:stroke fill markers"
|
||||||
|
id="rect3956"
|
||||||
|
height="243.41667"
|
||||||
|
x="0"
|
||||||
|
y="1.110223e-16"
|
||||||
|
width="211.66667"
|
||||||
|
inkscape:export-filename="/home/dudi/c/2048/res/game_over.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
transform="scale(0.26458333)"
|
||||||
|
id="text12442"
|
||||||
|
style="fill:black;fill-opacity:1;line-height:1.25;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;white-space:pre;shape-inside:url(#rect12444)"
|
||||||
|
inkscape:export-filename="/home/dudi/c/2048/res/game_over.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:22.5778px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
|
||||||
|
x="41.559414"
|
||||||
|
y="64.095924"
|
||||||
|
id="text13308"
|
||||||
|
inkscape:export-filename="/home/dudi/c/2048/res/game_over.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan13306"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:22.5778px;font-family:'URW Gothic';-inkscape-font-specification:'URW Gothic Bold';stroke-width:0.264583"
|
||||||
|
x="41.559414"
|
||||||
|
y="64.095924">Game Over</tspan></text>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 3.0 KiB |
24
src/2048.c
24
src/2048.c
|
@ -3,30 +3,30 @@
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
void game_add_block(Game game) {
|
void game_add_block(Game *game) {
|
||||||
|
|
||||||
bool is_full = true;
|
bool is_full = true;
|
||||||
for (int i = 0; i < game.field_size_y; i++) {
|
for (int i = 0; i < game->field_size_y; i++) {
|
||||||
for (int j = 0; j < game.field_size_x; j++) {
|
for (int j = 0; j < game->field_size_x; j++) {
|
||||||
if (game.field[j][i] == 0) {
|
if (game->field[j][i] == 0) {
|
||||||
is_full = false;
|
is_full = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (is_full) {
|
if (is_full) {
|
||||||
game.game_over = true;
|
game->game_over = true;
|
||||||
return 1;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t x, y;
|
size_t x, y;
|
||||||
int value;
|
int value;
|
||||||
do {
|
do {
|
||||||
x = rand() % game.field_size_x;
|
x = rand() % game->field_size_x;
|
||||||
y = rand() % game.field_size_y;
|
y = rand() % game->field_size_y;
|
||||||
value = (rand() % 2) + 1;
|
value = (rand() % 2) + 1;
|
||||||
} while (game.field[x][y] != 0);
|
} while (game->field[x][y] != 0);
|
||||||
game.field[x][y] = value * 2;
|
game->field[x][y] = value * 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
@ -42,7 +42,7 @@ Game game_init(size_t field_size_x, size_t field_size_y) {
|
||||||
|
|
||||||
time_t t;
|
time_t t;
|
||||||
srand((unsigned) time(&t));
|
srand((unsigned) time(&t));
|
||||||
game_add_block(game);
|
game_add_block(&game);
|
||||||
|
|
||||||
return game;
|
return game;
|
||||||
}
|
}
|
||||||
|
@ -170,5 +170,5 @@ void game_move(Game *game, Direction direction) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
game_add_block(*game);
|
game_add_block(game);
|
||||||
}
|
}
|
11
src/gui.c
11
src/gui.c
|
@ -14,6 +14,7 @@ SDL_Renderer *window_renderer = NULL;
|
||||||
SDL_Texture* tile_texture = NULL;
|
SDL_Texture* tile_texture = NULL;
|
||||||
SDL_Texture* tile_textures[13];
|
SDL_Texture* tile_textures[13];
|
||||||
SDL_Rect tile_size;
|
SDL_Rect tile_size;
|
||||||
|
SDL_Texture* game_over_texture = NULL;
|
||||||
|
|
||||||
SDL_Texture *texture_from_png(char *n) {
|
SDL_Texture *texture_from_png(char *n) {
|
||||||
SDL_Surface *s = IMG_Load(n);
|
SDL_Surface *s = IMG_Load(n);
|
||||||
|
@ -63,6 +64,8 @@ void gui_init() {
|
||||||
tile_size.x = 0;
|
tile_size.x = 0;
|
||||||
tile_size.y = 0;
|
tile_size.y = 0;
|
||||||
SDL_QueryTexture(tile_texture, NULL, NULL, &tile_size.w, &tile_size.h);
|
SDL_QueryTexture(tile_texture, NULL, NULL, &tile_size.w, &tile_size.h);
|
||||||
|
|
||||||
|
game_over_texture = texture_from_png("res/game_over.png");
|
||||||
}
|
}
|
||||||
|
|
||||||
void gui_destroy() {
|
void gui_destroy() {
|
||||||
|
@ -72,6 +75,7 @@ void gui_destroy() {
|
||||||
for (int i = 0; i < 13; i++) {
|
for (int i = 0; i < 13; i++) {
|
||||||
SDL_DestroyTexture(tile_textures[i]);
|
SDL_DestroyTexture(tile_textures[i]);
|
||||||
}
|
}
|
||||||
|
SDL_DestroyTexture(game_over_texture);
|
||||||
|
|
||||||
//Quit SDL subsystems
|
//Quit SDL subsystems
|
||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
|
@ -117,8 +121,6 @@ void gui_loop(Game *game) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* SDL_QUIT event (window close) */
|
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
quit = 1;
|
quit = 1;
|
||||||
break;
|
break;
|
||||||
|
@ -129,9 +131,9 @@ void gui_loop(Game *game) {
|
||||||
SDL_RenderClear(window_renderer);
|
SDL_RenderClear(window_renderer);
|
||||||
SDL_Rect tile_rect = tile_size;
|
SDL_Rect tile_rect = tile_size;
|
||||||
for (int i = 0; i < game->field_size_x; i++) {
|
for (int i = 0; i < game->field_size_x; i++) {
|
||||||
tile_rect.x = i * 175;
|
tile_rect.x = i * 175 + 50;
|
||||||
for (int j = 0; j < game->field_size_y; j++) {
|
for (int j = 0; j < game->field_size_y; j++) {
|
||||||
tile_rect.y = j * 175;
|
tile_rect.y = j * 175 + 150;
|
||||||
|
|
||||||
// get texture index from value
|
// get texture index from value
|
||||||
for (int k = 0; k < 13; k++) {
|
for (int k = 0; k < 13; k++) {
|
||||||
|
@ -145,6 +147,7 @@ void gui_loop(Game *game) {
|
||||||
}
|
}
|
||||||
if (game->game_over) {
|
if (game->game_over) {
|
||||||
// render game over screen
|
// render game over screen
|
||||||
|
SDL_RenderCopy(window_renderer, game_over_texture, NULL, NULL);
|
||||||
}
|
}
|
||||||
SDL_RenderPresent(window_renderer);
|
SDL_RenderPresent(window_renderer);
|
||||||
needs_redraw = false;
|
needs_redraw = false;
|
||||||
|
|
Loading…
Reference in New Issue