Existe t'il une méthode qui permet de cliquer sur une image ?
Existe t'il une méthode qui permet de cliquer sur une image ?
non, tu dois toi meme coder cette fonction.
Le mieux serait de faire une structure retenant la position et les dimension de l'image, et lors d'un click de comparer les coordonné du click avec celle de l'image afin de savoir si oui ou non le click a été fait sur l'image.
Le SDL_Rect est une structure qui contient déjà tout ça
Tu as les paramètres x, y, w, h pour la position x, la position y, la largeur, et la hauteur
Plus tu pédales moins fort, moins t'avances plus vite.
Oui, mais c'est pas tres pratique ...Le SDL_Rect est une structure qui contient déjà tout ça
Tu as les paramètres x, y, w, h pour la position x, la position y, la largeur, et la hauteur
A chaque fois, il va falloir coder en dur les dimension. De plus le PO veux cliquer sur une image. Imagine qu'ils la positionne en (0,0). Avec juste un SDL_Rect, tu va devoir mettre les 4 parametre en dur. Apres, s'il veut bouger son bouton image, il va devoir changer les 4 parametre en dur, et je te raconte meme pas la galere s'il est pas organiser. C'est pour cela qu'une simple structure avec un SDL_Rect et un SDL_Surface* suffirai a faire ce qu'il de maniere relativement souple.
Une methode "Button* CreateButton (int x, int y, char* pathImage)"
Une methode "DestroyButton(Button* Abutton)"
Une methode "void MoveButton(Button *Abutton, int newX, int newY)"
...
sachant que dans chaque fonction il y est ce qu'il faut : Par exemple, convertir l'image chargé au meme BPP, verifier l'integrité de la position de l'image ....
je ne comprends pas ou tu veux en venir ; tu dis "non il ne faut pas utiliser de SDL_Rect" et ensuite "oui il suffit de prendre un SDL_Rect".
A part cette solution d'utiliser SDL_Rect je ne vois pas autrement ; pour les mémoriser il suffit de faire un tableau dynamique ou bien un conteneur std :: list par exemple.
Ensuite un simple parcours sur la liste pour savoir si les coordonnées de la souris sont comprises dans le rectangle qui délimite l'image..
Je n'ai pas dit qu'il ne fallait pas utiliser de SDL_Rect, j'ai dit qu'utiliser un simple SDL_Rect en dehors d'une structure pouvait etre penible pour la flexibilité.
La structure que je propose contient un SDL_Rect et un SDL_Surface*
Si la personne qui post utilise le C++ (ou l'orienté objet), alors autant faire une mini classe, ca allegerai tout, puis un std::list effectivement pour gerer tout les bouton dynamiquement.
Sinon, si c'est du C, implementation d'une structure, des methode et d'une liste chainé (mais ca depend de l'utilisation et cela me semble plutot "utiliser un marteau piqueur pour ecraser une mouche")
En fait, on a meme pas besoins de SDL_Rect :
Voila, j'ai fait le code de tete, donc il devrai y avoir des erreur mineure. En poussant un peu plus, on pourrait rajouter un pointeur de fonction dans la structure Bouton. Il suffirait alors de modifier legerement les trois methode ci dessus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 typedef struct Bouton Bouton; struct Bouton { int m_positionX; int m_positionY; SDL_Surface *m_image; }; Bouton* CreerBouton (int positionX, int positionY, char *pathImage) { SDL_Surface *Temporaire = SDL_LoadBMP(pathImage); if (Temporaire == NULL) { fprintf(stderr, "Erreur lors de la creation d'un bouton : %s.\n", SDL_GetError()); return NULL; } if (x<0 || LARGEUR_ECRAN<x || y<0 || HAUTEUR_ECRAN<y) { if (x<0 || LARGEUR_ECRAN<x) fprintf(stderr, "Erreur lors de la creation d'un bouton : Dimension x non valide\n"); if (y<0 || HAUTEUR_ECRAN<y) fprintf(stderr, "Erreur lors de la creation d'un bouton : Dimension x non valide\n"); return NULL; } if (LARGEUR_ECRAN < (x + Temporaire->w) || HAUTEUR_ECRAN < (y + Temporaire->h)) { /* Le bouton ne sera pas entièrement visible, action a déterminer */ } /* Ici, tout est bon, on peut creer le bouton */ Bouton *UnBouton = (Bouton*) malloc (sizeof(Bouton)); UnBouton->m_image = SDL_DisplayFormat(Temporaire); SDL_FreeSurface(Temporaire); UnBouton->m_positionX = positionX; UnBouton->m_positionY = positionY; return UnBouton; } void DetruireBouton (Bouton *UnBouton) { SDL_FreeSurface(UnBouton->m_image); free(UnBouton); } /* Fonction permettant de savoir si on a cliquer sur le Bouton renvoi le resultat sous forme de booleen */ int Check (Bouton *UnBouton, int sourisX, int sourisY) { if (sourisX <= UnBouton->m_positionX && UnBouton->m_positionX+UnBouton->m_image->w <= sourisX && sourisY <= UnBouton->m_positionY && UnBouton->m_positionY+UnBouton->m_image->h <= sourisY) return 1; return 0; }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager