Bonjour,
Pour les besoins d'un jeu je développe un GUI simple avec SDL (1.2).
J'ai différentes classes représentant les différents types d'éléments (fenêtre, bouton, ...) étendent une classe abstraite GUIObject.
Chaque éléments dispose d'une méthode Render et de méthodes MouseButtonDown, MouseButtonUp, MouseMoved... pour gérer les événements.
Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 class GUIObject : //position Left: int Top: int Width: int Height: int function IsIn(X, Y) : Boolean //permet de vérifier si le point (X, Y) est dans la zone du composant //méthodes abstraites procedure Render() procedure MouseButtonDown(Button, X, Y) procedure MouseButtonUp(Button, X, Y) procedure MouseMoved(Button, X, Y, XRel, YRel)
La classe GUIContainer est un élément qui peut contenir une liste d'éléments enfants (ex. fenêtre, panel, boîte de dialogue...) :
Pour la gestion des événements, j'hésite entre deux approches :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 class GUIContainer Objects[] Add(Object) procedure MouseButtonDown(Button, X, Y) procedure MouseButtonUp(Button, X, Y) procedure MouseMoved(Button, X, Y, XRel, YRel)
1) le GUIContainer vérifie si toutes les conditions sont remplies et si la souris est positionné sur le composant avant de lui transmettre l'événement. Si le composant destinataire de l'événement (ex. : le bouton sur lequel on a cliqué) est identifié, on sort de la boucle.
Avantages : Cela simplifie le code des composants.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class GUIContainer extends GUIObject : procedure MouseButtonDown(Button, X, Y) for each Object in Self.Objects : if Object.IsVisible and Object.IsIn(X, Y) and Object.IsEnabled then Object.MouseButtonDown(Button, X, Y) Break // Arrêt de la boucle.
Inconvénient : J'ai peur que cela manque de flexibilité pour gérer des comportements complexes (glisser-déposer...).
2) Le GUIContainer se contente de transmettre l'événement à tous ses enfants sans réfléchir.
L'intelligence est du côté du composant, qui vérifie le positionnement de la souris :
Selon vous quelle serait la meilleure approche ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class GUIContainer : procedure MouseButtonDown(Button, X, Y) for each Object in Self.Objects : Object.MouseButtonDown(Button, X, Y) class GUIButton extends GUIObject : procedure MouseButtonDown(Button, X, Y) if Visible and IsIn(X, Y) then //...
Partager