Partage
  • Partager sur Facebook
  • Partager sur Twitter

Utilisation de la bonne fonction draw

Sujet résolu
    17 août 2023 à 11:02:46

    Bonjour a tous, je cree pour un project un constructeur de fenetre ce constructeur poscede un vector m_tabButton qui contient des Button ,les Button sont des Object tous heritter de Button . Avec la SFML j'ai cree une fonction draw pour afficher les Button qui est virtuel cependant dans ma class fenetre au moment de draw le TextButton,ShapeButton,ImageButton (qui herite de Button) appel la fonction draw de Button et non la leur voici 2 draw dans Button.cpp avec TextButton qui herite de Button dans le .h
    void Button::draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
    	//rien a draw ! (fonction virtuel)
    }
    
    void TextButton::draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
    	target.draw(m_text);
    }
    
    

    etc voicie la fonction draw dans fenetre .cpp

    void Fenetre::draw(sf::RenderTarget& target, sf::RenderStates states) const
    {
    	target.setView(m_view);
    	target.draw(m_sprite);
    	if (m_tabImage.empty() == false)
    		for (auto& object : m_tabImage)
    			target.draw(object);
    	if (m_tabText.empty() == false)
    		for (auto& object : m_tabText)
    			target.draw(object);
    	if (m_tabButton.empty() == false)
    		for (auto& button : m_tabButton)
    			target.draw(button);
    }

    merci d'avance pour votre aide 

    • Partager sur Facebook
    • Partager sur Twitter
      17 août 2023 à 11:06:10

      Tu n'as pas l'air de stocker des pointeurs dans ton tableau de boutons ce qui signifie probablement que tu as du slicing, et en tout cas pas de polymorphisme.

      Montre tes headers, on n'a pas assez d'infos, là (notamment les déclarations de tes types de boutons, et la déclaration de ce tableau de boutons).

      -
      Edité par dragonjoker 17 août 2023 à 11:07:08

      • Partager sur Facebook
      • Partager sur Twitter

      Si vous ne trouvez plus rien, cherchez autre chose.

        17 août 2023 à 11:12:36

        Fenetre.h

        #ifndef FENETRE_H_INCLUDED
        #define FENETRE_H_INCLUDED
        
        #include "Button.h"
        #include <vector>
        
        class Fenetre : public sf::Drawable, public sf::Transformable
        {
        public :
        	// Constructeur
        	Fenetre(sf::Vector2f& m_positionSouris);
        	Fenetre(sf::Vector2f& m_positionSouris, sf::Texture& texture);
        	Fenetre(sf::Vector2f& m_positionSouris, sf::Vector2f sizeView);
        	Fenetre(sf::Vector2f& m_positionSouris, sf::Texture& texture, sf::Vector2f sizeView);
        
        
        	/// FONCTIONS ///
        	void update();
        
        	//ADDBUTTON
        	void addButton(sf::Vector2f position, sf::Font& font, std::string mot);
        	void addButton(sf::Vector2f position, sf::Texture& texture);
        	void addButton(sf::Vector2f position, sf::RectangleShape forme);
        
        	/// SETTEURS ///
        	void setBackground(sf::Texture& texture);
        	/// GETTEURS ///
        	Button getButton(int i);
        
        protected :
        	/// FONCTIONS ///
        	virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
        
        	/// VARIABLES SFML ///
        	sf::Vector2f& m_positionSouris;
        	sf::View m_view;
        	sf::Sprite m_sprite;
        	/// VARIABLES VECTORS ///
        	std::vector<Button> m_tabButton;
        	std::vector<sf::Text> m_tabText;
        	std::vector<sf::Sprite> m_tabImage;
        
        };
        #endif // !FENETRE_H_INCLUDED

        Button.h

        #include <SFML/Graphics.hpp>
        #include <SFML/Audio.hpp>
        #include <string>
        
        // BUTTON
        class Button : public sf::Drawable, public sf::Transformable
        {
        public :
        	// Constructeur
        	Button();
        	Button(sf::Vector2f position);
        
        	// SETTEURS 
        	void setPosition(sf::Vector2f position);
        
        	// GETTEURS 
        	sf::Vector2f getPosition();
        	virtual bool getCollision(sf::Vector2f& positionObject);
        
        	/// FONCTIONS ///
        	virtual void update();
        
        protected :
        	/// FONCTIONS ///
        	virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
        
        	/// VARIABLES ///
        	sf::Vector2f m_position;
        
        };
        
        // TEXTBUTTON
        class TextButton : public Button
        {
        public:
        	// Constructeur
        	TextButton(sf::Font& font);
        	TextButton(sf::Vector2f position, sf::Font& font);
        	TextButton(sf::Font& font, std::string mot);
        	TextButton(sf::Vector2f position, sf::Font& font, std::string mot);
        
        	// SETTEURS 
        	void setText(std::string mot);
        	void setSize(int size);
        	void setColor(sf::Color color);
        	void setColorUpdate(sf::Color color);
        
        	// GETTEURS 
        	sf::Text getText();
        	virtual bool getCollision(sf::Vector2f& positionObject);
        
        	/// FONCTIONS ///
        	virtual void update();
        
        protected:
        	/// FONCTIONS ///
        	virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
        
        	/// VARIABLES ///
        	sf::Color m_updateColor;
        	sf::Text m_text;
        };
        

        le reste des button est definie de la meme facon avec quelque changement mineur


        • Partager sur Facebook
        • Partager sur Twitter
          17 août 2023 à 13:26:48

          Donc c'est bien ça, tu as du slicing dû à la non utilisation de pointeurs pour tes boutons.

          Pour pouvoir utiliser le polymorphisme (stocker des objets de la classe mère en utilisant le comportement spécialisé dans les classes filles), il faut stocker des pointeurs de classe mère, et du coup il faut que ton tableau soit déclaré comme suit : std::vector<std::unique_ptr<Button>> m_tabButton;

          Et du coup créer tes boutons en utilisant std::make_unique<ClasseFilleDeButton>(paramètres de construction)

          -
          Edité par dragonjoker 17 août 2023 à 13:28:12

          • Partager sur Facebook
          • Partager sur Twitter

          Si vous ne trouvez plus rien, cherchez autre chose.

            17 août 2023 à 23:29:14

            merci , cette solution permet de regler le probleme de polymorphisme sur la fonction draw, cependant j'ai un nouveau probleme dans la fonction update de ma fenetre (la fonction est introuvable pour le compilateur)

            void Fenetre::update()
            {
            	for (auto& object : m_tabButton)
            	{
            		if (*object.getCollision(m_positionSouris)) //erreur ici
            		{
            			*object.update(); //erreur ici
            		}
            	}
            }

            voici getPosition et update pour TextButton ( les 2 fonction sont virtual)

            bool TextButton::getCollision(sf::Vector2f& positionObject)
            {
            	sf::FloatRect hitbox = m_text.getGlobalBounds();
            	if (hitbox.contains(positionObject))
            		return true;
            	return false;
            }
            
            void TextButton::update()
            {
            	m_text.setFillColor(m_updateColor);
            }




            • Partager sur Facebook
            • Partager sur Twitter
              18 août 2023 à 0:06:44

              C'est peut-être plutôt :

              (*object).update();

              ou plus simplement :

              object->update();




              • Partager sur Facebook
              • Partager sur Twitter
              ...
                18 août 2023 à 0:50:23

                c'etait ca merci, je me sent bête tout a coup haha.

                J'ai cree une nouvelle class TextButtonShape qui herite de TextButton et de ShapeButton 

                class TextButtonShape : public TextButton, public ShapeButton
                {
                public:
                	TextButtonShape();
                	TextButtonShape(sf::Vector2f position, sf::Font& font, std::string mot, sf::RectangleShape forme);
                
                	// SETTEURS
                	virtual void setColor(sf::Vector3f RGB);
                
                	// GETTEURS
                	virtual bool getCollision(sf::Vector2f& positionObject);
                
                	// FONCTIONS
                	virtual void update();
                
                protected :
                	// FONCTIONS
                	virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
                
                	/// VARIABLES ///
                	sf::Color m_updateColor;
                };

                cependant il y a un soucie au niveau de la creation du boutton dans Fenetre.cpp

                void Fenetre::addButton(sf::Vector2f position, sf::Font& font, std::string mot, sf::RectangleShape forme)
                {
                	m_tabButton.push_back(std::make_unique<TextButtonShape>(position, font, mot, forme));
                }

                le probleme est probablement du au double heritage cependant c'est la premiere fois que je m'anipule cette notion voicie la definition de m_tabButton

                std::vector<std::unique_ptr<Button>> m_tabButton;

                merci pour votre aide

                -
                Edité par MathéoBrument 18 août 2023 à 5:26:18

                • Partager sur Facebook
                • Partager sur Twitter
                  18 août 2023 à 16:51:46

                  Bonjour,

                  Quel type de soucis as-tu au moment de la création du bouton ?:

                  - Erreur ou avertissement du compilateur (dans ce cas dis-le nous).

                  - Erreur à l' exécution (de segmentation (sigsegv) ) ou autre.

                  :)

                  Plus tu donneras d' informations, plus tu auras d'aide précise pour cerner le problème.

                  -
                  Edité par Warren79 19 août 2023 à 10:40:30

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

                    18 août 2023 à 22:07:41

                    Warren79 a écrit:

                    Bonjour,

                    Quel type de soucis as-tu au moment de la création du bouton ?:

                    - Erreur ou avertissement du compilateur (dans ce cas dis-le nous).

                    - Erreur à l' exécution (de segmentation (sigsegv) ) ou autre.

                    :)

                    Plus tu donneras d' information, plus tu auras d'aide précise pour cerner le problème.

                    voicie le message du compilateur :

                    GravitéCodeDescriptionProjetFichierLigneÉtat de la suppression

                    Erreur (active)E0304aucune instance de fonction surchargée "std::vector<_Ty, _Alloc>::push_back [avec _Ty=std::unique_ptr<Button, std::default_delete<Button>>, _Alloc=std::allocator<std::unique_ptr<Button, std::default_delete<Button>>>]" ne correspond à la liste d'argumentsSFML..\src\Fenetre.cpp56

                    j'ai trouver une solution en faisant directement heriter la class de Button
                    Avant :
                    class TextButtonShape : public TextButton, public ShapeButton
                    {
                    public:
                    	//...
                    
                    protected :
                    	// ...
                    };
                    apres :
                    class TextButtonShape : public Button, public TextButton, public ShapeButton
                    {
                    public:
                    	//...
                    
                    protected :
                    	// ...
                    };

                    je n'ai pas vraiment compris pourquoi cela fonctionne en heritant directement de Button
                    mais cette solution ne cree aucun probleme si vous avez une explication ou une meilleur
                    methode je suis prenneur :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 août 2023 à 12:33:40

                      MathéoBrument a écrit:

                      Warren79 a écrit:

                      Plus tu donneras d' information, plus tu auras d'aide précise pour cerner le problème.

                      voicie le message du compilateur :

                      GravitéCodeDescriptionProjetFichierLigneÉtat de la suppression

                      Erreur (active)E0304aucune instance de fonction surchargée "std::vector<_Ty, _Alloc>::push_back [avec _Ty=std::unique_ptr<Button, std::default_delete<Button>>, _Alloc=std::allocator<std::unique_ptr<Button, std::default_delete<Button>>>]" ne correspond à la liste d'argumentsSFML..\src\Fenetre.cpp56

                      je n'ai pas vraiment compris pourquoi cela fonctionne en heritant directement de Button
                      mais cette solution ne cree aucun probleme si vous avez une explication ou une meilleur
                      methode je suis prenneur :)

                      Comment veux-tu qu'on te dise quelque chose à propos d'un message d'erreur du compilateur si tu ne nous montres pas le code correspondant  (Fenetre.cpp ligne 56, sans doute) ?

                      -
                      Edité par michelbillaud 19 août 2023 à 12:34:23

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Utilisation de la bonne fonction draw

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown