Nouvelle structure de fichiers sources + Refonte de la boucle graphique + Corrections doc' & syntaxe

This commit is contained in:
HorlogeSkynet
2016-10-27 15:06:18 +02:00
parent ec79ffebc0
commit a32cb1fe5a
10 changed files with 518 additions and 473 deletions

@ -13,9 +13,9 @@ endif
.SILENT:
all: $(OBJ)/graphique.o
all: $(OBJ)/graphique.o $(OBJ)/creation.o $(OBJ)/chargement.o $(OBJ)/selection.o
$(OBJ)/%.o:%.c %.h
$(OBJ)/%.o: %.c %.h
$(CC) -c -o $@ $< $(CFLAGS) $(GFLAGS)
debug:

65
Graphique/chargement.c Normal file

@ -0,0 +1,65 @@
#include "chargement.h"
sfFont* loadFont(const char *const cheminFichier)
{
sfFont *font = sfFont_createFromFile(cheminFichier);
if(font == NULL)
{
fprintf(stderr, "Erreur lors du chargement de la fonte \"%s\".\n", cheminFichier);
exit(EXIT_FAILURE);
}
return font;
}
sfSprite* loadSpriteFromTexture(const sfVector2f position, const sfTexture *texture)
{
sfSprite *sprite = sfSprite_create();
if(sprite == NULL)
{
fprintf(stderr, "Erreur lors de la création d'un sprite.\n");
exit(EXIT_FAILURE);
}
sfSprite_setTexture(sprite, texture, sfTrue);
sfSprite_setPosition(sprite, position);
return sprite;
}
sfSprite* loadSpriteFromRenderTexture(const sfRenderTexture *const renderTexture)
{
sfSprite *renderSprite = sfSprite_create();
if(renderSprite == NULL)
{
fprintf(stderr, "Erreur lors de la création d'un sprite.\n");
exit(EXIT_FAILURE);
}
sfSprite_setTexture(renderSprite, sfRenderTexture_getTexture(renderTexture), sfTrue);
sfVector2f positionSpriteBuffer = {0.f, 0.f};
sfSprite_setPosition(renderSprite, positionSpriteBuffer);
return renderSprite;
}
sfTexture* loadTextureFromFile(const char *const cheminFichier)
{
sfTexture *texture = sfTexture_createFromFile(cheminFichier, NULL);
if(texture == NULL)
{
fprintf(stderr, "Erreur lors de la création d'une texture à partir du fichier \"%s\".\n", cheminFichier);
exit(EXIT_FAILURE);
}
return texture;
}

36
Graphique/chargement.h Normal file

@ -0,0 +1,36 @@
#pragma once
#include "graphique.h"
/**
* @brief Cette fonction se chargera de monter en mémoire une fonte dont le chemin d'accès sera passer en paramètre
*
* @param cheminFichier Chemin relatif du fichier de fonte à charger.
* @return Pointeur sur la fonte fraîchement chargée.
*/
sfFont* loadFont(const char *const);
/**
* @brief Crée un sprite, le charge avec une texture, et le renvoit
*
* @param texture Pointeur sur la texture à charger sur un sprite.
* @return Pointeur sur le sprite fraîchement créé.
*/
sfSprite* loadSpriteFromTexture(const sfVector2f, const sfTexture*);
/**
* @brief Crée un sprite, le charge avec une texture de rendu, et le renvoit
*
* @param renderTexture Pointeur sur la texture de rendu à charger sur un sprite.
* @return Pointeur sur le sprite fraîchement créé.
*/
sfSprite* loadSpriteFromRenderTexture(const sfRenderTexture *const);
/**
* @brief Crée une texture, à partir d'une image, et la renvoit
*
* @param cheminFichier Chemin relatif du fichier image à charger.
* @return Pointeur sur la texture fraîchement créée.
*/
sfTexture* loadTextureFromFile(const char *const);

140
Graphique/creation.c Normal file

