From b19b79a33e73731dca4da69e1d8862d535b87ee8 Mon Sep 17 00:00:00 2001 From: nandotk Date: Thu, 25 May 2017 21:42:11 +0200 Subject: [PATCH 1/8] add player move anim and time out --- .gitignore | 3 ++- src/client.c | 4 ++-- src/map.c | 35 +++++++++++++++++++++++++---------- src/request.c | 2 +- src/response.c | 2 +- src/server.c | 4 +++- 6 files changed, 34 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 9b1fe79..ce00633 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ *.dSYM/ *.su -beerbomber \ No newline at end of file +beerbomber +/CMakeLists.txt diff --git a/src/client.c b/src/client.c index 8d1ed7a..3d3cadc 100644 --- a/src/client.c +++ b/src/client.c @@ -128,7 +128,7 @@ int one_left(t_game *g) for (int i = 0; i < MAX_PLAYER; ++i) { if (g->player[i]->connected == 1 && - g->player[i]->life > 0) { + g->player[i]->life > 0) { a++; } } @@ -156,7 +156,7 @@ void client_beer_bomber(t_game *game) /* Handle the key redefining */ go = do_redefine(game); } else if (game->info->status == IN_GAME || - game->info->status == IN_CONFIG_NEW_GAME) { + game->info->status == IN_CONFIG_NEW_GAME) { go = get_input(game); send_request(server, game); get_response(server, game); diff --git a/src/map.c b/src/map.c index b9dccde..1eb8f29 100644 --- a/src/map.c +++ b/src/map.c @@ -9,30 +9,45 @@ void draw_map_base(t_game *game) } } +void draw_one_player(t_game *g, int sprite, int i) +{ + if (g->input->up) { + drawImage(g, getSprite(sprite), + g->player[i]->x, g->player[i]->y); + } else if (g->input->down) { + drawImage(g, getSprite(sprite + 1), + g->player[i]->x, g->player[i]->y); + } else if (g->input->left) { + drawImage(g, getSprite(sprite + 2), + g->player[i]->x, g->player[i]->y); + } else if (g->input->right) { + drawImage(g, getSprite(sprite + 3), + g->player[i]->x, g->player[i]->y); + } else { + drawImage(g, getSprite(sprite + 1), + g->player[i]->x, g->player[i]->y); + } +} + void draw_player(t_game *g) { for (int i = 0; i < MAX_PLAYER; ++i) { if (g->player[i]->connected == 1) { switch (i) { case 0: - drawImage(g, getSprite(PLAYER_ONE_DOWN), - g->player[i]->x, g->player[i]->y); + draw_one_player(g, PLAYER_ONE_UP, i); break; case 1: - drawImage(g, getSprite(PLAYER_TWO_DOWN), - g->player[i]->x, g->player[i]->y); + draw_one_player(g, PLAYER_TWO_UP, i); break; case 2: - drawImage(g, getSprite(PLAYER_THREE_DOWN), - g->player[i]->x, g->player[i]->y); + draw_one_player(g, PLAYER_THREE_UP, i); break; case 3: - drawImage(g, getSprite(PLAYER_FOUR_DOWN), - g->player[i]->x, g->player[i]->y); + draw_one_player(g, PLAYER_FOUR_UP, i); break; default: - drawImage(g, getSprite(PLAYER_TWO_DOWN), - g->player[i]->x, g->player[i]->y); + draw_one_player(g, PLAYER_TWO_UP, i); break; } } diff --git a/src/request.c b/src/request.c index 29ce14f..9547e92 100644 --- a/src/request.c +++ b/src/request.c @@ -30,7 +30,7 @@ int send_serialize_request(t_request *req, int sock) request[strlen(request)] = '\0'; - printf("client: request: %s \n", request); +// printf("client: request: %s \n", request); if (send(sock, request, strlen(request), 0) < 0) { printf("Send failed\n"); return (1); diff --git a/src/response.c b/src/response.c index 4da9a1d..80c63dc 100644 --- a/src/response.c +++ b/src/response.c @@ -46,7 +46,7 @@ int serialize_response(t_response *res, int sock) } response[strlen(response)] = '\0'; - printf("response: %s\n", response); +// printf("response: %s\n", response); if (send(sock, response, strlen(response), 0) < 0) { puts("Send failed"); return (0); diff --git a/src/server.c b/src/server.c index facaa35..e010eab 100644 --- a/src/server.c +++ b/src/server.c @@ -105,8 +105,10 @@ int my_server(t_env *e) e->fd_max = e->player[i]->fd; } } + /** set 1 min timeout */ + struct timeval tv = {60, 0}; if (select(e->fd_max + 1, - &e->fd_read, &e->fd_write, NULL, NULL) == -1) { + &e->fd_read, &e->fd_write, NULL, &tv) == -1) { return (0); } for (int i = 0; i < MAX_PLAYER; i++) { From 33dbd2731900c95397e1e7f7393d7a53d1b66eaa Mon Sep 17 00:00:00 2001 From: nandotk Date: Fri, 16 Jun 2017 20:54:59 +0200 Subject: [PATCH 2/8] player face with direction feature --- src/client.c | 13 +++++++------ src/graphics.c | 9 +++++---- src/map.c | 28 ++++++++++++++-------------- src/map.h | 2 +- src/response.c | 2 ++ src/server.c | 11 ++++++++--- src/server.h | 1 + src/structs.h | 1 + 8 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/client.c b/src/client.c index 3d3cadc..56a49df 100644 --- a/src/client.c +++ b/src/client.c @@ -76,12 +76,13 @@ void unserialize_response(char *buffer, t_game *g) if (g->player[i] != NULL) { g->player[i]->x = atoi(buff2[0]); g->player[i]->y = atoi(buff2[1]); - g->player[i]->ammo = atoi(buff2[2]); - g->player[i]->reload = atoi(buff2[3]); - g->player[i]->frags = atoi(buff2[4]); - g->player[i]->connected = atoi(buff2[5]); - g->player[i]->life = atoi(buff2[6]); - g->player[i]->speed = atoi(buff2[7]); + g->player[i]->dir = atoi(buff2[2]); + g->player[i]->ammo = atoi(buff2[3]); + g->player[i]->reload = atoi(buff2[4]); + g->player[i]->frags = atoi(buff2[5]); + g->player[i]->connected = atoi(buff2[6]); + g->player[i]->life = atoi(buff2[7]); + g->player[i]->speed = atoi(buff2[8]); } } } diff --git a/src/graphics.c b/src/graphics.c index 068dc02..895215c 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -36,7 +36,7 @@ void loadSprite(t_game *game, int index, char *path) sprite[index].image = loadImage(game, path); } -SDL_Texture *getSprite(int index) +SDL_Texture *get_sprite(int index) { if (index >= MAX_SPRITES || index < 0) { printf("Invalid index for sprite! Index: %d Maximum: %d\n", index, MAX_SPRITES); @@ -98,6 +98,7 @@ void loadPlayerTexture(t_game *game, char *path, int index) void load_all_sprites(t_game *game) { + loadPlayerTexture(game, "gfx/players/one.png", PLAYER_ONE_UP); loadPlayerTexture(game, "gfx/players/one.png", PLAYER_ONE_UP); loadPlayerTexture(game, "gfx/players/two.png", PLAYER_TWO_UP); loadPlayerTexture(game, "gfx/players/three.png", PLAYER_THREE_UP); @@ -129,7 +130,7 @@ void draw_background(t_game *game, int index) pos.y = 0; pos.h = SCREEN_HEIGHT; pos.w = SCREEN_WIDTH; - SDL_RenderCopy(game->renderer, getSprite(index), NULL, &pos); + SDL_RenderCopy(game->renderer, get_sprite(index), NULL, &pos); } void drawBtn(t_game *game, int x, int y, int index) @@ -137,10 +138,10 @@ void drawBtn(t_game *game, int x, int y, int index) SDL_Rect pos; int w; int h; - SDL_QueryTexture(getSprite(index), NULL, NULL, &w, &h); + SDL_QueryTexture(get_sprite(index), NULL, NULL, &w, &h); pos.x = x; pos.y = y; pos.h = h; pos.w = w; - SDL_RenderCopy(game->renderer, getSprite(index), NULL, &pos); + SDL_RenderCopy(game->renderer, get_sprite(index), NULL, &pos); } diff --git a/src/map.c b/src/map.c index 1eb8f29..f81429a 100644 --- a/src/map.c +++ b/src/map.c @@ -4,27 +4,27 @@ void draw_map_base(t_game *game) { for (int i = 0; i < MAP_SIZE; i++) { for (int j = 0; j < MAP_SIZE; j++) { - drawImage(game, getSprite(MAP_SPRITE_BASE), i, j); + drawImage(game, get_sprite(MAP_SPRITE_BASE), i, j); } } } void draw_one_player(t_game *g, int sprite, int i) { - if (g->input->up) { - drawImage(g, getSprite(sprite), + if (g->player[i]->dir == 1) { + drawImage(g, get_sprite(sprite), g->player[i]->x, g->player[i]->y); - } else if (g->input->down) { - drawImage(g, getSprite(sprite + 1), + } else if (g->player[i]->dir == 2) { + drawImage(g, get_sprite(sprite + 1), g->player[i]->x, g->player[i]->y); - } else if (g->input->left) { - drawImage(g, getSprite(sprite + 2), + } else if (g->player[i]->dir == 3) { + drawImage(g, get_sprite(sprite + 2), g->player[i]->x, g->player[i]->y); - } else if (g->input->right) { - drawImage(g, getSprite(sprite + 3), + } else if (g->player[i]->dir == 4) { + drawImage(g, get_sprite(sprite + 3), g->player[i]->x, g->player[i]->y); } else { - drawImage(g, getSprite(sprite + 1), + drawImage(g, get_sprite(sprite + 1), g->player[i]->x, g->player[i]->y); } } @@ -60,14 +60,14 @@ void draw_map_entity(t_game *game) for (int j = 0; j < MAP_SIZE; ++j) { if (game->map[i][j].data[0] == '0' && game->map[i][j].data[1] == '1') { - drawImage(game, getSprite(MAP_SPRITE_BUSH), i, j); + drawImage(game, get_sprite(MAP_SPRITE_BUSH), i, j); } else if (game->map[i][j].data[0] == '1') { - drawImage(game, getSprite(MAP_SPRITE_BLOCK), i, j); + drawImage(game, get_sprite(MAP_SPRITE_BLOCK), i, j); } if (game->map[i][j].data[3] == '1') { - drawImage(game, getSprite(BOMB_SPRITE), i, j); + drawImage(game, get_sprite(BOMB_SPRITE), i, j); } else if (game->map[i][j].data[4] == '1') { - drawImage(game, getSprite(MAP_SPRITE_FIRE), i, j); + drawImage(game, get_sprite(MAP_SPRITE_FIRE), i, j); } } } diff --git a/src/map.h b/src/map.h index 6b6f6fd..63da8a0 100644 --- a/src/map.h +++ b/src/map.h @@ -5,6 +5,6 @@ void drawImage(t_game *, SDL_Texture *, int, int); -SDL_Texture *getSprite(int); +SDL_Texture *get_sprite(int); #endif /* MAP_H */ diff --git a/src/response.c b/src/response.c index 80c63dc..4423e31 100644 --- a/src/response.c +++ b/src/response.c @@ -19,6 +19,8 @@ int serialize_response(t_response *res, int sock) strcat(response, buff); sprintf(buff, "%i:", res->player[i]->y); strcat(response, buff); + sprintf(buff, "%i:", res->player[i]->dir); + strcat(response, buff); sprintf(buff, "%i:", res->player[i]->ammo); strcat(response, buff); sprintf(buff, "%i:", res->player[i]->reload); diff --git a/src/server.c b/src/server.c index e010eab..c194c70 100644 --- a/src/server.c +++ b/src/server.c @@ -120,14 +120,18 @@ int my_server(t_env *e) if (e->player[i]->type == FD_CLIENT) { client_req = get_player_request(e->player[i]->fd); if (client_req != NULL) { - /* check if player can move or throw bomb */ + /** set new dir */ + e->player[i]->dir = client_req->dir; + /** check if player can move or throw bomb */ do_player_move(e, client_req, i); do_player_throw_bomb(e, client_req, i); + /** check if player quit */ if (client_req->ckecksum == 1) { return (0); } - /* send response to player with all env data */ + + /** send response to player with all env data */ send_response(e, e->player[i]); } } @@ -154,6 +158,7 @@ void *server_beer_bomber(void *args) break ; env.player[i]->x = 0; env.player[i]->y = 0; + env.player[i]->dir = 1; env.player[i]->ammo = 0; env.player[i]->reload = 0; env.player[i]->frags = 0; @@ -162,7 +167,7 @@ void *server_beer_bomber(void *args) env.player[i]->speed = 0; } - // TODO: create list for timer opti. + // TODO: create list for timer optimisation. env.timer = malloc(MAX_TIMER * sizeof(t_timer *)); for (int i = 0; i < MAX_TIMER; ++i) { env.timer[i] = NULL; diff --git a/src/server.h b/src/server.h index 85d51dc..66cd75d 100644 --- a/src/server.h +++ b/src/server.h @@ -32,6 +32,7 @@ typedef struct s_player int x; int y; int fd; + int dir; int type; int life; int ammo; diff --git a/src/structs.h b/src/structs.h index 82e53c6..45af3ab 100644 --- a/src/structs.h +++ b/src/structs.h @@ -22,6 +22,7 @@ typedef struct s_player int x; int y; int fd; + int dir; int type; int ammo; int life; From 8654f8fcde304f9dec12c3b61fd8a2f8f4809b67 Mon Sep 17 00:00:00 2001 From: nandotk Date: Fri, 16 Jun 2017 23:59:40 +0200 Subject: [PATCH 3/8] add echap feature --- src/client.c | 5 ++++- src/input.c | 2 +- src/main.c | 24 +++++++++++++----------- src/redefine.c | 2 +- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/client.c b/src/client.c index 56a49df..d58922d 100644 --- a/src/client.c +++ b/src/client.c @@ -175,7 +175,10 @@ void client_beer_bomber(t_game *game) delay(frame_limit); frame_limit = SDL_GetTicks() + 16; } - draw_winner(game); + if (go == 1) { + draw_winner(game); + } + send_deco(server); clean_client(game); } diff --git a/src/input.c b/src/input.c index 667c564..7551814 100644 --- a/src/input.c +++ b/src/input.c @@ -13,7 +13,7 @@ int get_input(t_game *game) /* Closing the Window will exit the program */ case SDL_QUIT: game->info->status = END_GAME; - return (1); + return (2); case SDL_KEYDOWN: key = event.key.keysym.sym; diff --git a/src/main.c b/src/main.c index b301909..6cf55c6 100644 --- a/src/main.c +++ b/src/main.c @@ -33,18 +33,20 @@ int main(void) } /* new game: start server thread */ - if (choice == 2) { - game->info->playermax = nb_player; - if (pthread_create(&server, NULL, server_beer_bomber, game->info)) { - perror("pthread_create server"); - return (EXIT_FAILURE); + if (go == 1) { + if (choice == 2) { + game->info->playermax = nb_player; + if (pthread_create(&server, NULL, server_beer_bomber, game->info)) { + perror("pthread_create server"); + return (EXIT_FAILURE); + } } - } - client_beer_bomber(game); - if (choice == 2) { - if (pthread_join(server, NULL)) { - perror("pthread_join server"); - return (EXIT_FAILURE); + client_beer_bomber(game); + if (choice == 2) { + if (pthread_join(server, NULL)) { + perror("pthread_join server"); + return (EXIT_FAILURE); + } } } diff --git a/src/redefine.c b/src/redefine.c index ae41cd3..b80f8a9 100644 --- a/src/redefine.c +++ b/src/redefine.c @@ -35,7 +35,7 @@ int do_redefine(t_game *game) while (key == -2) { key = get_single_input(); if (key == 1) - return (1); + return (2); draw_redefine(game); } From bfcf631ec4d24746e9ad1c56953e1ece08718361 Mon Sep 17 00:00:00 2001 From: nandotk Date: Sat, 17 Jun 2017 17:11:54 +0200 Subject: [PATCH 4/8] remote server ip --- src/client.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/client.c b/src/client.c index d58922d..c29b76c 100644 --- a/src/client.c +++ b/src/client.c @@ -1,6 +1,6 @@ #include "client.h" -int client_connect() +int client_connect(char *ip) { struct protoent *pe; struct sockaddr_in sin; @@ -12,7 +12,7 @@ int client_connect() return (-1); sin.sin_family = AF_INET; sin.sin_port = htons(5000); - sin.sin_addr.s_addr = inet_addr("127.0.0.1"); + sin.sin_addr.s_addr = inet_addr(ip); if (connect(s, (const struct sockaddr *) &sin, sizeof(sin)) == -1) { printf("Error connect()\n"); return (-1); @@ -144,12 +144,17 @@ void client_beer_bomber(t_game *game) { unsigned int frame_limit = SDL_GetTicks() + 16; int go = 0; + char ip[15] = ""; + init_client(game); /* connect to server */ - SDL_Delay(500); - int server = client_connect(); + SDL_Delay(400); + printf("Server beerbomber IP: "); + fgets(ip, sizeof(ip), stdin); + int server = client_connect(ip); send_request(server, game); + SDL_Delay(100); get_response(server, game); while (!go) { From 4de082cb394ca73b0dea90f265b27bf941b71b92 Mon Sep 17 00:00:00 2001 From: nandotk Date: Sat, 17 Jun 2017 18:57:11 +0200 Subject: [PATCH 5/8] rev timer --- src/client.c | 3 ++- src/server.c | 1 - src/server.h | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/client.c b/src/client.c index c29b76c..8893280 100644 --- a/src/client.c +++ b/src/client.c @@ -101,7 +101,8 @@ int get_response(int sock, t_game *g) char buffer[BUFF_SIZE]; if (recv(sock, buffer, BUFF_SIZE, 0) < 0) { - puts("recv failed"); + puts("connection server failed"); + puts("trying to get response ..."); return (1); } unserialize_response(buffer, g); diff --git a/src/server.c b/src/server.c index c194c70..93e7db2 100644 --- a/src/server.c +++ b/src/server.c @@ -140,7 +140,6 @@ int my_server(t_env *e) do_timing_entity(e); - usleep(50000); return (1); } diff --git a/src/server.h b/src/server.h index 66cd75d..cc04f7b 100644 --- a/src/server.h +++ b/src/server.h @@ -20,12 +20,12 @@ # define MAX_TIMER 40 # define MAP_SIZE 15 -# define PLAYER_SPEED 4 +# define PLAYER_SPEED 10 # define PLAYER_MAX_LIFE 2 # define PLAYER_MAX_AMMO 100 -# define PLAYER_RELOAD_TIME 9 -# define BOMB_LIFETIME 100000 -# define FIRE_LIFETIME 10000 +# define PLAYER_RELOAD_TIME 10 +# define BOMB_LIFETIME 1000000 +# define FIRE_LIFETIME 100000 typedef struct s_player { From 61e65cb265a00f072b7678cf838b34c2c293073b Mon Sep 17 00:00:00 2001 From: nandotk Date: Sat, 17 Jun 2017 20:00:36 +0200 Subject: [PATCH 6/8] timer ends --- src/draw.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/draw.c b/src/draw.c index 3738c14..3fba218 100644 --- a/src/draw.c +++ b/src/draw.c @@ -68,9 +68,6 @@ void draw_winner(t_game *g) { char text[50]; - /* Blank the screen and draw background */ - SDL_RenderClear(g->renderer); - draw_background(g, MAP_BACK_ONE); /* Draw winner info */ sprintf(text, "AND THE WINNER IS ..."); drawString(g, text, 50, 100, g->font, 1, 0); @@ -86,5 +83,5 @@ void draw_winner(t_game *g) /* Update the buffer */ SDL_RenderPresent(g->renderer); /* Sleep briefly for better perf */ - SDL_Delay(5000); + SDL_Delay(2500); } From b524ca15a2b0dc060d52d1c87834d7294ccd451d Mon Sep 17 00:00:00 2001 From: nandotk Date: Sat, 17 Jun 2017 20:16:49 +0200 Subject: [PATCH 7/8] comment joystick to for x360 controller --- src/defs.h | 3 ++- src/input.c | 60 ++++++++++++++++++++++++++--------------------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/defs.h b/src/defs.h index 67eba78..e38df5b 100644 --- a/src/defs.h +++ b/src/defs.h @@ -21,7 +21,8 @@ # define BOARD_HEIGHT (SCREEN_HEIGHT / 2) - (MAP_SIZE * 32 / 2) # define MAX_PLAYER 4 # define MAX_SPRITES 40 -# define DEAD_ZONE 3200 +# define DEAD_ZONE 4200 +# define X360_BACK 13 # define BUFF_SIZE 3000 enum sprite diff --git a/src/input.c b/src/input.c index 7551814..6709d57 100644 --- a/src/input.c +++ b/src/input.c @@ -73,31 +73,31 @@ int get_input(t_game *game) game->input->fire = 0; break; - case SDL_JOYAXISMOTION: - /* Horizontal movement */ - if (event.jaxis.axis == 0) { - if (event.jaxis.value < -DEAD_ZONE) - game->input->left = 1; - else if (event.jaxis.value > DEAD_ZONE) - game->input->right = 1; - else { - game->input->left = 0; - game->input->right = 0; - } - } - - /* Vertical movement */ - if (event.jaxis.axis == 1) { - if (event.jaxis.value < -DEAD_ZONE) { - game->input->up = 1; - } else if (event.jaxis.value > DEAD_ZONE) { - game->input->down = 1; - } else { - game->input->up = 0; - game->input->down = 0; - } - } - break; +// case SDL_JOYAXISMOTION: +// /* Horizontal movement */ +// if (event.jaxis.axis == 0) { +// if (event.jaxis.value < -DEAD_ZONE) +// game->input->left = 1; +// else if (event.jaxis.value > DEAD_ZONE) +// game->input->right = 1; +// else { +// game->input->left = 0; +// game->input->right = 0; +// } +// } +// +// /* Vertical movement */ +// if (event.jaxis.axis == 1) { +// if (event.jaxis.value < -DEAD_ZONE) { +// game->input->up = 1; +// } else if (event.jaxis.value > DEAD_ZONE) { +// game->input->down = 1; +// } else { +// game->input->up = 0; +// game->input->down = 0; +// } +// } +// break; } } @@ -126,11 +126,11 @@ int get_single_input() key = event.key.keysym.sym; break; - case SDL_JOYAXISMOTION: - if (abs(event.jaxis.value) > DEAD_ZONE) { - key = -3; - } - break; +// case SDL_JOYAXISMOTION: +// if (abs(event.jaxis.value) > DEAD_ZONE) { +// key = -3; +// } +// break; case SDL_JOYBUTTONDOWN: key = event.jbutton.button; From eeb10923cd7b78ffffba43d779d0fc400858cc2c Mon Sep 17 00:00:00 2001 From: Victor Balssa Date: Sat, 17 Jun 2017 21:29:45 +0200 Subject: [PATCH 8/8] Update README.md --- README.md | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c3afa5f..6a4fbb8 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,12 @@ # BeerBomber [![Build Status](https://travis-ci.org/beergame/BeerBomber.svg?branch=staging)](https://travis-ci.org/beergame/BeerBomber) -Bomberman clone in C/SDL -# Contributor -[Aurelien Paranavithana](https://github.com/AurelienParana), [Roland Coulibaly](https://github.com/rolandcoulibaly), [Victor Balssa](https://github.com/Nandotk), [Simon Garreau-Férandin](https://github.com/garreas) +Bomberman clone in C/SDL 360 controller ready + +
+
+
+ + # Build BeerBomber @@ -15,7 +19,7 @@ $ brew install sdl2 sdl2_image sdl2_ttf sdl2_mixer Or with `apt-source` for Linux based OS ``` shell -$ sudo apt-get install libsdl2-2.0-0 libsdl2-dev libsdl2-image-2.0-0 libsdl2-image-dev && +$ sudo apt-get install libsdl2-2.0-0 libsdl2-dev libsdl2-image-2.0-0 libsdl2-image-dev \ libsdl2-mixer-2.0-0 libsdl2-mixer-dev libsdl2-ttf-2.0-0 libsdl2-ttf-dev ``` @@ -26,4 +30,8 @@ $ make all You will have an executable named `beerbomber` that you can run -#### Enjoy ! :bomb::bomb::fire::beers: +#### :beers::bomb::fire: + + +# Contributor +[Aurelien Paranavithana](https://github.com/AurelienParana), [Roland Coulibaly](https://github.com/rolandcoulibaly), [Victor Balssa](https://github.com/Nandotk), [Simon Garreau-Férandin](https://github.com/garreas)