commit aff407037b5919529b5aa52fd6201dae9c63be3c Author: Nathan Date: Wed Apr 6 14:29:07 2016 +0200 plateau fini diff --git a/src/action_plateau.c b/src/action_plateau.c new file mode 100644 index 0000000..1b6658a --- /dev/null +++ b/src/action_plateau.c @@ -0,0 +1,116 @@ +//#include "action_plateau.h" + +#include +#include + +#include "action_plateau.h" + +#define RAC3 1.73205080757 + +void deplacement (plateau_t p, SDL_Event* event, curseur_t* c) +{ + switch (event->type) + { + case SDL_MOUSEMOTION: + { + vec2 pos = {event->motion.x - (p->marge_hori + p->r - p->l/2 - 1), event->motion.y - (p->marge_vert + 1)}; + int ligne = round(pos.y / (1.5 * p->r + 1) - .5); + int colone = round(pos.x / (p->l + 1.) - .5); + vec2 relative = {pos.x % (p->l + 1), pos.y % (int)(1.5 * p->r + 1)}; + vec2 proj = {relative.y + relative.x / RAC3, relative.y - relative.x / RAC3}; + vec2 hex; + if (ligne % 2) + { + if (proj.y < 0 && proj.x < p->r) + { + /* haut */ + hex.y = ligne - 1; + hex.x = colone - ligne / 2; + } + else if (relative.x > p->l / 2) + { + /* bas droite */ + hex.y = ligne; + hex.x = colone - ligne / 2; + } + else + { + /* bas gauche */ + hex.y = ligne; + hex.x = colone - ligne / 2 - 1; + } + } + else + { + if (-proj.y > p->r/2) + { + /* haut droite */ + hex.y = ligne - 1; + hex.x = colone - ligne / 2 + 1; + } + else if (proj.x < p->r/2) + { + /* haut gauche */ + hex.y = ligne - 1; + hex.x = colone - ligne / 2; + } + else + { + /* bas */ + hex.y = ligne; + hex.x = colone - ligne / 2; + } + } + + if (hex.x != c->x || hex.y != c->y) + { + + if (0 <= c->x && c->x < NBSIDE && 0 <= c->y && c->y < NBSIDE) + Affiche_hexagon(p, c->x, c->y, NORMAL); + c->x = hex.x; + c->y = hex.y; + if (0 <= hex.x && hex.x < NBSIDE && 0 <= hex.y && hex.y < NBSIDE) + Affiche_hexagon(p, c->x, c->y, J1); + } + + + + break; + } + case SDL_KEYDOWN: + while (!SDL_PollEvent(event)) + { + if (0 <= c->x && c->x < NBSIDE && 0 <= c->y && c->y < NBSIDE) + Affiche_hexagon(p, c->x, c->y, NORMAL); + switch (event->key.keysym.sym) + { + case SDLK_RIGHT: + ++(c->x); + break; + case SDLK_LEFT: + --(c->x); + break; + case SDLK_UP: + --(c->y); + break; + case SDLK_DOWN: + ++(c->y); + break; + default: + break; + } + if (c->x >= NBSIDE) + c->x = 0; + if (c->x < 0) + c->x = NBSIDE - 1; + if (c->y >= NBSIDE) + c->y = 0; + if (c->y < 0) + c->y = NBSIDE - 1; + Affiche_hexagon(p, c->x, c->y, J1); + sleep_ms (100); + } + break; + } + +} diff --git a/src/action_plateau.h b/src/action_plateau.h new file mode 100644 index 0000000..5662232 --- /dev/null +++ b/src/action_plateau.h @@ -0,0 +1,9 @@ +#ifndef _ACTION_PLATEAU_H_ +#define _ACTION_PLATEAU_H_ + +#include "affichage_plateau.h" +#include "globals.h" + +void deplacement (plateau_t p, SDL_Event* event, curseur_t* c); + +#endif /* _ACTION_PLATEAU_H_ */ diff --git a/src/affichage_menu_principal.c b/src/affichage_menu_principal.c new file mode 100644 index 0000000..16d0d40 --- /dev/null +++ b/src/affichage_menu_principal.c @@ -0,0 +1,48 @@ +#include "affichage_menu_principal.h" + +#include +#include "globals.h" + +void Affiche_menu_principal (SDL_Surface* window) +{ + int width = window->w; + int height = window->h; + + SDL_Surface* entry; + + if (TTF_Init ()) //Check error + fprintf (stderr, "Erreur d'inistialisation SDL : %s\n", SDL_GetError()); + + SDL_Rect position = {0, 0}; + + SDL_Color fontColor = {255, 255, 255}; + + int size_titre = 10; + int size_entries = 22; + int margev_titre = 20; + int margev_entries = 4; + + /* Titre */ + + TTF_Font *fontMenu = TTF_OpenFont("ressources/cac_champagne.ttf",60); // charger une fonte (un peu moche) + if (fontMenu == NULL) + { + perror ("camarche pas"); + exit (1); + } + entry = TTF_RenderText_Blended(fontMenu, "HEX", fontColor); + position.x = window->w / 2 - size_titre * 3; + position.y = margev_titre; + + SDL_BlitSurface (entry, NULL, window, &position); + SDL_Flip (window); + //SDL_FreeSurface(entry); + + /* Jouer */ + //entry = SDL_CreateRGBSurface (SDL_HWSURFACE, , , window->format->BitsPerPixel, 0, 0, 0, 0); + //SDL_FillRect (entry, NULL, BPP_entries); + + /* Charger */ + /* Option */ + /* Quitter */ +} diff --git a/src/affichage_menu_principal.h b/src/affichage_menu_principal.h new file mode 100644 index 0000000..52d2bcd --- /dev/null +++ b/src/affichage_menu_principal.h @@ -0,0 +1,9 @@ +#ifndef _AFFICHAGE_MENU_PRICIPAL_ +#define _AFFICHAGE_MENU_PRICIPAL_ + +#include + + +void Affiche_menu_principal (SDL_Surface* window); + +#endif /* _AFFICHAGE_MENU_PRICIPAL_ */ diff --git a/src/affichage_plateau.c b/src/affichage_plateau.c new file mode 100644 index 0000000..08c8d7c --- /dev/null +++ b/src/affichage_plateau.c @@ -0,0 +1,220 @@ +#include "affichage_plateau.h" + +#include +#include +#include + +#include "globals.h" + +//gcc src/affichage_plateau.c -Wall -std=c99 `sdl-config --cflags --libs` -g -lm -o src/plateau + +/* Internes */ +/* source : http://www.gnurou.org/writing/linuxmag/sdl/partie1 */ + +void putPixel(SDL_Surface * surface, Uint16 x, Uint16 y, Uint32 color) +{ + /* Nombre de bits par pixels de la surface d'écran */ + Uint8 bpp = surface->format->BytesPerPixel; + /* Pointeur vers le pixel à remplacer (pitch correspond à la taille + d'une ligne d'écran, c'est à dire (longueur * bitsParPixel) + pour la plupart des cas) */ + Uint8 * p = ((Uint8 *)surface->pixels) + y * surface->pitch + x * bpp; + switch(bpp) + { + case 1: + *p = (Uint8) color; + break; + case 2: + *(Uint16 *)p = (Uint16) color; + break; + case 3: + if (SDL_BYTEORDER == SDL_BIG_ENDIAN) + { + *(Uint16 *)p = ((color >> 8) & 0xff00) | ((color >> 8) & 0xff); + *(p + 2) = color & 0xff; + } + else + { + *(Uint16 *)p = color & 0xffff; + *(p + 2) = ((color >> 16) & 0xff) ; + } + break; + case 4: + *(Uint32 *)p = color; + break; + } +} + +void Central_Square (SDL_Surface* hex, int* x, int* y, Uint32 color, int r) +{ + int width = x[0] - x[2]; + int height = r;//y[2] - y[3]; + + SDL_Surface* square = SDL_CreateRGBSurface (SDL_HWSURFACE, width, height, 32, 0, 0, 0, 0); + SDL_FillRect (square, NULL, color); + SDL_Rect position = {x[3], y[3]}; + SDL_BlitSurface (square, NULL, hex, &position); + SDL_FreeSurface (square); +} + +void Triangles (SDL_Surface* hex, int* x, int* y, Uint32 color, int r) +{ + int h = r/2;//y[1] - y[2]; + int l = (x[0] - x[2])/2; + SDL_LockSurface (hex); + for (int j = 0; j < h; ++j) + for (int i = - l * (h - j) / h; i <= l * (h - j) / h; ++i) + { + putPixel (hex, x[1] + i - 1, y[3] - j, color); + putPixel (hex, x[1] + i - 1, y[0] + j, color); + } + SDL_UnlockSurface (hex); +} + +void Hexagon (SDL_Surface* hex, int rayon, Uint32 color_out, Uint32 color_in, int* l) +{ + int x [4]; + int y [4]; + for (int i = 0; i < 4; ++i) + { + x [i] = cos(i * PI/3 + PI/6) * rayon + rayon; + y [i] = sin(i * PI/3 + PI/6) * rayon + rayon; + } + *l = x[0] - x[2]; + Central_Square (hex, x, y, color_out, rayon); + Triangles (hex, x, y, color_out, rayon); + for (int i = 0; i < 4; ++i) + { + x [i] = cos(i * PI/3 + PI/6) * (rayon - 4) + rayon; + y [i] = sin(i * PI/3 + PI/6) * (rayon - 4) + rayon; + } + Central_Square (hex, x, y, color_in, rayon - 4); + Triangles (hex, x, y, color_in, rayon - 4); + SDL_Flip (hex); + SDL_SetColorKey (hex , SDL_SRCCOLORKEY, SDL_MapRGB( hex->format, 0, 0, 0)); // set black as transparent +} + +void Quadrille (plateau_t p) +{ + SDL_Surface* hex = SDL_CreateRGBSurface (SDL_HWSURFACE, 2 * p->r, 2 * p->r, 32, 0, 0, 0, 0); + Hexagon (hex, p->r, SDL_MapRGB (p->window->format, 100, 100, 100), SDL_MapRGB (p->window->format, 50, 50, 50), &(p->l)); + for (int i = 0; i < NBSIDE; ++i) + { + int dx = p->marge_hori + i * (p->l + 1);//(2 * rayon * cos(PI/6)); + for (int j = 0; j < NBSIDE; ++j) + { + SDL_Rect position = {dx + j * (p->l + 1) / 2, p->marge_vert + j * (1.5 * p->r)}; + SDL_BlitSurface (hex, NULL, p->window, &position); + } + } + SDL_FreeSurface(hex); + SDL_Flip (p->window); +} + +/*Externes*/ + +void Affiche_hexagon (plateau_t p, int x, int y, int state) +{ + SDL_Rect position = {p->marge_hori + x * (p->l + 1) + y * (p->l + 1) / 2, p->marge_vert + y * (1.5 * p->r)}; + SDL_Surface* hex = SDL_CreateRGBSurface (SDL_HWSURFACE, 2 * p->r, 2 * p->r, 32, 0, 0, 0, 0); + Uint32 c; + switch (state) + { + case J1 : + c = SDL_MapRGB (p->window->format, 255, 0, 0); + break; + case J2 : + c = SDL_MapRGB (p->window->format, 0, 0, 255); + break; + case NORMAL : + c = SDL_MapRGB (p->window->format, 100, 100, 100); + break; + } + Hexagon (hex, p->r, c, SDL_MapRGB (p->window->format, 50, 50, 50), &(p->l)); + SDL_BlitSurface (hex, NULL, p->window, &position); + SDL_FreeSurface (hex); + SDL_Flip (p->window); +} + +plateau_t init_plateau (SDL_Surface* window) +{ + plateau_t p = malloc (sizeof (struct s_plateau)); + p->window = window; + p->marge_hori = 40; + p->marge_vert = 40; + int width = window->w - 2 * p->marge_hori; + int height = window->h - 2 * p->marge_vert; + int r1 = (height - (NBSIDE - 1)) / (.5 + NBSIDE * 1.5); + int r2 = width / ((3 * NBSIDE - 1) * cos (PI/6)); + if (r1 < r2) + p->r = r1 - r1%2; + else + p->r = r2 - r2%2; + Quadrille (p); + return p; +} + +plateau_t actu_plateau (plateau_t p) +{ + p->marge_hori = 40; + p->marge_vert = 40; + int width = p->window->w - 2 * p->marge_hori; + int height = p->window->h - 2 * p->marge_vert; + int r1 = (height - (NBSIDE - 1)) / (.5 + NBSIDE * 1.5); + int r2 = width / ((3 * NBSIDE - 1) * cos (PI/6)); + if (r1 < r2) + p->r = r1 - r1%2; + else + p->r = r2 - r2%2; + Quadrille (p); + return p; +} + +void free_plateau (plateau_t p) +{ + free (p); +} + + +/*int main (int argc, char* argv[]) +{ + if (SDL_Init (SDL_INIT_VIDEO)) + fprintf (stderr, "Erreur d'inistialisation SDL : %s\n", SDL_GetError()); + + SDL_DisplayFormat() dm; + if (SDL_GetDisplayMode(0, &dm) != 0) { + SDL_Log("SDL_GetDisplayMode failed: %s", SDL_GetError()); + return 1; + } + SDL_Surface* window = SDL_SetVideoMode (DWIDTH, DHEIGHT, BPP, SDL_HWSURFACE | SDL_RESIZABLE); + SDL_FillRect (window, NULL, SDL_MapRGB(window->format, 0, 0, 0)); + SDL_Flip (window); + SDL_Color c = {100, 100, 100}; + Affiche_plateau (window, c); + + bool end = false; + + while (!end) + { + SDL_Event event; + SDL_WaitEvent (&event); + switch (event.type) + { + case SDL_VIDEORESIZE: + if (event.resize.w >= DWIDTH && event.resize.h >= DHEIGHT ) + { + window = SDL_SetVideoMode (event.resize.w, event.resize.h, BPP, SDL_HWSURFACE | SDL_RESIZABLE); + Affiche_plateau (window, c); + } + else // force la fenetre a minimum Default Size : marche moyen + window = SDL_SetVideoMode (DWIDTH, DHEIGHT, BPP, SDL_HWSURFACE | SDL_RESIZABLE); + break; + case SDL_QUIT: + end = true; + break; + } + } + SDL_FreeSurface (window); + SDL_Quit (); + return 0; +}*/ diff --git a/src/affichage_plateau.h b/src/affichage_plateau.h new file mode 100644 index 0000000..2423891 --- /dev/null +++ b/src/affichage_plateau.h @@ -0,0 +1,18 @@ +#ifndef _AFFICHAGE_PLATEAU_H_ +#define _AFFICHAGE_PLATEAU_H_ + +#include + +#define COLOR 32 + +typedef struct s_plateau* plateau_t; + +void Affiche_hexagon (plateau_t p, int x, int y, int state); + +plateau_t init_plateau (SDL_Surface* window); + +plateau_t actu_plateau (plateau_t p); + +void free_plateau (plateau_t p); + +#endif /* _AFFICHAGE_PLATEAU_H_ */ diff --git a/src/en_jeu.c b/src/en_jeu.c new file mode 100644 index 0000000..4e63f03 --- /dev/null +++ b/src/en_jeu.c @@ -0,0 +1,56 @@ +/* + * en_jeu.c + * + * Created on: 6 avr. 2016 + * Author: nathan + */ + +#include "en_jeu.h" + +#include "globals.h" +#include "action_plateau.h" +#include "affichage_plateau.h" +#include "window.h" + +void en_jeu (SDL_Surface* window) +{ + plateau_t plateau = init_plateau (window); + vec2 c = {-1, -1}; + int end = 0; + while (!end) + { + SDL_Event event; + SDL_WaitEvent (&event); + switch (event.type) + { + case SDL_VIDEORESIZE: + { + resize_window(window, &event); + plateau = actu_plateau(plateau); + break; + } + case SDL_MOUSEBUTTONDOWN: + { + break; + } + case SDL_KEYDOWN: + if (event.key.keysym.sym == SDLK_ESCAPE) + end = 1; + else if (event.key.keysym.sym == SDLK_f) + { + window = fullscreen_window(window); + plateau = actu_plateau(plateau); + } + else if (SDLK_UP <= event.key.keysym.sym && event.key.keysym.sym <= SDLK_LEFT) + deplacement(plateau, &event, &c); + break; + case SDL_MOUSEMOTION: + deplacement(plateau, &event, &c); + break; + case SDL_QUIT: + end = 1; + break; + } + } + free_plateau (plateau); +} diff --git a/src/en_jeu.h b/src/en_jeu.h new file mode 100644 index 0000000..7c98dc8 --- /dev/null +++ b/src/en_jeu.h @@ -0,0 +1,15 @@ +/* + * en_jeu.h + * + * Created on: 6 avr. 2016 + * Author: nathan + */ + +#ifndef _EN_JEU_H_ +#define _EN_JEU_H_ + +#include + +void en_jeu (SDL_Surface* window); + +#endif /* _EN_JEU_H_ */ diff --git a/src/globals.h b/src/globals.h new file mode 100644 index 0000000..c6f3485 --- /dev/null +++ b/src/globals.h @@ -0,0 +1,37 @@ +#ifndef _GLOBALS_H_ +#define _GLOBALS_H_ + +//#define BPP 32 +#define DWIDTH 800 +#define DHEIGHT 600 +#define NBSIDE 11 +#define PI 3.14159265 + +#define J1 1 +#define J2 2 +#define NORMAL 0 + +typedef struct s_vec3{ + int x; + int y; + int z; +} vec3; + +typedef struct s_vec2{ + int x; + int y; +} vec2; + +typedef struct s_vec2 curseur_t; + +struct s_plateau { + int l; + int r; + int marge_vert; + int marge_hori; + SDL_Surface* window; +}; + +void sleep_ms(int milliseconds); + +#endif /* _GLOBALS_H_ */ diff --git a/src/hex.c b/src/hex.c new file mode 100644 index 0000000..9152d38 --- /dev/null +++ b/src/hex.c @@ -0,0 +1,43 @@ +/******************************************************** + * Jeux Hex * + * + ********************************************************/ + +#include +#include "window.h" +#include "globals.h" +#include "affichage_menu_principal.h" +#include "en_jeu.h" + +#ifdef WIN32 +#include +#elif _POSIX_C_SOURCE >= 199309L +#include // for nanosleep +#else +#include // for usleep +#endif + +void sleep_ms(int milliseconds) // cross-platform sleep function +{ +#ifdef WIN32 + Sleep(milliseconds); +#elif _POSIX_C_SOURCE >= 199309L + struct timespec ts; + ts.tv_sec = milliseconds / 1000; + ts.tv_nsec = (milliseconds % 1000) * 1000000; + nanosleep(&ts, NULL); +#else + usleep(milliseconds * 1000); +#endif +} + +int main (void) +{ + SDL_Surface* window = init_window(); + //Affiche_menu_principal(window); + en_jeu (window); + SDL_FreeSurface (window); + SDL_Quit (); + + return 0; +} diff --git a/src/menu_principal.c b/src/menu_principal.c new file mode 100644 index 0000000..33d6e7e --- /dev/null +++ b/src/menu_principal.c @@ -0,0 +1,18 @@ +#include "window.h" + +int event_menu_principal (SDL_Event* event) +{ + while (1) + { + SDL_WaitEvent (event); + switch (event->type) + { + case SDL_MOUSEMOTION: + return 1; + break; + case SDL_BUTTON_LEFT: + break; + } + } + return -1; +} diff --git a/src/menu_principal.h b/src/menu_principal.h new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/menu_principal.h @@ -0,0 +1 @@ + diff --git a/src/window.c b/src/window.c new file mode 100644 index 0000000..f3ab506 --- /dev/null +++ b/src/window.c @@ -0,0 +1,65 @@ +#include "window.h" + +#include +#include "globals.h" + + +SDL_Surface* init_window () +{ + if (SDL_Init (SDL_INIT_VIDEO)) + fprintf (stderr, "Erreur d'inistialisation SDL : %s\n", SDL_GetError()); + + SDL_Surface* window = SDL_SetVideoMode (DWIDTH, DHEIGHT, SDL_GetVideoInfo()->vfmt->BitsPerPixel, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF); + SDL_FillRect (window, NULL, SDL_MapRGB(window->format, 0, 0, 0)); + SDL_Flip (window); + return window; +} + +SDL_Surface* resize_window (SDL_Surface* window, SDL_Event* event) +{ + int w = event->resize.w, h = event->resize.h; + while (!SDL_PollEvent(event) || event->type == SDL_VIDEORESIZE) + { + w = event->resize.w; + h = event->resize.h; + } + printf ("%d - %d\n", w, h); + SDL_FreeSurface (window); + if (w >= DWIDTH && h >= DHEIGHT) + window = SDL_SetVideoMode(w, h, SDL_GetVideoInfo()->vfmt->BitsPerPixel, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF); + else + window = SDL_SetVideoMode (DWIDTH, DHEIGHT, SDL_GetVideoInfo()->vfmt->BitsPerPixel, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF); + return window; +} + +SDL_Surface* fullscreen_window (SDL_Surface* window) +{ + if (window->flags & SDL_FULLSCREEN) + { + window = SDL_SetVideoMode (DWIDTH, DHEIGHT, SDL_GetVideoInfo()->vfmt->BitsPerPixel, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF); + } + else + { + SDL_Rect** modes = SDL_ListModes(window->format, SDL_HWSURFACE | SDL_DOUBLEBUF| SDL_FULLSCREEN); + if(modes == (SDL_Rect **)0) + { + printf("No modes available!\n"); + exit(-1); + } + + /* Check if our resolution is restricted */ + if(modes == (SDL_Rect **)-1) + { + printf("All resolutions available.\n"); + } + else{ + /* Print valid modes */ + printf("Available Modes\n"); + for(int i=0;modes[i];++i) + printf(" %d x %d\n", modes[i]->w, modes[i]->h); + SDL_FreeSurface (window); + window = SDL_SetVideoMode(modes[0]->w, modes[0]->h, SDL_GetVideoInfo()->vfmt->BitsPerPixel, SDL_HWSURFACE | SDL_FULLSCREEN | SDL_DOUBLEBUF); + } + } + return window; +} diff --git a/src/window.h b/src/window.h new file mode 100644 index 0000000..4e51d7a --- /dev/null +++ b/src/window.h @@ -0,0 +1,12 @@ +#ifndef _WINDOW_H_ +#define _WINDOW_H_ + +#include + +SDL_Surface* init_window (); + +SDL_Surface* resize_window (SDL_Surface* window, SDL_Event* event); + +SDL_Surface* fullscreen_window (SDL_Surface* window); + +#endif /* _WINDOW_H_ */