@ -0,0 +1,140 @@
#include "creation.h"
sfRenderWindow* initialisationFenetre(void)
{
sfVideoMode mode = {WIDTH, HEIGHT, BITSPERPIXEL};
sfRenderWindow *window = sfRenderWindow_create(mode, WINDOWNAME, sfDefaultStyle, NULL);
if(window == NULL)
{
fprintf(stderr, "Erreur lors de la création de la fenêtre.\n");
exit(EXIT_FAILURE);
}
/* La partie ci-dessous ne fonctionne pas sous Linux apparemment... Mais l'idée y est ! */
sfImage *image = sfImage_createFromFile(WINDOWICONPATH);
if(image == NULL)
{
fprintf(stderr, "Erreur lors de l'ouverture du fichier icône: \"%s\".\n", WINDOWICONPATH);
exit(EXIT_FAILURE);
}
sfRenderWindow_setIcon(window, sfImage_getSize(image).x, sfImage_getSize(image).y, sfImage_getPixelsPtr(image));
sfImage_destroy(image);
/* ____________________________________________________________________________________ */
//Le programme tournera avec un nombre de FPS limité, afin de contenir l'utilisation CPU...
sfWindow_setFramerateLimit((sfWindow*)window, FRAMERATELIMITSLEEP);
return window;
}
sfRenderTexture* initialisationTextureBuffer(void)
{
sfRenderTexture *renderTexture = sfRenderTexture_create(WIDTH, HEIGHT, sfFalse);
if(renderTexture == NULL)
{
fprintf(stderr, "Erreur lors de la création d'une nouvelle texture de rendu..\n");
exit(EXIT_FAILURE);
}
return renderTexture;
}
sfCircleShape* creerCercle(const sfVector2f position, const float rayon, const sfColor couleur)
{
sfCircleShape *shape = sfCircleShape_create();
if(shape == NULL)
{
fprintf(stderr, "Erreur lors de la création du cercle de centre (%f, %f) et de rayon %f.\n", position.x, position.y, rayon);
exit(EXIT_FAILURE);
}
sfVector2f positionCercle = {position.x - rayon, position.y - rayon};
sfCircleShape_setPosition(shape, positionCercle);
sfCircleShape_setRadius(shape, rayon);
sfCircleShape_setFillColor(shape, couleur);
return shape;
}
sfConvexShape* creerRectangle(const sfVector2f positionHG, const sfVector2f positionBD, const sfColor couleur)
{
sfConvexShape *shape = sfConvexShape_create();
if(shape == NULL)
{
fprintf(stderr, "Erreur lors de la création du rectangle de point HAUT GAUCHE (%f, %f), et de point BAS DROIT (%f,%f).\n", positionHG.x, positionHG.y, positionBD.x, positionBD.y);
exit(EXIT_FAILURE);
}
sfConvexShape_setPointCount(shape, 4);
sfVector2f positionA = {positionHG.x, positionHG.y};
sfVector2f positionB = {positionHG.x + positionBD.x, positionHG.y};
sfVector2f positionC = {positionHG.x + positionBD.x, positionHG.y + positionBD.y};
sfVector2f positionD = {positionHG.x, positionHG.y + positionBD.y };
sfConvexShape_setPoint(shape, 0, positionA);
sfConvexShape_setPoint(shape, 1, positionB);
sfConvexShape_setPoint(shape, 2, positionC);
sfConvexShape_setPoint(shape, 3, positionD);
sfConvexShape_setFillColor(shape, couleur);
return shape;
}
sfConvexShape* creerDroite(const sfVector2f position1, const sfVector2f position2, const sfColor couleur)
{
sfConvexShape *shape = sfConvexShape_create();
if(shape == NULL)
{
fprintf(stderr, "Erreur lors de la création de la droite de (%f, %f) à (%f, %f)\n", position1.x, position1.y, position2.x, position2.y);
exit(EXIT_FAILURE);
}
sfConvexShape_setPointCount(shape, 4);
sfVector2f positionA = {position1.x + OFFSETFORLINES, position1.y};
sfVector2f positionB = {position1.x, position1.y + OFFSETFORLINES};
sfVector2f positionC = {position2.x + OFFSETFORLINES, position2.y};
sfVector2f positionD = {position2.x, position2.y + OFFSETFORLINES};
sfConvexShape_setPoint(shape, 0, positionA);
sfConvexShape_setPoint(shape, 1, positionB);
sfConvexShape_setPoint(shape, 3, positionC);
sfConvexShape_setPoint(shape, 2, positionD);
sfConvexShape_setFillColor(shape, couleur);
return shape;
}
sfText* creerTexte(const sfVector2f position, const char *const chaine, const sfFont *const font, const uint16_t taille, const sfColor couleur)
{
sfText *text = sfText_create();
if(text == NULL)
{
fprintf(stderr, "Erreur lors de la création du texte: \"%s\".\n", chaine);
exit(EXIT_FAILURE);
}
sfText_setPosition(text, position);
sfText_setString(text, chaine);
sfText_setFont(text, font);
sfText_setCharacterSize(text, taille);
sfText_setColor(text, couleur);
return text;
}

82
Graphique/creation.h Normal file

