Forum de la communauté SFML

Bindings - autres langages => DotNet => Discussion démarrée par: [R]Viper le Janvier 22, 2015, 06:01:06 pm

Titre: Création d'un bouton et gestion de l'événement pour le click
Posté par: [R]Viper le Janvier 22, 2015, 06:01:06 pm
Bonjour à tous (encore une fois), je me questionne sur comment créer un bouton en SFML. Je crois avoir trouvé en grande partie comment faire.

Ma class Button (Bulb pour HealthBulb, mais ce n'est pas très important)
class Bulb : SFML.Graphics.Transformable, SFML.Graphics.Drawable
{
        private SFML.Graphics.RectangleShape _BulbContainer;

        public event EventHandler BulbClicked;

        public Bulb(SFML.Graphics.Color Color)
        {
                this._BulbContainer = new SFML.Graphics.RectangleShape(new SFML.System.Vector2f(30, 80));
                this._BulbContainer.FillColor = SFML.Graphics.Color.Transparent;            
                this._BulbContainer.OutlineThickness = 1;
                this._BulbContainer.OutlineColor = SFML.Graphics.Color.White;
        }

        public void Update()
        {              
                if (this._BulbContainer.GetGlobalBounds().Contains(State1.MousePosition.X, State1.MousePosition.Y))
                {
                        if (SFML.Window.Mouse.IsButtonPressed(SFML.Window.Mouse.Button.Left))
                        {
                                if (this.BulbClicked != null)
                                {
                                        this.BulbClicked(this, null);
                                }
                        }
                }
        }

        public void Draw(SFML.Graphics.RenderTarget target, SFML.Graphics.RenderStates states)
        {
                states.Transform *= this.Transform;
                target.Draw(this._BulbContent, states);
                target.Draw(this._BulbContainer, states);
        }
}
 

Ma classe qui utiliser mon Bulb
class GUI : SFML.Graphics.Transformable, SFML.Graphics.Drawable
{
        private SFML.Graphics.RectangleShape _Background;
        private Widget.Bulb _HealthBar;

        public GUI()
        {
                this._Background = new SFML.Graphics.RectangleShape(new SFML.System.Vector2f(800, 100));
                this._Background.FillColor = new SFML.Graphics.Color(100, 100, 100);

                this._HealthBar = new Widget.Bulb(SFML.Graphics.Color.Red);
                this._HealthBar.Position = new SFML.System.Vector2f(100, 10);

                this._HealthBar.BulbClicked += new EventHandler(_HealthBar_BulbClicked);
        }
       
        void _HealthBar_BulbClicked(object sender, EventArgs e)
        {
                Console.Write("HealthBulb.Click");
        }
        //Reste de ma classe inutile pour ma question
}
 

Ce que je me demande se situe au niveau de la méthode Update de ma class Bulb. Cette méthode vérifie si la sourie est à l'intérieur des limites de mon Bulb et si c'est le cas, elle vérifie si j'appuie sur le bouton gauche de la souris et si oui, je lève mon événement ce qui, dans la classe GUI, appellera la méthode _HealthBar_BulbClicked(object sender, EventArgs e).

J'ai l'impression que ce sera lourd si j'ai plusieurs bouton à gérer sur mon même écran. Je penses à la plupart des jeux qui ont plusieurs bouton (inventaire, map, option, skills 1, skill 2, etc, ouvrir fenêtre de chat et ainsi de suite). Déjà que j'update mon GUI à chaque boucle pour l'afficher sur mon écran, si en plus dans mon GUI j'appelle plusieurs update de chaque contrôles (bouton, bulbe de vie, compétence active, etc), qui eux se mettent à jour aussi à chaque boucle pour vérifier si je clique ou non dessus, j'ai l'impression que ce sera lourd pour l'ordinateur, non? À moins que je ne m'y prenne pas de la bonne manière et qu'il y a un moyen beaucoup plus optimisé?

Merci d'avance.
Ah, et mes projets avance. Je devrais bientôt pouvoir vous montrer quelques trucs que j'ai réalisé!
Titre: Re : Création d'un bouton et gestion de l'événement pour le click
Posté par: Laurent le Janvier 22, 2015, 07:57:38 pm
Pourquoi vérifier les clics 60 fois par seconde, plutôt qu'à chaque fois que l'utilisateur... clique (hint : évènement MouseButtonReleased) ? Si encore tu testais IsButtonPressed avant le reste, ça économiserai un peu, mais là non tu fais vraiment ce qu'il y a de pire :P