-
j'ai repris ce code dans les tutoriels : http://www.sfml-dev.org/tutorials/2.0/graphics-transform-fr.php
// la classe de base abstraite
class Node
{
public:
// ... fonctions pour transformer le noeud
// ... fonction pour gérer les enfants du noeud
void draw(sf::RenderTarget& target, const sf::Transform& parentTransform) const
{
// on combine la transformation du parent avec la transformation du noeud
sf::Transform combinedTransform = parentTransform * m_transform;
// on laisse le noeud se dessiner
onDraw(target, combinedTransform)
// on dessine ses enfants
for (std::size_t i = 0; i < m_children.size(); ++i)
m_children[i]->draw(target, combinedTransform);
}
private:
virtual void onDraw(sf::RenderTarget& target, const sf::Transform& transform) const = 0;
sf::Transform m_transform;
std::vector<Node*> m_children;
};
// une classe dérivée simple : un noeud qui dessine un sprite
class SpriteNode : public Node
{
public:
// .. fonctions pour paramétrer le sprite
private:
virtual void onDraw(sf::RenderTarget& target, const sf::Transform& transform) const
{
target.draw(m_sprite, transform);
}
sf::Sprite m_sprite;
};
Il y a une coquille dans le code, il manque toute la partie dérivé de sf::Drawable , dans l'état actuel on ne peu rien afficher
-
Le draw de node appelle le onDraw de spriteNode non ? Du coup qu'est-ce qui manque ?
-
Fait un :
SpriteNode monSpriteNode;
...
window.draw( monSpriteNode );
Ton compilo ne va pas laisser passer.
-
Ah ouai ! Node ne dérive pas de sf::Drawable
-
Node ne devrais pas dérivé de sf::drawable , un noeud est un noeud , si ton noeud terminal est un son par exemple , tu est fin avec ton drawable qui va dessiner un son :D
C'est la classe spécialisé qui devrais dérivé , Node devrais juste dérivé de sf::Transformable je pense.
-
C'est juste un exemple. Pourquoi est-ce que ça devrait dériver de sf::Drawable ? Là j'ai (volontairement) choisi de montrer une interface 100% custom, plutôt que basée sur les interfaces SFML.
Ces classes ne sont donc bien entendu pas faites pour ça
window.draw(node);
mais plutôt pour ça
node.draw(window);
-
L'exemple est ambigu , comme c'est fait , avec la méthode draw dans la classe node , on pense automatiquement à ce qu'elle doit dérivé de sf::Drawable.
-
J'ai voulu tenté d'écrire une classe node en la dérivant de sf::Transformable , je me suis cassé les dents
sf::Transformable n'a aucune méthode pour mettre à jour un sf::Transform (suite à une combinaison parent->enfants) , la solution pour faire du scenegraph sans passé par des sf::Drawable , c'est de réecrire complètement la classe sf::Transformable.
-
L'exemple est ambigu , comme c'est fait , avec la méthode draw dans la classe node , on pense automatiquement à ce qu'elle doit dérivé de sf::Drawable.
Pourtant il est clair qu'elle n'en dérive pas, donc c'est pas si ambigü que ça :P
J'ai voulu tenté d'écrire une classe node en la dérivant de sf::Transformable , je me suis cassé les dents
sf::Transformable n'a aucune méthode pour mettre à jour un sf::Transform (suite à une combinaison parent->enfants) , la solution pour faire du scenegraph sans passé par des sf::Drawable , c'est de réecrire complètement la classe sf::Transformable.
Déjà, quel rapport entre Drawable et Transformable ? Les deux sont complètement indépendants.
Ensuite, je ne vois pas trop le problème. Tu as juste à remplacer m_transform par getTransform() dans le code du tutoriel, si tu fais hériter Node de sf::Transformable.
-
Je ne fait que lire ton article , reconnais quand même qu'il y a un problème ici précisément :
// une classe dérivée simple : un noeud qui dessine un sprite
class SpriteNode : public Node
Or , y a rien qui ce dessine , d'ou l’ambiguïté. :P
-
y a rien qui ce dessine
?? ???
Voilà la fonction qui dessine :
virtual void onDraw(sf::RenderTarget& target, const sf::Transform& transform) const
{
target.draw(m_sprite, transform);
}
Et voilà comment dessiner un SpriteNode :
SpriteNode node;
...
node.draw(window, sf::Transform::Identity);
-
Et voilà comment dessiner un SpriteNode :
SpriteNode node;
...
node.draw(window, sf::Transform::Identity);
Et voilà ce qui manquait :P
Le réflexe comme je l'ai dit plus haut , c'est de faire l'inverse : window.draw(node)
-
Il ne faut justement pas que ce soit un réflexe. Dériver de sf::Drawable est courant mais pas obligatoire, il faut aussi s'habituer à d'autres APIs de classes dessinables.