@ -0,0 +1,82 @@
#pragma once
#include "graphique.h"
#define WIDTH 1024
#define HEIGHT 768
#define BITSPERPIXEL 32
#define WINDOWNAME "GINPA Is Not a Position Analyst"
#define PROJECTIMAGEPATH "Graphique/Ressources/GINPA.jpg"
#define OFFSETFORLINES 1
/**
* @brief Crée une fenêtre, et renvoie un pointeur dessus
*
* Cette fonction initialise une fenêtre en accord avec les variables globales définies dans 'graphique.h'.
*
* @return Pointeur sur la fenêtre fraîchement créée.
*/
sfRenderWindow* initialisationFenetre(void);
/**
* @brief Crée une texture de rendu, et renvoie un pointeur dessus
*
* Cette fonction initialise une texture en accord avec les variables globales définies dans 'graphique.h'.
*
* @return Pointeur sur la texture fraîchement créée.
*/
sfRenderTexture* initialisationTextureBuffer(void);
/**
* @brief Crée un cercle, et renvoie un pointeur dessus
*
* Cette fonction crée un cercle en accord avec les variables passées en paramètres, à savoir:
*
* @param position Vecteur contenant les positions 'x' et 'y' du cercle à créer.
* @param rayon Rayon du cercle à créer.
* @param couleur Couleur intérieure du cercle à créer.
* @return Pointeur sur le cercle fraîchement créé.
*/
sfCircleShape* creerCercle(const sfVector2f, const float, const sfColor);
/**
*@brief Crée un rectangle, et renvoie un pointeur dessus
*
* Cette fonction crée un rectangle en accord avec les variables passées en paramètres, à savoir:
*
* @param positionHG Vecteur contenant les coordonées du coin HAUT GAUCHE du rectangle à créer.
* @param positionBD Vecteur contenant les coordonées du coin BAS DROIT du rectangle à créer.
* @param couleur Couleur intérieure du rectangle à créer.
* @return Pointeur sur le rectangle fraîchement créé.
*/
sfConvexShape* creerRectangle(const sfVector2f, const sfVector2f, const sfColor);
/**
*@brief Crée une droite, et renvoie un pointeur dessus
*
* Cette fonction crée une droite entre 2 points donnés en paramètre, à l'aide de:
*
* @param position1 Vecteur contenant les coordonées du premier point.
* @param position2 Vecteur contenant les coordonées du second point.
* @param couleur Couleur de la droite à créer.
* @return Pointeur sur la droite fraîchement créée.
*/
sfConvexShape* creerDroite(const sfVector2f, const sfVector2f, const sfColor);
/**
* @brief Crée un text, et renvoie un pointeur dessus
*
* Cette fonction crée un text en accord avec les variables passées en paramètres, à savoir:
*
* @param position Vecteur contenant les positions 'x' et 'y' du texte à créer.
* @param chaine Le texte à afficher.
* @param font La fonte à appliquer sur ce texte.
* @param taille La taille du texte à créer.
* @param couleur La couleur du texte à créer.
* @return Pointeur sur le texte fraîchement créé.
*/
sfText* creerTexte(const sfVector2f, const char *const, const sfFont *const, const uint16_t, const sfColor);

