This repository has been archived on 2023-11-03. You can view files and clone it, but cannot push or open issues or pull requests.
GINPA/Controleur/carte.c

162 lines
3.3 KiB
C

#include "carte.h"
void initialiserCarte(Carte *const carte)
{
if(carte != NULL)
{
carte->zoom = -1;
carte->type = FIRSTYPE + 1;
carte->echelle = -1.0;
carte->mapSprite = NULL;
carte->mapTexture = NULL;
carte->pointCentral = (Coordonnees){128, -256};
carte->pointHautGauche = (Coordonnees){128, -256};
carte->pointBasDroite = (Coordonnees){128, -256};
}
else
{
fprintf(stderr, "Erreur lors de l\'initialisation d\'une carte qui n\'existe pas.\n");
exit(EXIT_FAILURE);
}
}
void calculPointCentral(Carte *const carte)
{
if(carte != NULL)
{
// Coordonnées du point central du rectangle fictif
if(carte->pointHautGauche.lon <= carte->pointBasDroite.lon)
{
carte->pointCentral = (Coordonnees){(carte->pointHautGauche.lat + carte->pointBasDroite.lat) / 2.0, (carte->pointHautGauche.lon + carte->pointBasDroite.lon) / 2.0};
}
else
{
carte->pointCentral = (Coordonnees){(carte->pointHautGauche.lat + carte->pointBasDroite.lat) / 2.0, (carte->pointHautGauche.lon + 360 + carte->pointBasDroite.lon) / 2.0};
if(carte->pointCentral.lon>180)
{
carte->pointCentral.lon-=360;
}
}
}
else
{
fprintf(stderr, "Erreur lors du calcul du point central d\'une carte qui n\'existe pas (ou qui n'est pas initialisée).\n");
exit(EXIT_FAILURE);
}
}
void detruireCarte(Carte *const carte)
{
if(carte->mapTexture != NULL)
{
sfTexture_destroy(carte->mapTexture);
carte->mapTexture = NULL;
}
if(carte->mapSprite != NULL)
{
sfSprite_destroy(carte->mapSprite);
carte->mapSprite = NULL;
}
}
Carte* creerCarte(const Carte *const oldCarte)
{
Carte *carte = calloc(1, sizeof(*carte));
if(carte == NULL)
{
fprintf(stderr, "Erreur lors de l\'allocation dynamique d\'une nouvelle carte.\n");
exit(EXIT_FAILURE);
}
if(oldCarte != NULL)
{
carte->zoom = oldCarte->zoom;
carte->type = oldCarte->type;
carte->echelle = oldCarte->echelle;
carte->mapSprite = NULL;
carte->mapTexture = NULL;
carte->pointCentral = oldCarte->pointCentral;
carte->pointHautGauche = oldCarte->pointHautGauche;
carte->pointBasDroite = oldCarte->pointBasDroite;
}
else
{
initialiserCarte(carte);
}
return carte;
}
void initialiserPileCartes(PileCartes *const pileCartes)
{
for(uint8_t i = 0; i < MAPSTACKSIZE; i++)
{
pileCartes->pile[i] = NULL;
}
pileCartes->sommet = -1;
}
void detruirePileCartes(PileCartes *const pileCartes)
{
for(uint8_t i = 0; i < MAPSTACKSIZE; i++)
{
if(pileCartes->pile[i] != NULL)
{
detruireCarte(pileCartes->pile[i]);
free(pileCartes->pile[i]);
pileCartes->pile[i] = NULL;
}
}
pileCartes->sommet = -1;
}
bool empilerPileCartes(PileCartes *const pileCartes, Carte *const carte)
{
if(pileCartes->sommet < MAPSTACKSIZE - 1)
{
pileCartes->pile[++pileCartes->sommet] = carte;
return true;
}
else
{
return false;
}
}
Carte* depilerPilesCartes(PileCartes *const pileCartes)
{
if(pileCartes->sommet >= 0)
{
Carte *tmp = pileCartes->pile[pileCartes->sommet];
pileCartes->pile[pileCartes->sommet--] = NULL;
return tmp;
}
else
{
return NULL;
}
}
inline void afficherWarningPile(sfRenderWindow *const window, const sfSprite *const renderSprite)
{
warningBox(window, renderSprite, "La carte précédente ne sera pas sauvegardée car la pile est pleine.");
}