Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Résolu] Dessiner dans un objet dans une fenêtre contenu dans le main  (Lu 4874 fois)

0 Membres et 6 Invités sur ce sujet

rudelune

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Bonjour à tous  ;),
J'ai en ce moment un objet appelé Entity, j'aimerais afficher un sprite contenu dans l'objet sur une fenêtre contenu dans le main.
Je ne sais pas comment faire.
Quand je fait hériter Entity.h de "public sf::Drawable", je ne peux plus déclarer mon objet. Comment faire ? Voici mon erreur :
C:\Projets\C++\test_sfml\Entity.h|77|error: cannot declare variable 'test' to be of abstract type 'Entity'|

J'avoue que je ne comprends pas trop, même en regardant la documentation : http://www.sfml-dev.org/documentation/2.1-fr/classsf_1_1Drawable.php ...

Amicalement
J'attend avec impatience votre réponse.
Merci pour SFML
Jérôme
« Modifié: Octobre 01, 2013, 05:27:43 pm par rudelune »

Hiura

  • SFML Team
  • Hero Member
  • *****
  • Messages: 4321
    • Voir le profil
    • E-mail
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #1 le: Septembre 29, 2013, 05:33:41 pm »
Il devrait y avoir une suite au message d'erreur t'expliquant quelle méthode n'a pas été implémentée.

Bon, dans cette situation, c'est facile car sf::Drawable n'a qu'une seule méthode virtuel pure. Vérifie que tu n'aies pas oublié le const ou autre dans la signature quand tu l'implémente dans Entity.
SFML / OS X developer

rudelune

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #2 le: Septembre 29, 2013, 05:41:08 pm »
Merci pour cette réponse,
En faîtes ce que je ne comprends pas c'est que dans http://www.sfml-dev.org/tutorials/2.1/graphics-vertex-array-fr.php il doit le faire dans le main.
Moi je le fait dans Entity.h :
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
        {
            // on applique la transformation de l'entité -- on la combine avec celle qui a été passée par l'appelant
            states.transform *= getTransform(); // getTransform() est définie par sf::Transformable
            states.transform *=
            // on applique la texture
            states.texture = &m_texture;

            // on peut aussi surcharger states.shader ou states.blendMode si nécessaire

            // on dessine le tableau de vertex
            target.draw(m_vertices, states);
        }
Je le met dans les 2 ?
Voici mon code du header:
#ifndef DEF_ENTITY
#define DEF_ENTITY

#include <iostream>
#include <string>
#include <SFML/Graphics.hpp>


class Entity : public sf::Drawable, public sf::Transformable
{
    public:
        Entity();
        ~Entity();

        static int nbrEntity();





        void avancer_Droite();
        void avancer_Gauche();
        void avancer_Haut();
        void avancer_Bas();
        void tourner_Droite();
        void tourner_Gauche();
        void tourner_Haut();
        void tourner_Bas();



        sf::Sprite getSprite();
        int getPosX();
        int getPosY();






    protected:
        static int compteur;
        int m_posX;
        int m_posY;

        sf::Sprite m_sprite;


        sf::Vector2f m_position;
        sf::Texture m_texture;
        sf::Texture m_personnage_haut_0;
        sf::Texture m_personnage_bas_0;
        sf::Texture m_personnage_gauche_0;
        sf::Texture m_personnage_droite_0;

        sf::Texture m_personnage_haut_1;
        sf::Texture m_personnage_bas_1;
        sf::Texture m_personnage_gauche_1;
        sf::Texture m_personnage_droite_1;

        sf::Texture m_personnage_haut_2;
        sf::Texture m_personnage_bas_2;
        sf::Texture m_personnage_gauche_2;
        sf::Texture m_personnage_droite_2;

        sf::Texture m_personnage_haut_3;
        sf::Texture m_personnage_bas_3;
        sf::Texture m_personnage_gauche_3;
        sf::Texture m_personnage_droite_3;

        sf::Image m_personnage_image;
       
        sf::VertexArray m_vertices;

    private:
        virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
        {
            // on applique la transformation de l'entité -- on la combine avec celle qui a été passée par l'appelant
            states.transform *= getTransform(); // getTransform() est définie par sf::Transformable
            states.transform *=
            // on applique la texture
            states.texture = &m_texture;

            // on peut aussi surcharger states.shader ou states.blendMode si nécessaire

            // on dessine le tableau de vertex
            target.draw(m_vertices, states);
        }
       

};

Voici mon Entity.cpp :
#include "Entity.h"
#include <SFML/Graphics.hpp>

using namespace sf;
using namespace std;

int Entity::compteur = 0;