@ -1,299 +1,13 @@
#include "graphique.h"
sfRenderWindow* initialisationFenetre(void)
void boucleGraphique(void)
{
sfVideoMode mode = {WIDTH, HEIGHT, BITSPERPIXEL};
sfRenderWindow *window = sfRenderWindow_create(mode, WINDOWNAME, sfDefaultStyle, NULL);
sfRenderWindow *window = initialisationFenetre();
if(window == NULL)
{
fprintf(stderr, "Erreur lors de la création de la fenêtre.\n");
exit(EXIT_FAILURE);
}
/* Définition de quelques formes de base, et structure générale:
--> Clear > Draw > Display */
/* La partie ci-dessous ne fonctionne pas sous Linux apparemment... Mais l'idée y est ! */
sfImage *image = sfImage_createFromFile(WINDOWICONPATH);
if(image == NULL)
{
fprintf(stderr, "Erreur lors de l'ouverture du fichier icône: \"%s\".\n", WINDOWICONPATH);
exit(EXIT_FAILURE);
}
sfRenderWindow_setIcon(window, sfImage_getSize(image).x, sfImage_getSize(image).y, sfImage_getPixelsPtr(image));
sfImage_destroy(image);
/* ____________________________________________________________________________________ */
sfWindow_setFramerateLimit((sfWindow*)window, FRAMERATELIMITSLEEP);
return window;
}
sfRenderTexture* initialisationTextureBuffer(void)
{
sfRenderTexture *renderTexture = sfRenderTexture_create(WIDTH, HEIGHT, sfFalse);
if(renderTexture == NULL)
{
fprintf(stderr, "Erreur lors de la création d'une nouvelle texture de rendu..\n");
exit(EXIT_FAILURE);
}
return renderTexture;
}
sfCircleShape* creerCercle(const sfVector2f position, const float rayon, const sfColor couleur)
{
sfCircleShape *shape = sfCircleShape_create();
if(shape == NULL)
{
fprintf(stderr, "Erreur lors de la création du cercle de centre (%f, %f) et de rayon %f.\n", position.x, position.y, rayon);
exit(EXIT_FAILURE);
}
sfVector2f positionCercle = {position.x - rayon, position.y - rayon};
sfCircleShape_setPosition(shape, positionCercle);
sfCircleShape_setRadius(shape, rayon);
sfCircleShape_setFillColor(shape, couleur);
return shape;
}
sfConvexShape* creerRectangle(const sfVector2f positionHG, const sfVector2f positionBD, const sfColor couleur)
{
sfConvexShape *shape= sfConvexShape_create();
if(shape == NULL)
{
fprintf(stderr, "Erreur lors de la création du rectangle de point HAUT GAUCHE (%f, %f), et de point BAS DROIT(%f,%f).\n", positionHG.x, positionHG.y, positionBD.x, positionBD.y);
exit(EXIT_FAILURE);
}
sfConvexShape_setPointCount(shape, 4);
sfVector2f positionA = {positionHG.x, positionHG.y};
sfVector2f positionB = {positionHG.x + positionBD.x, positionHG.y};
sfVector2f positionC = {positionHG.x + positionBD.x, positionHG.y + positionBD.y};
sfVector2f positionD = {positionHG.x, positionHG.y +positionBD.y };
sfConvexShape_setPoint(shape, 0, positionA);
sfConvexShape_setPoint(shape, 1, positionB);
sfConvexShape_setPoint(shape, 2, positionC);
sfConvexShape_setPoint(shape, 3, positionD);
sfConvexShape_setFillColor(shape, couleur);
return shape;
}
sfConvexShape* creerDroite(const sfVector2f position1, const sfVector2f position2, const sfColor couleur)
{
sfConvexShape *shape = sfConvexShape_create();
if(shape == NULL)
{
fprintf(stderr, "Erreur lors de la création de la droite de (%f, %f) à (%f, %f)\n", position1.x, position1.y, position2.x, position2.y);
exit(EXIT_FAILURE);
}
sfConvexShape_setPointCount(shape, 4);
sfVector2f positionA = {position1.x + OFFSETFORLINES, position1.y};
sfVector2f positionB = {position1.x, position1.y + OFFSETFORLINES};
sfVector2f positionC = {position2.x + OFFSETFORLINES, position2.y};
sfVector2f positionD = {position2.x, position2.y + OFFSETFORLINES};
sfConvexShape_setPoint(shape, 0, positionA);
sfConvexShape_setPoint(shape, 1, positionB);
sfConvexShape_setPoint(shape, 3, positionC);
sfConvexShape_setPoint(shape, 2, positionD);
sfConvexShape_setFillColor(shape, couleur);
return shape;
}
sfFont* chargerFonte(const char *const cheminFichier)
{
sfFont *font = sfFont_createFromFile(cheminFichier);
if(font == NULL)
{
fprintf(stderr, "Erreur lors du chargement de la fonte \"%s\".\n", cheminFichier);
exit(EXIT_FAILURE);
}
return font;
}
sfText* creerTexte(const sfVector2f position, const char *const chaine, const sfFont *const font, const uint16_t taille, const sfColor couleur)
{
sfText *text = sfText_create();
if(text == NULL)
{
fprintf(stderr, "Erreur lors de la création du texte: \"%s\".\n", chaine);
exit(EXIT_FAILURE);
}
sfText_setPosition(text, position);
sfText_setString(text, chaine);
sfText_setFont(text, font);
sfText_setCharacterSize(text, taille);
sfText_setColor(text, couleur);
return text;
}
sfSprite* loadSpriteFromTexture(const sfVector2f position, const sfTexture *texture)
{
sfSprite *sprite = sfSprite_create();
if(sprite == NULL)
{
fprintf(stderr, "Erreur lors de la création d'un sprite.\n");
exit(EXIT_FAILURE);
}
sfSprite_setTexture(sprite, texture, sfTrue);
sfSprite_setPosition(sprite, position);
return sprite;
}
sfSprite* loadSpriteFromRenderTexture(const sfRenderTexture *const textureBuffer)
{
sfSprite *renderSprite = sfSprite_create();
if(renderSprite == NULL)
{
fprintf(stderr, "Erreur lors de la création d'un sprite.\n");
exit(EXIT_FAILURE);
}
sfSprite_setTexture(renderSprite, sfRenderTexture_getTexture(textureBuffer), sfTrue);
sfVector2f positionSpriteBuffer = {0.f, 0.f};
sfSprite_setPosition(renderSprite, positionSpriteBuffer);
return renderSprite;
}
sfTexture* loadTextureFromFile(const char *const cheminFichier)
{
sfTexture *texture = sfTexture_createFromFile(cheminFichier, NULL);
if(texture == NULL)
{
fprintf(stderr, "Erreur lors de la création d'une texture à partir du fichier \"%s\".\n", cheminFichier);
exit(EXIT_FAILURE);
}
return texture;
}
Rectangle selectionRectangle (sfRenderWindow *const window, sfEvent *event, const sfSprite *const sprite)
{
const sfVector2f positionInitiale = {event->mouseButton.x, event->mouseButton.y};
event->mouseMove.x = event->mouseButton.x;
event->mouseMove.y = event->mouseButton.y;
sfConvexShape *shape = NULL;
sfVector2f positionBD;
sfColor couleur = {255, 0, 0, 64};
sfWindow_setFramerateLimit((sfWindow*)window, FRAMERATELIMITPOWER);
while(!(event->type == sfEvtMouseButtonReleased))
{
/* Clear */
sfRenderWindow_clear(window, sfWhite);
//Mise à jour du cercle en fonction de la nouvelle position du pointeur
positionBD.x = (double)(-(positionInitiale.x) + event->mouseMove.x);
positionBD.y = (double)(-(positionInitiale.y) + event->mouseMove.y);
shape = creerRectangle (positionInitiale, positionBD, couleur);
/* Draw */
// --> On n'oublie pas de re-dessiner le fond sur lequel on effectue une sélection
sfRenderWindow_drawSprite(window, sprite, NULL);
sfRenderWindow_drawConvexShape(window, shape, NULL);
/* Display */
sfRenderWindow_display(window);
sfConvexShape_destroy(shape);
// Indispensable ici pour forcer la mise à jour de la variable d'évènements
(void)sfRenderWindow_pollEvent(window, event);
}
Rectangle rectangleSelectionne = {positionInitiale, positionBD};
return rectangleSelectionne;
}
Cercle selectionCercle(sfRenderWindow *const window, sfEvent *event, const sfSprite *const sprite)
{
const sfVector2f positionCentre = {event->mouseButton.x, event->mouseButton.y};
/* Petite méthode de truand pour que la position du centre du cercle
et la position du pointeur soient égales, lors de la première itération */
event->mouseMove.x = event->mouseButton.x;
event->mouseMove.y = event->mouseButton.y;
sfCircleShape *shape = NULL;
double rayon;
// Une couleur verte un poil transparente pour voir ce que l'on sélectionne !
sfColor couleur = {0, 255, 0, 64};
// Pendant la sélection, et uniquement ici, on relève la limite de FPS
sfWindow_setFramerateLimit((sfWindow*)window, FRAMERATELIMITPOWER);
// Tant que l'utilisateur n'a pas relâché la souris...
while(!(event->type == sfEvtMouseButtonReleased))
{
/* Clear */
sfRenderWindow_clear(window, sfWhite);
//Mise à jour du cercle en fonction de la nouvelle position du pointeur
rayon = sqrt(pow((double)(positionCentre.x - event->mouseMove.x), 2.f) + pow((double)(positionCentre.y - event->mouseMove.y), 2.f));
shape = creerCercle(positionCentre, rayon, couleur);
/* Draw */
// --> On n'oublie pas de re-dessiner le fond sur lequel on effectue une sélection
sfRenderWindow_drawSprite(window, sprite, NULL);
sfRenderWindow_drawCircleShape(window, shape, NULL);
/* Display */
sfRenderWindow_display(window);
sfCircleShape_destroy(shape);
// Indispensable ici pour forcer la mise à jour de la variable d'évènements
(void)sfRenderWindow_pollEvent(window, event);
}
// On repasse sur un nombre de FPS limité !
sfWindow_setFramerateLimit((sfWindow*)window, FRAMERATELIMITSLEEP);
/* On crée une structure Cercle, dans laquelle on stocke la position initiale
ainsi que le rayon que l'utilisateur a choisi durant sa sélection de zone */
Cercle cercleSelectionne = {positionCentre, rayon};
return cercleSelectionne;
}
void boucleGraphique(sfRenderWindow *const window)
{
/* ______Clear______ */
sfRenderWindow_clear(window, sfWhite);
/* _________________ */
@ -317,7 +31,7 @@ void boucleGraphique(sfRenderWindow *const window)
sfRenderWindow_drawConvexShape(window, shape3, NULL);
// --> Texte
sfFont *font = chargerFonte(REGULARFONTPATH);
sfFont *font = loadFont(REGULARFONTPATH);
sfVector2f positionTexte = {50.f, 60.f};
sfText *text = creerTexte(positionTexte, "Test texte !", font, 20, sfBlue);
sfRenderWindow_drawText(window, text, NULL);
@ -333,28 +47,40 @@ void boucleGraphique(sfRenderWindow *const window)
sfRenderWindow_display(window);
/* ___________________ */
/* Boucle de gestion des évènements */
// Petite pause pour admirer le résultat
sleep(2);
/* Boucle infinie maintenant */
sfEvent event;
while(sfRenderWindow_pollEvent(window, &event))
while(sfRenderWindow_isOpen(window))
{
if(event.type == sfEvtClosed)
{
sfRenderWindow_close(window);
}
sfRenderWindow_clear(window, sfWhite);
sfRenderWindow_drawSprite(window, sprite, NULL);
sfRenderWindow_display(window);
else if(event.type == sfEvtMouseButtonPressed && event.mouseButton.button == sfMouseLeft)
while(sfRenderWindow_pollEvent(window, &event))
{
Cercle cercleSelectionne = selectionCercle(window, &event, sprite);
fprintf(stdout, "L'utilisateur a sélectionné un cercle de centre (%f, %f) et de rayon %f.\n", cercleSelectionne.centre.x, cercleSelectionne.centre.y, cercleSelectionne.rayon);
}
else if(event.type == sfEvtMouseButtonPressed && event.mouseButton.button == sfMouseRight)
{
Rectangle rectangleSelectionne = selectionRectangle(window, &event, sprite);
fprintf(stdout, "L'utilisateur a sélectionné un rectangle de positionHG (%f, %f) et de positionBD (%f, %f).\n", rectangleSelectionne.positionHG.x, rectangleSelectionne.positionHG.y, rectangleSelectionne.positionBD.x, rectangleSelectionne.positionBD.y);
if(event.type == sfEvtClosed)
{
sfRenderWindow_close(window);
}
else if(event.type == sfEvtMouseButtonPressed)
{
if(event.mouseButton.button == sfMouseLeft)
{
Cercle cercleSelectionne = selectionCercle(window, &event, sprite);
fprintf(stdout, "L'utilisateur a sélectionné un cercle de centre (%f, %f) et de rayon %f.\n", cercleSelectionne.centre.x, cercleSelectionne.centre.y, cercleSelectionne.rayon);
}
else if(event.mouseButton.button == sfMouseRight)
{
Rectangle rectangleSelectionne = selectionRectangle(window, &event, sprite);
fprintf(stdout, "L'utilisateur a sélectionné un rectangle de positionHG (%f, %f) et de positionBD (%f, %f).\n", rectangleSelectionne.positionHG.x, rectangleSelectionne.positionHG.y, rectangleSelectionne.positionBD.x, rectangleSelectionne.positionBD.y);
}
}
}
}
/* ... */
/* Destruction des objets dessinés */
sfCircleShape_destroy(shape);
@ -364,4 +90,7 @@ void boucleGraphique(sfRenderWindow *const window)
sfText_destroy(text);
sfTexture_destroy(texture);
sfSprite_destroy(sprite);
/* Destruction de la fenêtre */
sfRenderWindow_destroy(window);
}

