Bonjour !
Je suis actuellement en réflexion pour la conception d'une classe Bouton.
En fait, cette classe est déjà codée mais je ne suis pas très satisfait de son fonctionnement actuel.
Tout se déroule dans 3 classes : une
classe "principale" qui gère le jeu de manière générale (ainsi que l'affichage), une classe "interface" qui va représenter par exemple un
menu, et la classe
Bouton.
Actuellement, la classe principale instancie la classe Menu. Menu instancie à son tour des boutons. On retourne ensuite dans la classe principale. Celle-ci traite les évènements dans une boucle :
- Lors de l'évènement mouseMoved, on appelle une méthode de la classe Menu qui va indiquer à chaque bouton la position de la souris. Si la souris est sur un bouton particulier, celui-ci changera de texture.
- Lors de l'évènement "clic gauche", on appelle une méthode de la classe Menu qui va indiquer à chaque bouton que la souris est enfoncée. Si la souris est sur un bouton, celui-ci changera de texture. Si la souris bouge par la suite (mais que le clic gauche est maintenu), on saura qu'elle est enfoncée et d'autres boutons changeront éventuellement de texture si la souris se pose dessus.
- Lors de l'évènement "clic gauche relâché", on appelle la méthode précédente pour indiquer que le bouton n'est plus enfoncé et on appelle une méthode pour récupérer une enum indiquant quel bouton a été cliqué. Suivant le retour, on exécute le code approprié (dans un switch, dans la classe principale). Il peut s'agir de sauvegarder la partie, quitter le jeu, etc.
Cette solution est donc un peu lourde à utiliser. Il faut penser à appeler ces 3 méthodes à différents endroits du code de la classe principale. C'est un peu compliqué au début. Bref, ce n'est pas très bien pensé.
Je réfléchis donc à une autre solution, et celle-ci m'est venue en tête : utiliser des pointeurs de fonction.
Chaque bouton disposera d'un pointeur de fonction sur une méthode-membre de la classe principale permettant d'exécuter son code. Dans la boucle principale, on appellera également une méthode
handleEvent des boutons leur indiquant l'évènement. Ensuite, le bouton change de texture si l'évènement est
mouseMoved /
buttonClicked, utilise le pointeur de fonction si l'évènement est
buttonReleased...
Les avantages : c'est beaucoup plus facile à utiliser. On appelle une méthode pour donner quelques pointeurs au bouton quand on le crée, et on fait un for pour appeler la méthode
handleEvent de chaque bouton à chaque fois qu'un nouvel évènement se produit. Le reste est géré par la classe Bouton.
Les inconvénients : chaque bouton doit désormais disposer de 4 pointeurs supplémentaires : un pointeur de fonction, comme je l'ai indiqué précédemment ; un pointeur vers l'instance de la classe principale pour utiliser le pointeur de fonction ; un pointeur vers la fenêtre (ou un getter dans la classe principale) pour savoir où se trouve la souris par exemple ; et un pointeur vers une éventuelle View (si le bouton est dans une View, il faudra disposer de la View pour convertir les coordonnées comme il faut et savoir si la souris est sur le bouton ou non).
En plus de ces 4 pointeurs, il y aura un for pour chaque bouton pour appeler
handleEvent, même si l'évènement n'a rien à voir (on appuie sur une touche du clavier par exemple). Ce n'est pas très optimisé...
Là non plus, ce n'est pas idéal je trouve. J'aimerais donc savoir ce que vous pensez de ces 2 solutions, et si vous en avez d'autres à proposer, je vous écoute !