Entity::Entity()
{
    m_posX = 0;
    m_posY = 0;
    m_position = sf::Vector2f(m_posX, m_posY);
    m_sprite.setPosition(m_position);

    m_personnage_image.loadFromFile("ressources/images/Personnages/rudelune/rudelune.png");

    m_personnage_bas_0.loadFromImage(m_personnage_image, sf::IntRect(0, 0, 32, 48));
    m_personnage_haut_0.loadFromImage(m_personnage_image, sf::IntRect(0, 144, 32, 48));
    m_personnage_droite_0.loadFromImage(m_personnage_image, sf::IntRect(0, 96, 32, 48));
    m_personnage_gauche_0.loadFromImage(m_personnage_image, sf::IntRect(0, 48, 32, 48));

    m_personnage_bas_1.loadFromImage(m_personnage_image, sf::IntRect(32, 0, 32, 48));
    m_personnage_haut_1.loadFromImage(m_personnage_image, sf::IntRect(32, 144, 32, 48));
    m_personnage_droite_1.loadFromImage(m_personnage_image, sf::IntRect(32, 96, 32, 48));
    m_personnage_gauche_1.loadFromImage(m_personnage_image, sf::IntRect(32, 48, 32, 48));

    m_personnage_bas_2.loadFromImage(m_personnage_image, sf::IntRect(64, 0, 32, 48));
    m_personnage_haut_2.loadFromImage(m_personnage_image, sf::IntRect(64, 144, 32, 48));
    m_personnage_droite_2.loadFromImage(m_personnage_image, sf::IntRect(64, 96, 32, 48));
    m_personnage_gauche_2.loadFromImage(m_personnage_image, sf::IntRect(64, 48, 32, 48));

    m_personnage_bas_3.loadFromImage(m_personnage_image, sf::IntRect(96, 0, 32, 48));
    m_personnage_haut_3.loadFromImage(m_personnage_image, sf::IntRect(96, 144, 32, 48));
    m_personnage_droite_3.loadFromImage(m_personnage_image, sf::IntRect(96, 96, 32, 48));
    m_personnage_gauche_3.loadFromImage(m_personnage_image, sf::IntRect(96, 48, 32, 48));

    m_texture.loadFromImage(m_personnage_image, sf::IntRect(0, 0, 32, 48));
    m_sprite.setTexture(m_texture);

    ++compteur;
}

Entity::~Entity()
    {
        --compteur;
    }

int Entity::nbrEntity()
    {
        return compteur;
    }








void Entity::avancer_Droite()
    {
        m_texture = m_personnage_droite_0;
        m_sprite.setTexture(m_texture);
        m_posX += 32;
        m_position = sf::Vector2f(m_posX, m_posY);
        m_sprite.setPosition(m_position);

    }

void Entity::avancer_Gauche()
    {
        m_texture = m_personnage_gauche_0;
        m_sprite.setTexture(m_texture);
        m_posX -= 32;
        m_position = sf::Vector2f(m_posX, m_posY);
        m_sprite.setPosition(m_position);
    }

void Entity::avancer_Haut()
    {
        m_texture = m_personnage_haut_0;
        m_sprite.setTexture(m_texture);
        m_posY -= 48;
        m_position = sf::Vector2f(m_posX, m_posY);
        m_sprite.setPosition(m_position);
    }

void Entity::avancer_Bas()
    {
        m_texture = m_personnage_bas_0;
        m_sprite.setTexture(m_texture);
        m_posY += 48;
        m_position = sf::Vector2f(m_posX, m_posY);
        m_sprite.setPosition(m_position);
    }











void Entity::tourner_Droite()
    {
        m_texture = m_personnage_droite_0;
        m_sprite.setTexture(m_texture);
    }

void Entity::tourner_Gauche()
    {
        m_texture = m_personnage_gauche_0;
        m_sprite.setTexture(m_texture);
    }

void Entity::tourner_Haut()
    {
        m_texture = m_personnage_haut_0;
        m_sprite.setTexture(m_texture);
    }

void Entity::tourner_Bas()
    {
        m_texture = m_personnage_bas_0;
        m_sprite.setTexture(m_texture);
    }






sf::Sprite Entity::getSprite()
    {
        return m_sprite;
    }

int Entity::getPosX()
    {
        return m_posX;
    }

int Entity::getPosY()
    {
        return m_posY;
    }



 