@ -7,11 +7,9 @@
#include <math.h>
#include <SFML/Graphics.h>
#define WIDTH 1024
#define HEIGHT 768
#define BITSPERPIXEL 32
#define WINDOWNAME "GINPA Is Not a Position Analyst"
#include "creation.h"
#include "chargement.h"
#include "selection.h"
#define FRAMERATELIMITSLEEP 32
#define FRAMERATELIMITPOWER 128
@ -19,158 +17,7 @@
#define REGULARFONTPATH "Graphique/Ressources/AllerFont/Aller_Rg.ttf"
#define WINDOWICONPATH "Graphique/Ressources/GINPA.png"
#define PROJECTIMAGEPATH "Graphique/Ressources/GINPA.jpg"
#define OFFSETFORLINES 1
typedef struct
{
sfVector2f centre;
double rayon;
} Cercle;
typedef struct
{
sfVector2f positionHG;
sfVector2f positionBD;
}Rectangle;
/**
* @brief Crée une fenêtre, et renvoie un pointeur dessus
*
* Cette fonction initialise une fenêtre en accord avec les variables globales définies dans 'graphique.h'.
*
* @return Pointeur sur la fenêtre fraîchement créée.
*/
sfRenderWindow* initialisationFenetre(void);
/**
* @brief Crée un cercle, et renvoie un pointeur dessus
*
* Cette fonction crée un cercle en accord avec les variables passées en paramètres, à savoir:
*
* @param position Vecteur contenant les positions 'x' et 'y' du cercle à créer.
* @param rayon Rayon du cercle à créer.
* @param couleur Couleur intérieure du cercle à créer.
* @return Pointeur sur le cercle fraîchement créé.
*/
sfCircleShape* creerCercle(const sfVector2f, const float, const sfColor);
/**
* @brief Crée une texture de rendu, et renvoie un pointeur dessus
*
* Cette fonction initialise une texture en accord avec les variables globales définies dans 'graphique.h'.
*
* @return Pointeur sur la texture fraîchement créée.
*/
sfRenderTexture* initialisationTextureBuffer(void);
/**
*@brief Crée un rectangle, et renvoie un pointeur dessus
*
* Cette fonction crée un rectangle en accord avec les variables passées en paramètres, à savoir:
*
* @param positionHG Vecteur contenant les coordonées du coin HAUT GAUCHE du rectangle à créer.
* @param positionBD Vecteur contenant les coordonées du coin BAS DROIT du rectangle à créer.
* @param couleur Couleur intérieure du rectangle à créer.
* @return Pointeur sur le rectangle fraîchement créé.
*/
sfConvexShape* creerRectangle(const sfVector2f, const sfVector2f, const sfColor);
/**
*@brief Crée une droite, et renvoie un pointeur dessus
*
* Cette fonction crée une droite entre 2 points donnés en paramètre, à l'aide de:
*
* @param position1 Vecteur contenant les coordonées du premier point.
* @param position2 Vecteur contenant les coordonées du second point.
* @param couleur Couleur de la droite à créer.
* @return Pointeur sur la droite fraîchement créée.
*/
sfConvexShape* creerDroite(const sfVector2f, const sfVector2f, const sfColor);
/**
* @brief Cette fonction se chargera de monter en mémoire une fonte dont le chemin d'accès sera passer en paramètre
*
* @param cheminFichier Chemin relatif du fichier de fonte à charger.
* @return Pointeur sur la fonte fraîchement chargée.
*/
sfFont* chargerFonte(const char *const);
/**
* @brief Crée un text, et renvoie un pointeur dessus
*
* Cette fonction crée un text en accord avec les variables passées en paramètres, à savoir:
*
* @param position Vecteur contenant les positions 'x' et 'y' du texte à créer.
* @param chaine Le texte à afficher.
* @param font La fonte à appliquer sur ce texte.
* @param taille La taille du texte à créer.
* @param couleur La couleur du texte à créer.
* @return Pointeur sur le texte fraîchement créé.
*/
sfText* creerTexte(const sfVector2f, const char *const, const sfFont *const, const uint16_t, const sfColor);
/**
* @brief Crée un sprite, le charge avec une texture, et le renvoit
*
* @param texture Pointeur sur la texture à charger sur un sprite.
* @return Pointeur sur le sprite fraîchement créé.
*/
sfSprite* loadSpriteFromTexture(const sfVector2f, const sfTexture*);
/**
* @brief Crée un sprite, le charge avec une texture de rendu, et le renvoit
*
* @param renderTexture Pointeur sur la texture de rendu à charger sur un sprite.
* @return Pointeur sur le sprite fraîchement créé.
*/
sfSprite* loadSpriteFromRenderTexture(const sfRenderTexture *const);
/**
* @brief Crée une texture, à partir d'une image, et la renvoit
*
* @param cheminFichier Chemin relatif du fichier image à charger.
* @return Pointeur sur la texture fraîchement créée.
*/
sfTexture* loadTextureFromFile(const char *const);
/**
* @brief Sélection d'une zone rectangulaire à l'écran
*
* Cette fonction permet à l'utilisateur de sélectionner une zone rectangulaire à l'aide de la souris
* et renvoit une structure Rectangle correspondante.
*
* /!\ Prière de n'appeler cette fonction que depuis 'boucleGestionEvenement()'...
*
* Piste d'évolution: donner à la fonction un tableau de sprites, et une taille, et les afficher un-par-un à chaque fois...
*
* @param window Pointeur sur la fenêtre sur laquelle on "sélectionne".
* @param sprite (ou autre) Pointeur sur un (ou plusieurs) éléments à ré-afficher constamment.
* @return Procédure.
*/
Rectangle selectionRectangle (sfRenderWindow *const window, sfEvent *event, const sfSprite *const);
/**
* @brief Sélection d'une zone circulaire à l'écran
*
* Cette fonction permet à l'utilisateur de sélectionner une zone circulaire à l'aide de la souris
* et renvoit une structure Cercle correspondante.
*
* /!\ Prière de n'appeler cette fonction que depuis 'boucleGestionEvenement()'...
*
* Piste d'évolution: donner à la fonction un tableau de sprites, et une taille, et les afficher un-par-un à chaque fois...
*
* @param window Pointeur sur la fenêtre sur laquelle on "sélectionne".
* @param sprite (ou autre) Pointeur sur un (ou plusieurs) éléments à ré-afficher constamment.
* @return Procédure.
*/
Cercle selectionCercle(sfRenderWindow *const window, sfEvent *event, const sfSprite *const);
/**
* @brief Boucle infinie de traitement graphique... changera dans le futur en fonction des besoins
@ -178,4 +25,4 @@ Cercle selectionCercle(sfRenderWindow *const window, sfEvent *event, const sfSpr
* @param window Fenêtre dans laquelle on effectue des opérations.
* @return Procédure.
*/
void boucleGraphique(sfRenderWindow *const);
void boucleGraphique(void);

