96 lines
3.4 KiB
C
96 lines
3.4 KiB
C
#include "selection.h"
|
|
|
|
|
|
Rectangle selectionRectangle(sfRenderWindow *const window, sfEvent *event, const sfSprite *const sprite)
|
|
{
|
|
const 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 positionBD = {0.f, 0.f};
|
|
|
|
while(!(event->type == sfEvtMouseButtonReleased))
|
|
{
|
|
sfRenderWindow_clear(window, sfWhite);
|
|
|
|
positionBD.x = (double)(event->mouseMove.x - positionInitiale.x);
|
|
positionBD.y = (double)(event->mouseMove.y - positionInitiale.y);
|
|
shape = creerRectangle(positionInitiale, positionBD, (sfColor){255, 0, 0, 64});
|
|
|
|
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 == sfEvtKeyPressed || (event->type == sfEvtMouseButtonPressed && event->mouseButton.button != buttonUsed && positionBD.x != 0.0 && positionBD.y != 0.0))
|
|
{
|
|
return (Rectangle){{0.f, 0.f}, {0.f, 0.f}};
|
|
}
|
|
}
|
|
|
|
return (Rectangle){positionInitiale, positionBD};
|
|
}
|
|
|
|
|
|
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, 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, (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 une touche du clavier (ou sur un autre bouton de la souris), on abandonne la sélection
|
|
if(event->type == sfEvtKeyPressed || (event->type == sfEvtMouseButtonPressed && event->mouseButton.button != buttonUsed && rayon != 0.0))
|
|
{
|
|
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};
|
|
}
|