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

Auteur Sujet: [sf::Transform] Récupérer les transformations hiérarchiquement  (Lu 3891 fois)

0 Membres et 1 Invité sur ce sujet

dm67x

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Bonjour à tous,

Je voudrais récupérer les transformations (sf::Transform) appliqué par exemple sur une classe (A) qui elle-même contient un objet (B) composite (agrégation) et je voudrais donc récupérer la transformation appliquée à A dans B pour multiplier cette transformation avec la transformation de B et ainsi calculer les coordonnées des objets en utilisant les méthodes transformRect et transformPoint.

Merci à vous de m'éclaircir sur ce point.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: [sf::Transform] Récupérer les transformations hiérarchiquement
« Réponse #1 le: Avril 19, 2018, 02:42:54 pm »
Sans en savoir plus sur la classe A, on ne peut pas deviner ce qui t'empêche de "récupérer" les transformations qui lui sont appliquées. S'il hérite de sf::Transformable alors il suffit d'appeler la fonction getTransform() ; sinon, il va falloir décrire ton problème un peu mieux.
Laurent Gomila - SFML developer

dm67x

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re: [sf::Transform] Récupérer les transformations hiérarchiquement
« Réponse #2 le: Avril 19, 2018, 02:59:46 pm »
Merci pour ta réponse.
En fait mes deux classes héritent de sf::Transformable et sf::Drawable, du coup dans ma classe A j'effectue une rotation et un positionnement tandis que dans ma classe B j'effectue un positionnement et une mise à l'échelle, or je veux pouvoir cliquer sur la classe B donc récupérer la transformation de A la multiplier par B pour avoir la bonne position de la classe B et utiliser ainsi sf::Mouse pour cliquer sur cette carte.

Exemple:

class A : public sf::Transformable, public sf::Drawable
{
private:
B * object_b;

public:
void draw(sf::RenderTarget & target, sf::RenderStates states) const;
};
 

// Fichier A.cpp
//...
setRotation(rotation);
//...
void A::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
states.transform *= getTransform();
target.draw(*object_b, states);
}
 

class B : public sf::Transformable, public sf::Drawable
{
public:
void update(sf::Event evt);
void draw(sf::RenderTarget & target, sf::RenderStates states) const;
}
 

//Fichier B.cpp
void B::update(sf::Event evt)
{
sf::Vector2f position = getTransform().transformPoint(getPosition()); // récupérer la position de la carte avec la rotation appliquée la classe A
// Verifier si position + taille contient le pointeur de la souris lors d'un click souris
}

void B::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
states.transform *= getTransform();
target.draw(....., states);
}
 

Et ce que je fais quelque chose qui ne va pas ?
Navré de vous embêter autant :)
« Modifié: Avril 19, 2018, 03:08:13 pm par dm67x »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: [sf::Transform] Récupérer les transformations hiérarchiquement
« Réponse #3 le: Avril 19, 2018, 03:11:03 pm »
Citer
void B::draw(sf::RenderTarget & target, sf::RenderStates states) const
{
states.transform = getTransform();
Là tu ne combines rien, tu écrases la transformation héritée dans "states" et tu appliques uniquement celle de B. Il faudrait un *= au lieu d'un =.

Pour le reste, si tu ne dis pas à B quelle est la transformation de A, alors il sera bien incapable de faire des calculs corrects dans sa fonction B::update.
Laurent Gomila - SFML developer

dm67x

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re: [sf::Transform] Récupérer les transformations hiérarchiquement
« Réponse #4 le: Avril 19, 2018, 03:14:00 pm »
Oui je viens de rectifier cela, je l'avais oublié dans mon exemple mais justement comment je fais pour récupérer la transformation de A dans B pour appliqué la rotation sur la position de mon objet B.

Par exemple: mon objet A je lui applique une rotation et donc mon objet B à qui je lui avais déjà appliqué un positionnement avec setPosition(...) a juste sa position habituelle sans la rotation effectué par A ? Donc pour passer la transformation de A dans B je dois lui passer par les paramètres (ex: constructeur) ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: [sf::Transform] Récupérer les transformations hiérarchiquement
« Réponse #5 le: Avril 19, 2018, 03:34:38 pm »
Ca dépend de la conception de tes classes. Par exemple, si tu as un update hiérarchique (comme le draw), A peut passer sa transformation combinée à B via sa fonction update. Sinon, B peut aussi connaître son parent et lui demander directement. Ca dépend vraiment de comment tu as organisé tes classes.
Laurent Gomila - SFML developer

dm67x

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re: [sf::Transform] Récupérer les transformations hiérarchiquement
« Réponse #6 le: Avril 19, 2018, 03:37:55 pm »
Ok merci beaucoup pour ton aide, au passage ta lib est juste nickel ;)