101
Graphique/selection.c Normal file

@ -0,0 +1,101 @@
#include "selection.h"
Rectangle selectionRectangle(sfRenderWindow *const window, sfEvent *event, const sfSprite *const sprite)
{
const sfVector2f positionInitiale = {event->mouseButton.x, event->mouseButton.y};
/* Petite méthode de truand pour que la position du centre du cercle
et la position du pointeur soient égales, lors de la première itération */
event->mouseMove.x = event->mouseButton.x;
event->mouseMove.y = event->mouseButton.y;
sfConvexShape *shape = NULL;
sfVector2f positionBD;
sfColor couleur = {255, 0, 0, 64};
sfWindow_setFramerateLimit((sfWindow*)window, FRAMERATELIMITPOWER);
while(!(event->type == sfEvtMouseButtonReleased))
{
/* Clear */
sfRenderWindow_clear(window, sfWhite);
// Mise à jour du rectangle en fonction de la nouvelle position du pointeur
positionBD.x = (double)(-(positionInitiale.x) + event->mouseMove.x);
positionBD.y = (double)(-(positionInitiale.y) + event->mouseMove.y);
shape = creerRectangle(positionInitiale, positionBD, couleur);
/* Draw */
// --> On n'oublie pas de re-dessiner le fond sur lequel on effectue une sélection
sfRenderWindow_drawSprite(window, sprite, NULL);
sfRenderWindow_drawConvexShape(window, shape, NULL);
/* Display */
sfRenderWindow_display(window);
sfConvexShape_destroy(shape);
// Indispensable ici pour forcer la mise à jour de la variable d'évènements
(void)sfRenderWindow_pollEvent(window, event);
}
Rectangle rectangleSelectionne = {positionInitiale, positionBD};
return rectangleSelectionne;
}
Cercle selectionCercle(sfRenderWindow *const window, sfEvent *event, const sfSprite *const sprite)
{
const sfVector2f positionCentre = {event->mouseButton.x, event->mouseButton.y};
/* Petite méthode de truand pour que la position du centre du cercle
et la position du pointeur soient égales, lors de la première itération */
event->mouseMove.x = event->mouseButton.x;
event->mouseMove.y = event->mouseButton.y;
sfCircleShape *shape = NULL;
double rayon;
// Une couleur verte un poil transparente pour voir ce que l'on sélectionne !
sfColor couleur = {0, 255, 0, 64};
// Pendant la sélection, et uniquement ici, on relève la limite de FPS
sfWindow_setFramerateLimit((sfWindow*)window, FRAMERATELIMITPOWER);
// Tant que l'utilisateur n'a pas relâché la souris...
while(!(event->type == sfEvtMouseButtonReleased))
{
/* Clear */
sfRenderWindow_clear(window, sfWhite);
// Mise à jour du cercle en fonction de la nouvelle position du pointeur
rayon = sqrt(pow((double)(positionCentre.x - event->mouseMove.x), 2.f) + pow((double)(positionCentre.y - event->mouseMove.y), 2.f));
shape = creerCercle(positionCentre, rayon, couleur);
/* Draw */
// --> On n'oublie pas de re-dessiner le fond sur lequel on effectue une sélection
sfRenderWindow_drawSprite(window, sprite, NULL);
sfRenderWindow_drawCircleShape(window, shape, NULL);
/* Display */
sfRenderWindow_display(window);
sfCircleShape_destroy(shape);
// Indispensable ici pour forcer la mise à jour de la variable d'évènements
(void)sfRenderWindow_pollEvent(window, event);
}
// On repasse sur un nombre de FPS limité !
sfWindow_setFramerateLimit((sfWindow*)window, FRAMERATELIMITSLEEP);
/* On crée une structure Cercle, dans laquelle on stocke la position initiale
ainsi que le rayon que l'utilisateur a choisi durant sa sélection de zone */
Cercle cercleSelectionne = {positionCentre, rayon};
return cercleSelectionne;
}