Et voici mes erreurs :
C:\Projets\C++\test_sfml\Entity.h|88|error: redeclaration of 'sf::Texture Entity::m_texture'|
C:\Projets\C++\test_sfml\Entity.h|50|note: previous declaration 'sf::Texture Entity::m_texture'|
C:\Projets\C++\test_sfml\Entity.h||In member function 'virtual void Entity::draw(sf::RenderTarget&, sf::RenderStates) const':|
C:\Projets\C++\test_sfml\Entity.h|80|error: no match for 'operator*=' in 'states.sf::RenderStates::transform *= (states.sf::RenderStates::texture = (&((const Entity*)this)->Entity::m_texture))'|
C:\Projets\C++\test_sfml\Entity.h|80|note: candidates are:|
C:\SFML-2.1\include\SFML\Graphics\Transform.hpp|390|note: sf::Transform& sf::operator*=(sf::Transform&, const sf::Transform&)|
C:\SFML-2.1\include\SFML\Graphics\Transform.hpp|390|note:   no known conversion for argument 2 from 'const sf::Texture*' to 'const sf::Transform&'|
C:\SFML-2.1\include\SFML\Graphics\Color.hpp|178|note: sf::Color& sf::operator*=(sf::Color&, const sf::Color&)|
C:\SFML-2.1\include\SFML\Graphics\Color.hpp|178|note:   no known conversion for argument 1 from 'sf::Transform' to 'sf::Color&'|
C:\SFML-2.1\include\SFML\System\Vector3.inl|125|note: template<class T> sf::Vector3<T>& sf::operator*=(sf::Vector3<T>&, T)|
C:\SFML-2.1\include\SFML\System\Vector3.inl|125|note:   template argument deduction/substitution failed:|
C:\Projets\C++\test_sfml\Entity.h|80|note:   'sf::Transform' is not derived from 'sf::Vector3<T>'|
C:\SFML-2.1\include\SFML\System\Vector2.inl|120|note: template<class T> sf::Vector2<T>& sf::operator*=(sf::Vector2<T>&, T)|
C:\SFML-2.1\include\SFML\System\Vector2.inl|120|note:   template argument deduction/substitution failed:|
C:\Projets\C++\test_sfml\Entity.h|80|note:   'sf::Transform' is not derived from 'sf::Vector2<T>'|
C:\SFML-2.1\include\SFML\System\Time.hpp|352|note: sf::Time& sf::operator*=(sf::Time&, sf::Int64)|
C:\SFML-2.1\include\SFML\System\Time.hpp|352|note:   no known conversion for argument 1 from 'sf::Transform' to 'sf::Time&'|
C:\SFML-2.1\include\SFML\System\Time.hpp|340|note: sf::Time& sf::operator*=(sf::Time&, float)|
C:\SFML-2.1\include\SFML\System\Time.hpp|340|note:   no known conversion for argument 1 from 'sf::Transform' to 'sf::Time&'|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 5 seconds) ===|
 
Merci d'avance
Amicalement
Jérôme
« Modifié: Septembre 29, 2013, 05:47:04 pm par rudelune »

rudelune

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #3 le: Septembre 30, 2013, 01:01:48 pm »
J'ai déjà mieux compris :
Là, c'est un tableau de vertex. Moi ce sont des sprites que j'utilise et non des vertexs. Comment faire ?
Merci d'avance
Amicalement
Jérôme

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #4 le: Septembre 30, 2013, 01:27:32 pm »
Tes deux derniers posts sont assez confus, personnellement j'ai du mal à comprendre tes questions.

Par contre en étudiant tes erreurs de compilation et ton code on peut voir deux erreurs assez évidentes :

Citer
C:\Projets\C++\test_sfml\Entity.h|88|error: redeclaration of 'sf::Texture Entity::m_texture'|
C:\Projets\C++\test_sfml\Entity.h|50|note: previous declaration 'sf::Texture Entity::m_texture'|
C'est une erreur très simple à comprendre : tu as deux déclarations de variables nommées m_texture dans Entity.h (ligne 88 et ligne 50). La seconde déclaration (ligne 88) est sûrement liée à l'erreur numéro 2 :

Citer
C:\Projets\C++\test_sfml\Entity.h|80|error: no match for 'operator*=' in 'states.sf::RenderStates::transform *= (states.sf::RenderStates::texture = (&((const Entity*)this)->Entity::m_texture))'|
Cf. le morceau de code incomplet qui traîne entre deux lignes :

            states.transform *=
Laurent Gomila - SFML developer

rudelune

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #5 le: Septembre 30, 2013, 06:17:06 pm »
Merci beaucoup ^^,
En effet c'était car il fallait enlever le states.transform *=.
Par contre ce que je ne comprends pas c'est cela,
la fonction que j'utilise sont RenderTarget et RenderStates http://www.sfml-dev.org/documentation/2.1-fr/classsf_1_1RenderTarget.php#details, si je comprends bien il permet de dessiner un sprite ... mais comment et surtout qu'est-ce que je dois mettre dans la déclaration ?
J'ai changé le tableau de vertexs par un sprite :
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
        {
            // on applique la transformation de l'entité -- on la combine avec celle qui a été passée par l'appelant
            states.transform *= getTransform(); // getTransform() est définie par sf::Transformable
            // on applique la texture
            states.texture = &m_texture;

            // on peut aussi surcharger states.shader ou states.blendMode si nécessaire

            // on dessine le tableau de vertex
            target.draw(m_sprite, states);
        }
 

