Hex/src/action_menu_principal.c

154 lines
2.9 KiB
C

/*
* action_menu_principal.c
*
* Created on: 21 avr. 2016
* Author: nathan
*/
#include "action_menu_principal.h"
#include <math.h>
#include "globals.h"
#include "affichage_menu_principal.h"
#include "param.h"
void deplacement_menu (menu_t m, SDL_Event* event)
{
char* entries [3][3] = {{"", "Charger", ""}, {"Jouer", "HEX", "Quitter"}, {"", "Options", ""}};
switch (event->type)
{
case SDL_MOUSEMOTION:
{
vec2 pos = {event->motion.x - m->pos.x + m->l/2 - m->r, event->motion.y - m->pos.y};
int ligne = round(pos.y / (1.5 * m->r) - .5);
int colone = round(pos.x / (m->l + 1.) - .5);
vec2 relative = {pos.x % (m->l + 1), pos.y % (int)(1.5 * m->r)};
vec2 proj = {relative.y + relative.x / RAC3, relative.y - relative.x / RAC3};
vec2 hex;
if (ligne % 2)
{
if (proj.y < 0 && proj.x < m->r)
{
/* haut */
hex.y = ligne - 1;
hex.x = colone - ligne / 2;
}
else if (relative.x > m->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 > m->r/2)
{
/* haut droite */
hex.y = ligne - 1;
hex.x = colone - ligne / 2 + 1;
}
else if (proj.x < m->r/2)
{
/* haut gauche */
hex.y = ligne - 1;
hex.x = colone - ligne / 2;
}
else
{
/* bas */
hex.y = ligne;
hex.x = colone - ligne / 2;
}
}
if (0 > hex.x || hex.x >= 3 || 0 > hex.y || hex.y >= 3 || (hex.x != 1 && hex.y != 1))
{
hex.x = 1;
hex.y = 1;
}
if (hex.x != m->cur.x || hex.y != m->cur.y)
{
Affiche_entry(m, entries [m->cur.x][m->cur.y], NORMAL);
m->cur.x = hex.x;
m->cur.y = hex.y;
Affiche_entry(m, entries [hex.x][hex.y], POINTE);
Mix_PlayMusic (param->click, 1);
}
break;
}
case SDL_KEYDOWN:
while (!SDL_PollEvent(event))
{
Affiche_entry(m, entries [m->cur.x][m->cur.y], NORMAL);
switch (event->key.keysym.sym)
{
case SDLK_RIGHT:
++(m->cur.x);
if (m->cur.y != 1)
m->cur.y = 1;
break;
case SDLK_LEFT:
--(m->cur.x);
if (m->cur.y != 1)
m->cur.y = 1;
break;
case SDLK_UP:
--(m->cur.y);
if (m->cur.x != 1)
m->cur.x = 1;
break;
case SDLK_DOWN:
++(m->cur.y);
if (m->cur.x != 1)
m->cur.x = 1;
break;
default:
break;
}
if (m->cur.x >= 3)
m->cur.x = 0;
if (m->cur.x < 0)
m->cur.x = 2;
if (m->cur.y >= 3)
m->cur.y = 0;
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);
SDL_Delay (200);
}
break;
}
}
bool selection_menu (menu_t m, int* r)
{
switch (10 * m->cur.x + m->cur.y)
{
case 01:
*r = M_CHARGER;
return false;
case 10:
*r = M_JOUER;
return true;
case 11:
*r = M_HEX;
return false;
case 12:
*r = M_QUITTER;
return true;
case 21:
*r = M_OPTIONS;
return false;
default:
return false;
}
}