51
Graphique/selection.h Normal file

@ -0,0 +1,51 @@
#pragma once
#include "graphique.h"
typedef struct
{
sfVector2f centre;
double rayon;
} Cercle;
typedef struct
{
sfVector2f positionHG;
sfVector2f positionBD;
} Rectangle;
/**
* @brief Sélection d'une zone rectangulaire à l'écran
*
* Cette fonction permet à l'utilisateur de sélectionner une zone rectangulaire à l'aide de la souris
* et renvoit une structure Rectangle correspondante.
*
* /!\ Prière de n'appeler cette fonction que depuis une boucle de gestion des évènements...
*
* Piste d'évolution: donner à la fonction une texture de rendu, et l'afficher à chaque fois...
*
* @param window Pointeur sur la fenêtre sur laquelle on "sélectionne".
* @param event Pointeur sur la variable d'évènement de la fonction appelante.
* @param sprite (ou autre) Pointeur sur un (ou plusieurs) éléments à ré-afficher constamment.
* @return Procédure.
*/
Rectangle selectionRectangle(sfRenderWindow *const, sfEvent *event, const sfSprite *const);
/**
* @brief Sélection d'une zone circulaire à l'écran
*
* Cette fonction permet à l'utilisateur de sélectionner une zone circulaire à l'aide de la souris
* et renvoit une structure Cercle correspondante.
*
* /!\ Prière de n'appeler cette fonction que depuis une boucle de gestion des évènements...
*
* Piste d'évolution: donner à la fonction une texture de rendu, et l'afficher à chaque fois...
*
* @param window Pointeur sur la fenêtre sur laquelle on "sélectionne".
* @param event Pointeur sur la variable d'évènement de la fonction appelante.
* @param sprite (ou autre) Pointeur sur un (ou plusieurs) éléments à ré-afficher constamment.
* @return Procédure.
*/
Cercle selectionCercle(sfRenderWindow *const window, sfEvent *event, const sfSprite *const);

8
main.c

@ -7,15 +7,9 @@ int main(int argc, char const *argv[])
(void)argv;
/* Début du programme */
sfRenderWindow *window = initialisationFenetre();
while(sfRenderWindow_isOpen(window))
{
/* Routine de test */
boucleGraphique(window);
}
boucleGraphique();
sfRenderWindow_destroy(window);
/* Fin du programme */
return 0;