Amicalement
Jérôme

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #6 le: Septembre 30, 2013, 08:43:40 pm »
Ton code est bon. Ca ne marche pas ?
Laurent Gomila - SFML developer

rudelune

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #7 le: Septembre 30, 2013, 08:50:05 pm »
Par contre ce que je ne comprends pas c'est cela,
la fonction que j'utilise sont RenderTarget et RenderStates http://www.sfml-dev.org/documentation/2.1-fr/classsf_1_1RenderTarget.php#details, si je comprends bien il permet de dessiner un sprite ... mais comment et surtout qu'est-ce que je dois mettre dans la déclaration et où (dans le main, dans entity.h ...)?

Amicalement
Jérôme

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #8 le: Septembre 30, 2013, 10:56:50 pm »
Ta question est extrêmement difficile à comprendre, désolé :P

Citer
la fonction que j'utilise sont RenderTarget et RenderStates
Ce sont des types, pas des fonctions. RenderTarget est la RenderWindow ou la RenderTexture sur laquelle tu dessines (c'est leur classe de base).

Citer
si je comprends bien il permet de dessiner un sprite
C'est qui "il" ? Tu parles de l'appel à draw ? Ca dessines tout ce que tu veux, c'est le même appel à draw que tu as dans ta boucle principale quand tu écris par exemple "window.draw(sprite)".

Citer
mais comment et surtout qu'est-ce que je dois mettre dans la déclaration ?
Quelle déclaration ? Qu'est-ce que tu veux mettre, et où ? Là ton code est complet, y a rien à changer.

Essaye d'expliquer les choses calmement pour quelqu'un qui n'est pas dans ta tête, parce que là c'est dur.
Laurent Gomila - SFML developer

rudelune

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #9 le: Octobre 01, 2013, 08:17:48 am »
;) Merci beaucoup
Je crois que j'ai compris, je test ...............................................
.........................................
........................................
....................................
..............................
->Mais ma fonction là est private, je ne vais pas l’appeler dans une autre fonction car pour cela j'aurais besoin de connaître ma RenderTarget qui se trouve dans mon main.
Donc je l'appelle d'où cette fonction ?

Amicalement
Jérôme

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #10 le: Octobre 01, 2013, 08:31:20 am »
Tu ne l'appelles jamais, elle est appelée automatiquement quand tu fais un window.draw(entity).
Laurent Gomila - SFML developer

rudelune

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #11 le: Octobre 01, 2013, 08:44:18 am »
Mais moi dans ce cas, si je veux le dessiner pendant qu'il marche pas exemple, je fait comment (je veux le dessiner 4 fois) ?

Amicalement
Jérôme

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #12 le: Octobre 01, 2013, 08:50:13 am »
Est-ce que tu te rends compte que "pendant qu'il marche" et "le dessiner 4 fois" ne signifie pas grand chose pour nous ? On n'a aucune idée de ce que ça signifie en terme de code, et surtout de la raison pour laquelle ça te pose un problème. Sois plus précis s'il te plaît :-\

Tout ce que je peux te répondre c'est que si tu veux dessiner un truc 4 fois alors appelle la fonction draw 4 fois...
Laurent Gomila - SFML developer

rudelune

  • Newbie
  • *
  • Messages: 12
    • Voir le profil
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #13 le: Octobre 01, 2013, 03:55:15 pm »
Excuse-moi, je vais essayer de résumer la situation.
J'ai 4 fonctions dans mon objet Entity :
avancer_Droite()
avancer_Gauche();
avancer_Haut();
avancer_Bas();

Chacune permet de faire avancer mon personnage (mon sprite),
voici leurs contenu :
m_texture = m_personnage_droite_0;
        m_sprite.setTexture(m_texture);
        m_posX += 32;
        m_position = sf::Vector2f(m_posX, m_posY);
        m_sprite.setPosition(m_position);

J'aimerais afficher 4 fois m_sprite, pour 4 images quand il avance, comment je peux faire dans une seule fonction.

Amicalement
Jérôme

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Dessiner dans un objet dans une fenêtre contenu dans le main
« Réponse #14 le: Octobre 01, 2013, 03:59:11 pm »
T'es assez loin du but, il y aurait tout un tas de choses à expliquer pour réaliser ce que tu veux, et beaucoup de choses à corriger rien que dans le petit morceau de code que tu montres.

A mon avis tu devrais t'entraîner avec des choses moins compliquées, bosser encore un peu tes bases. N'hésite pas à aller jeter un oeil sur le wiki, il y a des exemples de code pour gérer les animations (parce que finalement c'est de ça qu'on parle non ?).
Laurent Gomila - SFML developer

 

anything