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/Vue/selection.c

99 lines
3.6 KiB
C

#include "selection.h"
Rectangle selectionRectangle(sfRenderWindow *const window, sfEvent *event, const sfSprite *const sprite, const bool carre)
{
sfVector2f positionInitiale = {event->mouseButton.x, event->mouseButton.y};
const sfMouseButton buttonUsed = event->mouseButton.button;
event->mouseMove.x = event->mouseButton.x;
event->mouseMove.y = event->mouseButton.y;
sfConvexShape *shape = NULL;
sfVector2f positionCurseur = {0.f, 0.f};
while(!(event->type == sfEvtMouseButtonReleased))
{
sfRenderWindow_clear(window, COULEUR_GRIS);
positionCurseur.x = event->mouseMove.x < MAPSIZE ? event->mouseMove.x : MAPSIZE;
positionCurseur.y = event->mouseMove.y;
shape = creerRectangle(positionInitiale, positionCurseur, (sfColor){0, 0, 255, 32});
sfRenderWindow_drawSprite(window, sprite, NULL);
sfRenderWindow_drawConvexShape(window, shape, NULL);
sfRenderWindow_display(window);
sfConvexShape_destroy(shape);
shape = NULL;
(void)sfRenderWindow_pollEvent(window, event);
if(event->type == sfEvtMouseButtonPressed && event->mouseButton.button != buttonUsed && positionCurseur.x != positionInitiale.x && positionCurseur.y != positionInitiale.y)
{
displayBackgroundSprite(window, sprite);
return (Rectangle){{0.f, 0.f}, {0.f, 0.f}};
}
}
redresserRectangle(&positionInitiale, &positionCurseur, carre);
return (Rectangle){positionInitiale, positionCurseur};
}
Cercle selectionCercle(sfRenderWindow *const window, sfEvent *event, const sfSprite *const sprite)
{
// On sauvegarde ici la position initiale...
const sfVector2f positionCentre = {event->mouseButton.x, event->mouseButton.y};
// ... et ici le bouton de la souris qui a été utilisé pour démarrer la sélection
const sfMouseButton buttonUsed = event->mouseButton.button;
/* 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 = 0.0;
// Tant que l'utilisateur n'a pas relâché la souris...
while(!(event->type == sfEvtMouseButtonReleased))
{
/* Clear */
sfRenderWindow_clear(window, COULEUR_GRIS);
// Mise à jour du cercle en fonction de la nouvelle position du pointeur
rayon = sqrt(pow(positionCentre.x - event->mouseMove.x, 2.f) + pow(positionCentre.y - event->mouseMove.y, 2.f));
shape = creerCercle(positionCentre, rayon, (sfColor){0, 255, 0, 64});
/* 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);
// On détruit le cercle actuel, pour pouvoir en créer un nouveau à l'itération suivante !
sfCircleShape_destroy(shape);
shape = NULL;
// Indispensable ici pour forcer la mise à jour de la variable d'évènements
(void)sfRenderWindow_pollEvent(window, event);
// Si l'utilisateur appuie sur un autre bouton de la souris que celui initial, on abandonne la sélection
if(event->type == sfEvtMouseButtonPressed && event->mouseButton.button != buttonUsed && rayon != 0.0)
{
// Nécessaire pour forcer la mise à jour de l'affichage lors de l'annulation de sélection
displayBackgroundSprite(window, sprite);
return (Cercle){{0.f, 0.f}, 0.f};
}
}
/* On renvoie 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 */
return (Cercle){positionCentre, rayon};
}