Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: Leviathan le Avril 12, 2016, 11:24:31 pm

Titre: SFML Game Development - comment utiliser la méthode detachChild()
Posté par: Leviathan le Avril 12, 2016, 11:24:31 pm
Bonjour,

Possesseur du livre SFML Game Development, j'ai terminé le chapitre 3 dans lequel est utilisé un graphe de scène. Cependant, je ne parviens pas à comprendre l'utilisation de la méthode detachChild() de la classe SceneNode. Voici un extrait du code :

Dans l'implémentation de la classe SceneNode :

// Les deux attributs de la classe, déclarés dans le .hpp
// std::vector<std::unique_ptr<SceneNode>> mChildren;
// SceneNode* mParent;

void SceneNode::attachChild(std::unique_ptr<SceneNode>child)
{
        child->mParent = this;
        mChildren.push_back(std::move(child));
}

SceneNode::std::unique_ptr<SceneNode> SceneNode::detachChild(const SceneNode& node)
{
        auto found = std::find_if(mChildren.begin(), mChildren.end(), [&] (Ptr& p) { return p.get() == &node; });
        assert(found != mChildren.end());

        std::unique_ptr<SceneNode>result = std::move(*found);
        result->mParent = nullptr;
        mChildren.erase(found);
        return result;
}

Et voilà un exemple d'utilisation (l'objet Aircraft hérite de SceneNode) :

// Attribut déclaré dans le .hpp
// Aircraft* mPlayerAircraft;

std::unique_ptr<Aircraft> leader(new Aircraft(Aircraft::Eagle, mTextures));
mPlayerAircraft = leader.get();

std::unique_ptr<Aircraft> leftEscort(new Aircraft(Aircraft::Raptor, mTextures));
mPlayerAircraft->attachChild(std::move(leftEscort));

Ici l'objet leftEscort a été attaché à l'objet mPlayerAircraft, et cela fonctionne effectivement bien. Mais ensuite je ne sais pas comment "détacher" cet objet nouvellement attaché: je ne sais pas du tout quoi indiquer en paramètre de detachChild(). J'ai regardé dans le code accompagnant le livre, detachChild() n'est jamais utilisé donc je n'ai pas pu me baser sur un exemple pour comprendre. Sauriez-vous m'éclairer sur ce point ?

Merci d'avance.
Titre: Re : SFML Game Development - comment utiliser la méthode detachChild()
Posté par: Cpl.Bator le Avril 13, 2016, 02:44:02 am
Si je me trompe pas, en pseudo code :

- donc ObjetDetacher == Enfant
Titre: Re : SFML Game Development - comment utiliser la méthode detachChild()
Posté par: Leviathan le Avril 14, 2016, 01:16:26 pm
En pseudo-code, j'arrive à voir les choses. Mais c'est d'un point de vue d'implémentation que j'ai un problème. Toujours dans l'exemple donné, lorsque j'essaie d'écrire "detachChild(leftEscort)" le compilateur hurle à cause de types incompatibles. Si j'écris "detachChild(*leftEscort)", cette fois le programme plante tout simplement.
Titre: Re : SFML Game Development - comment utiliser la méthode detachChild()
Posté par: victorlevasseur le Avril 14, 2016, 01:48:08 pm
Ca sert à rien d'essayer des choses au hasard. leftEscort est l'unique_ptr que t'as utilisé pour ajouter l'enfant au parent ? Si oui, il est vide (nullptr) après l'ajout (car attachChild déplace l'unique_ptr).
Titre: Re : SFML Game Development - comment utiliser la méthode detachChild()
Posté par: Leviathan le Avril 17, 2016, 09:24:27 pm
Bonjour,

Effectivement, je me suis rendu compte de mes bêtises, et je n'utilisais pas la méthode de la bonne façon. Merci pour vos réponses.