diff --git a/bin/hex b/bin/hex index 199131c..259f5df 100644 Binary files a/bin/hex and b/bin/hex differ diff --git a/makefile b/makefile index 987dbed..f47708e 100644 --- a/makefile +++ b/makefile @@ -3,7 +3,7 @@ CFLAGS=-Wall -g -std=c99 -c #-lm `sdl-config --cflags --libs` -lSDL_ttf LDFLAGS=-std=c99 -lm `sdl-config --cflags --libs` -lSDL_ttf -lSDL_gfx -lSDL_mixer EXEC=bin/hex -SRC=src/hex.c src/affichage_plateau.c src/action_plateau.c src/affichage_menu_principal.c src/window.c src/param.c src/en_jeu.c src/menu_principal.c src/draw.c src/action_menu_principal.c +SRC=src/hex.c src/affichage_plateau.c src/action_plateau.c src/affichage_menu_principal.c src/window.c src/param.c src/en_jeu.c src/menu_principal.c src/draw.c src/action_menu_principal.c src/sound.c #$(wildcard src/*.c) OBJ=$(SRC:.c=.o) diff --git a/ressources/Click.wav b/ressources/Click.wav index d29070f..c6cd8ba 100644 Binary files a/ressources/Click.wav and b/ressources/Click.wav differ diff --git a/ressources/Gong.wav b/ressources/Gong.wav new file mode 100644 index 0000000..79af812 Binary files /dev/null and b/ressources/Gong.wav differ diff --git a/src/action_menu_principal.c b/src/action_menu_principal.c index eb82eec..9c34f89 100644 --- a/src/action_menu_principal.c +++ b/src/action_menu_principal.c @@ -10,7 +10,7 @@ #include #include "globals.h" #include "affichage_menu_principal.h" -#include "param.h" +#include "sound.h" void deplacement_menu (menu_t m, SDL_Event* event) { @@ -79,7 +79,7 @@ void deplacement_menu (menu_t m, SDL_Event* event) m->cur.x = hex.x; m->cur.y = hex.y; Affiche_entry(m, entries [hex.x][hex.y], POINTE); - Mix_PlayMusic (param->click, 1); + play_clik(); } break; } @@ -121,7 +121,7 @@ void deplacement_menu (menu_t m, SDL_Event* event) if (m->cur.y < 0) m->cur.y = 2; Affiche_entry(m, entries [m->cur.x][m->cur.y], POINTE); - Mix_PlayMusic (param->click, 1); + play_clik(); SDL_Delay (200); } break; @@ -137,6 +137,7 @@ bool selection_menu (menu_t m, int* r) return false; case 10: *r = M_JOUER; + play_gong(); return true; case 11: *r = M_HEX; diff --git a/src/action_plateau.c b/src/action_plateau.c index 5c44058..ae7d15d 100644 --- a/src/action_plateau.c +++ b/src/action_plateau.c @@ -6,7 +6,7 @@ #include "affichage_plateau.h" #include "globals.h" -#include "param.h" +#include "sound.h" void selection (plateau_t p, curseur_t c) { @@ -90,7 +90,7 @@ void deplacement (plateau_t p, SDL_Event* event, curseur_t* c) if (0 <= hex.x && hex.x < NBSIDE && 0 <= hex.y && hex.y < NBSIDE) { Affiche_hexagon(p, c->x, c->y, PLAYER(p->player)); - Mix_PlayMusic (param->click, 1); + play_clik(); } } @@ -130,7 +130,7 @@ void deplacement (plateau_t p, SDL_Event* event, curseur_t* c) if (c->y < 0) c->y = NBSIDE - 1; Affiche_hexagon(p, c->x, c->y, PLAYER(p->player)); - Mix_PlayMusic (param->click, 1); + play_clik(); SDL_Delay (100); } break; diff --git a/src/affichage_menu_principal.c b/src/affichage_menu_principal.c index dc96743..1f06617 100644 --- a/src/affichage_menu_principal.c +++ b/src/affichage_menu_principal.c @@ -7,7 +7,14 @@ #include "param.h" #include "draw.h" -#define NBOPTIONS 4 +#define NBOPTIONS 5 + +#define LEFT 0 +#define RIGHT 1 + + +/* Menu */ +/* Interne */ void Redim_entry (SDL_Surface** entry, int rayon, int l) { @@ -81,7 +88,6 @@ void Case_menu (menu_t m, int rayon) } /* Externes */ -/* Menu */ void Affiche_menu_principal (menu_t m) { @@ -126,15 +132,15 @@ void Affiche_entry (menu_t m, char* entry, bool pointe) } /* Menu options */ +/* Interne */ -void Affiche_menu_options (SDL_Surface* window, int rayon, int l) +void print_arrow (SDL_Surface* window, bool side, ) +{ + SDL_Surface* arrow = SDL_CreateRGBSurface (SDL_HWSURFACE, 2*m->r, 2*m->r, window->format->BitsPerPixel, 0, 0, 0, 0); +} + +SDL_Rect cadre_options (SDL_Surface* window, int l) { - SDL_Surface* hex = SDL_CreateRGBSurface (SDL_HWSURFACE, rayon * 2, rayon * 2, window->format->BitsPerPixel, 0, 0, 0, 0); - Hexagon_single (hex, rayon, SDL_MapRGB(hex->format, 0, 0, 0), &l); - int dx = (window->w - 4 * (l + 1)) / 2 - rayon + l/2 + 1 + (l + 1); - SDL_Rect pos_hex = {dx + 2 * (l + 1) / 2, 2 * (1.5 * rayon)}; - SDL_BlitSurface (hex, NULL, window, &pos_hex); - SDL_FreeSurface (hex); SDL_Rect pos = {(window->w - 4 * (l + 1)) / 2 + (l + 1) / 2, 0, 2 * l + 1, window->h * 11. /12}; SDL_FillRect (window, &pos, param->ex); pos.x += 10; @@ -142,24 +148,25 @@ void Affiche_menu_options (SDL_Surface* window, int rayon, int l) pos.w -= 20; pos.h -= 20; SDL_FillRect (window, &pos, param->in); - int size = pos.h * 2 / 3. / NBOPTIONS; - int margev = pos.h / 3. / (NBOPTIONS + 1); - - char* entry_name [NBOPTIONS] = {"Musique : ", "Couleurs : ", "Taille : ", "Retour"}; - - pos.y += margev; - pos.w -= 40; - pos.x += 10; + return pos; +} +int create_options_surfaces (SDL_Surface* entry [NBOPTIONS]) +{ + char* entry_name [NBOPTIONS] = {"Musique : ", "Son : ", "Couleurs : ", "Taille : ", "Retour"}; + // Also modify NBOPTIONS int maxw = 0; - SDL_Surface* entry [NBOPTIONS]; for (int i = 0; i < NBOPTIONS; ++i) { entry [i] = TTF_RenderUTF8_Blended (param->font, entry_name [i], param->rgb_ex); if (maxw < entry[i]->w) maxw = entry[i]->w; } + return maxw; +} +SDL_Rect blit_redim_options (SDL_Surface* window, SDL_Surface* entry [NBOPTIONS], SDL_Rect pos, int maxw, int size, int margev) +{ for (int i = 0; i < NBOPTIONS - 1; ++i) { SDL_Surface* entry_dim; @@ -178,11 +185,16 @@ void Affiche_menu_options (SDL_Surface* window, int rayon, int l) SDL_Rect pos_entry = {pos.x + (pos.w / 2 - entry_dim->w) / 2, pos.y + (size - entry_dim->h) / 2, 0, 0}; SDL_BlitSurface (entry_dim, NULL, window, &pos_entry); - putPixel(window, pos_entry.x + pos_entry.w, pos_entry.y, SDL_MapRGB (window->format, 0, 255, 0)); + pos.y += size + margev; SDL_FreeSurface (entry_dim); } + return pos; +} + +SDL_Rect blit_redim_retour (SDL_Surface* window, SDL_Surface* entry [NBOPTIONS], SDL_Rect pos, int maxw, int size) +{ SDL_Surface* entry_dim; if (pos.w / 2 < entry[NBOPTIONS-1]->w) { @@ -207,10 +219,38 @@ void Affiche_menu_options (SDL_Surface* window, int rayon, int l) SDL_FillRect (window, &pos_cadre, param->in); SDL_BlitSurface (entry_dim, NULL, window, &pos_entry); - pos.y += size + margev; - SDL_FreeSurface (entry_dim); + return pos; +} + +/* Externe */ + +void Affiche_menu_options (SDL_Surface* window, int rayon, int l) +{ + SDL_Surface* hex = SDL_CreateRGBSurface (SDL_HWSURFACE, rayon * 2, rayon * 2, window->format->BitsPerPixel, 0, 0, 0, 0); + Hexagon_single (hex, rayon, SDL_MapRGB(hex->format, 0, 0, 0), &l); + int dx = (window->w - 4 * (l + 1)) / 2 - rayon + l/2 + 1 + (l + 1); + SDL_Rect pos_hex = {dx + 2 * (l + 1) / 2, 2 * (1.5 * rayon)}; + SDL_BlitSurface (hex, NULL, window, &pos_hex); + SDL_FreeSurface (hex); + + SDL_Rect pos = cadre_options (window, l); + + int size = pos.h * 2 / 3. / NBOPTIONS; + int margev = pos.h / 3. / (NBOPTIONS + 1); + + pos.y += margev; + pos.w -= 40; + pos.x += 10; + + SDL_Surface* entry [NBOPTIONS]; + + int maxw = create_options_surfaces (entry); + + pos = blit_redim_options (window, entry, pos, maxw, size, margev); + pos = blit_redim_retour (window, entry, pos, maxw, size); + for (int i = 0 ; i < window->h; ++i) putPixel (window, pos.x + pos.w/2 + 10, i, SDL_MapRGB (window->format, 0, 255, 0)); @@ -219,39 +259,37 @@ void Affiche_menu_options (SDL_Surface* window, int rayon, int l) } /* Scroll */ +/* Interne */ -/*typedef struct s_scrolling { - SDL_Surface* msg [NBMESS]; - SDL_Rect* pos; - SDL_Rect* dim; - int first_msg, nb_msg, nb_msg_max; -}* scrolling_t;*/ - -scrolling_t init_scroll (SDL_Surface* window) +int Cadre_scroll (SDL_Surface* window) { - char* message [NBMESS] = {"Crédits : petite bite & gros chakal Corp.", "Breaking News : Le Soudan en manque de soudeurs", "lmqsdkmq"}; - SDL_Color c [NBMESS] = {{170,10,107}, {60,255,1}, {0, 0, 0}}; - scrolling_t s = malloc (sizeof (struct s_scrolling)); - - /* Bande de scroll */ int size = window->h / 24; SDL_Rect bande = {0, window->h * 45. / 48, window->w, size}; SDL_FillRect (window, &bande, param->in); SDL_Flip (window); + return size; +} - /* Creation surfaces */ +void create_messages_surfaces (scrolling_t s, int size, int bpp) +{ + char* message [NBMESS] = {"Crédits : petite bite & gros chakal Corp.", "Breaking News : Le Soudan en manque de soudeurs", "lmqsdkmq", "There is nothing to see here ... BASTARD !"}; + // Also modify NBMESS + SDL_Color c [NBMESS] = {{170,10,107}, {60,255,1}, {0, 0, 0}, {200, 180, 201}}; for (int i = 0; i < NBMESS; ++i) { assert (message [i] != NULL); SDL_Surface* texte = TTF_RenderUTF8_Blended(param->font, message [i], c [i]);//, param->rgb_ex); Redim_entry(&texte, size, texte->w); - s->msg [i] = SDL_CreateRGBSurface (SDL_HWSURFACE, texte->w + 1, texte->h, window->format->BitsPerPixel, 0, 0, 0, 0); + s->msg [i] = SDL_CreateRGBSurface (SDL_HWSURFACE, texte->w + 1, texte->h, bpp, 0, 0, 0, 0); SDL_Rect temp = {0, 0, s->msg [i]->w, s->msg [i]->h}; SDL_FillRect (s->msg [i], &temp, param->in); SDL_BlitSurface (texte, NULL, s->msg [i], &temp); SDL_FreeSurface (texte); } +} +void nb_msg_max (scrolling_t s, SDL_Surface* window) +{ s->nb_msg_max = 1; for (int i = 0; i < NBMESS; ++i) { @@ -266,8 +304,12 @@ scrolling_t init_scroll (SDL_Surface* window) s->nb_msg_max = nb_msg; } ++s->nb_msg_max; - s->nb_msg_max += s->nb_msg_max % NBMESS; + while (s->nb_msg_max % NBMESS != 0) + ++s->nb_msg_max; +} +void init_pos_dim (scrolling_t s, SDL_Surface* window) +{ s->pos = malloc (sizeof (SDL_Rect) * s->nb_msg_max); s->dim = malloc (sizeof (SDL_Rect) * s->nb_msg_max); for (int i = 0; i < s->nb_msg_max; ++i) @@ -279,6 +321,22 @@ scrolling_t init_scroll (SDL_Surface* window) s->dim [i].w = s->msg [i%NBMESS]->w; s->dim [i].h = s->msg [i%NBMESS]->h; } +} + +/* Externe */ + +scrolling_t init_scroll (SDL_Surface* window) +{ + scrolling_t s = malloc (sizeof (struct s_scrolling)); + + int size = Cadre_scroll (window); + + /* Creation surfaces */ + create_messages_surfaces (s, size, window->format->BitsPerPixel); + + nb_msg_max (s, window); + + init_pos_dim (s, window); s->first_msg = 0; s->nb_msg = 1; diff --git a/src/affichage_menu_principal.h b/src/affichage_menu_principal.h index c4e6cbe..d0e83bf 100644 --- a/src/affichage_menu_principal.h +++ b/src/affichage_menu_principal.h @@ -4,7 +4,7 @@ #include #include "globals.h" -#define NBMESS 3 +#define NBMESS 4 typedef struct s_scrolling { SDL_Surface* msg [NBMESS]; diff --git a/src/affichage_plateau.c b/src/affichage_plateau.c index db01e75..996a8ed 100644 --- a/src/affichage_plateau.c +++ b/src/affichage_plateau.c @@ -33,10 +33,10 @@ void Quadrille_bis (plateau_t p) SDL_Surface* hex1 = SDL_CreateRGBSurface (SDL_HWSURFACE, 2 * p->r, 2 * p->r, p->window->format->BitsPerPixel, 0, 0, 0, 0); SDL_Surface* hex2 = SDL_CreateRGBSurface (SDL_HWSURFACE, 2 * p->r, 2 * p->r, p->window->format->BitsPerPixel, 0, 0, 0, 0); Hexagon (hex, p->r, param->ex, param->in, DBORD, &(p->l)); - Hexagon (hex1, p->r, param->ex, param->in, DBORD, &(p->l)); - Circle (hex1, p->l, param->j2); - Hexagon (hex2, p->r, param->ex, param->in, DBORD, &(p->l)); - Circle (hex2, p->l, param->j1); + Hexagon (hex1, p->r, param->ex, param->j1, DBORD, &(p->l)); + //Circle (hex1, p->l, param->j2); + Hexagon (hex2, p->r, param->ex, param->j2, DBORD, &(p->l)); + //Circle (hex2, p->l, param->j1); for (int i = 0; i < NBSIDE; ++i) { int dx = p->marge_hori + i * (p->l + 1); @@ -102,14 +102,18 @@ void Affiche_hexagon (plateau_t p, int x, int y, int state) c = param->ex; break; } - Hexagon (hex, p->r, c, param->in, DBORD, &(p->l)); switch (p->grid[x * NBSIDE + y]) { + case NORMAL : + Hexagon (hex, p->r, c, param->in, DBORD, &(p->l)); + break; case J1: - Circle (hex, p->l, param->j1); + //Circle (hex, p->l, param->j1); + Hexagon (hex, p->r, c, param->j1, DBORD, &(p->l)); break; case J2: - Circle (hex, p->l, param->j2); + //Circle (hex, p->l, param->j2); + Hexagon (hex, p->r, c, param->j2, DBORD, &(p->l)); break; } SDL_BlitSurface (hex, NULL, p->window, &position); diff --git a/src/en_jeu.c b/src/en_jeu.c index 3eda482..1d461af 100644 --- a/src/en_jeu.c +++ b/src/en_jeu.c @@ -11,9 +11,11 @@ #include "action_plateau.h" #include "affichage_plateau.h" #include "window.h" +#include "param.h" void en_jeu (SDL_Surface* window) { + Mix_PlayMusic(param->music, -1); plateau_t plateau = init_plateau (window); vec2 c = {0, 0}; bool end = 0; @@ -52,4 +54,6 @@ void en_jeu (SDL_Surface* window) } } free_plateau (plateau); + Mix_HaltMusic(); + Mix_RewindMusic(); } diff --git a/src/globals.h b/src/globals.h index 8b5d5b3..5303fa1 100644 --- a/src/globals.h +++ b/src/globals.h @@ -61,7 +61,10 @@ typedef struct s_param { Uint32 in, ex, j1, j2, background; SDL_Color rgb_in, rgb_ex, rgb_j1, rgb_j2, rgb_background; TTF_Font* font; - Mix_Music* click; + Mix_Music* music; + unsigned char music_vol; + Mix_Chunk* click,* gong; + unsigned char chunk_vol; }* param_t; #endif /* _GLOBALS_H_ */ diff --git a/src/hex.c b/src/hex.c index 16286bc..38c3b47 100644 --- a/src/hex.c +++ b/src/hex.c @@ -31,7 +31,6 @@ int main(int argc, char **argv) } } save_param(window); - SDL_FreeSurface (window); - SDL_Quit (); + Free_window (window); return 0; } diff --git a/src/param.c b/src/param.c index a1d2452..1220dc0 100644 --- a/src/param.c +++ b/src/param.c @@ -12,6 +12,8 @@ #include #include +#include "sound.h" + #define C_IN SDL_MapRGB (w->format, 50, 50, 50) #define C_EX SDL_MapRGB (w->format, 100, 100, 100) #define C_J1 SDL_MapRGB (w->format, 255, 0, 0) @@ -81,7 +83,8 @@ void load_param (SDL_Surface* w) } fclose (param_file); } - param->click = Mix_LoadMUS("ressources/Click03.wav"); + + Load_sound (); } void save_param (SDL_Surface* w) @@ -96,7 +99,7 @@ void save_param (SDL_Surface* w) for (int i = 0; i < 5 ; ++i) { fprintf (param_file, "%s = %d %d %d\n", field [i], rgb->r, rgb->g, rgb->b); - //printf ("%d - %d - %d\n", rgb->r, rgb->g, rgb->b); + //printf ("%d - %d - %d\n", rgb->r, rsgb->g, rgb->b); rgb += 1; } @@ -119,5 +122,6 @@ void save_param (SDL_Surface* w) } free (param); fclose (param_file); - Mix_FreeMusic(param->click); + + Free_sound (); } diff --git a/src/sound.c b/src/sound.c new file mode 100644 index 0000000..3d73292 --- /dev/null +++ b/src/sound.c @@ -0,0 +1,42 @@ +/* + * sound.c + * + * Created on: 23 avr. 2016 + * Author: nathan + */ + +#include "sound.h" +#include +#include "param.h" + +void Load_sound (void) +{ + param->music_vol = .25 * MIX_MAX_VOLUME; + param->music = Mix_LoadMUS ("ressources/theme.mp3"); + Mix_VolumeMusic (param->music_vol); + + param->chunk_vol = .25 * MIX_MAX_VOLUME; + printf ("%d\n", param->chunk_vol); + param->click = Mix_LoadWAV("ressources/Click.wav"); + Mix_VolumeChunk (param->click, .5 * param->chunk_vol); + + param->gong = Mix_LoadWAV("ressources/Gong.wav"); + Mix_VolumeChunk (param->gong, param->chunk_vol); +} + +void Free_sound (void) +{ + Mix_FreeMusic (param->music); + Mix_FreeChunk (param->click); + Mix_FreeChunk (param->gong); +} + +void play_clik (void) +{ + Mix_PlayChannel(0, param->click, 0); +} + +void play_gong (void) +{ + //Mix_PlayChannel(1, param->gong, 0); +} diff --git a/src/sound.h b/src/sound.h new file mode 100644 index 0000000..af55116 --- /dev/null +++ b/src/sound.h @@ -0,0 +1,20 @@ +/* + * sound.h + * + * Created on: 23 avr. 2016 + * Author: nathan + */ + +#ifndef _SOUND_H_ +#define _SRC_SOUND_H_ + + +void Load_sound (void); + +void Free_sound (void); + +void play_clik (void); + +void play_gong (void); + +#endif /* _SOUND_H_ */ diff --git a/src/window.c b/src/window.c index 526e658..6151414 100644 --- a/src/window.c +++ b/src/window.c @@ -25,6 +25,7 @@ SDL_Surface* init_window () if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 1024) == -1) fprintf(stderr, "Mix init failed : %s\n", Mix_GetError()); + Mix_AllocateChannels(3); //MIX_CHANNELS const SDL_VideoInfo* info = SDL_GetVideoInfo(); int bpp; @@ -130,3 +131,11 @@ void Reset_window (SDL_Surface* window) SDL_FillRect (window, NULL, param->background); SDL_Flip (window); } + +void Free_window (SDL_Surface* window) +{ + SDL_FreeSurface (window); + SDL_Quit(); + TTF_Quit(); + Mix_CloseAudio(); +} diff --git a/src/window.h b/src/window.h index 56463c1..d69acf1 100644 --- a/src/window.h +++ b/src/window.h @@ -11,4 +11,6 @@ SDL_Surface* fullscreen_window (SDL_Surface* window); void Reset_window (SDL_Surface* window); +void Free_window (SDL_Surface* window); + #endif /* _WINDOW_H_ */