Hex/src/affichage_plateau.c
Tropicananass b679c9b7a5 historique
2016-05-05 17:24:39 +02:00

154 lines
3.8 KiB
C

#include "affichage_plateau.h"
#include <math.h>
#include <stdlib.h>
#include "param.h"
#include "draw.h"
#define DBORD 4
/* Internes */
void Quadrille (plateau_t p)
{
SDL_Surface* hex = 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));
for (int i = 0; i < NBSIDE; ++i)
{
int dx = p->marge_hori + i * (p->l + 1);
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);
}
void Quadrille_bis (plateau_t p)
{
SDL_Surface* hex = SDL_CreateRGBSurface (SDL_HWSURFACE, 2 * p->r, 2 * p->r, p->window->format->BitsPerPixel, 0, 0, 0, 0);
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->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);
for (int j = 0; j < NBSIDE; ++j)
{
SDL_Rect position = {dx + j * (p->l + 1) / 2, p->marge_vert + j * (1.5 * p->r)};
switch (p->grid[i * NBSIDE + j])
{
case 0:
SDL_BlitSurface (hex, NULL, p->window, &position);
break;
case 1:
SDL_BlitSurface (hex1, NULL, p->window, &position);
break;
case 2:
SDL_BlitSurface (hex2, NULL, p->window, &position);
break;
}
}
}
SDL_FreeSurface(hex);
SDL_FreeSurface(hex1);
SDL_FreeSurface(hex2);
SDL_Flip (p->window);
}
void define_rayon (plateau_t p)
{
int decal_droite = 40;
p->marge_vert = p->window->h / 6;
int width = p->window->w - 2 * decal_droite;
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;
p->marge_hori = p->window->w - decal_droite - 1.5 * (NBSIDE) * 2 * p->r * cos(PI/6);
}
else
{
p->r = r2 - r2%2;
p->marge_hori = p->window->w - decal_droite - 1.5 * (NBSIDE) * 2 * p->r * cos(PI/6);
}
}
/*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, p->window->format->BitsPerPixel, 0, 0, 0, 0);
Uint32 c;
switch (state)
{
case J1 :
c = param->j1;
break;
case J2 :
c = param->j2;
break;
case NORMAL :
c = param->ex;
break;
}
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);
Hexagon (hex, p->r, c, param->j1, DBORD, &(p->l));
break;
case 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);
SDL_FreeSurface (hex);
SDL_Flip (p->window);
}
plateau_t init_plateau (SDL_Surface* window)
{
plateau_t p = malloc (sizeof (struct s_plateau));
p->grid = malloc (sizeof (int) * NBSIDE * NBSIDE);
p->hist = malloc (sizeof (int) * NBSIDE * NBSIDE);
for (int x = 0; x <= NBSIDE * NBSIDE; ++x)
{
p->grid [x] = 0;
p->hist [x] = 0;
}
p->nb_coups = 0;
p->window = window;
p->player = false;
define_rayon(p);
Quadrille (p);
return p;
}
plateau_t actu_plateau (plateau_t p)
{
define_rayon(p);
Quadrille_bis (p);
return p;
}
void free_plateau (plateau_t p)
{
free (p->grid);
free (p);
}