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

Auteur Sujet: SFML Game Development - comment utiliser la méthode detachChild()  (Lu 2433 fois)

0 Membres et 1 Invité sur ce sujet

Leviathan

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
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.

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : SFML Game Development - comment utiliser la méthode detachChild()
« Réponse #1 le: Avril 13, 2016, 02:44:02 am »
Si je me trompe pas, en pseudo code :
  • Parent->Attach( Enfant )
  • ObjetDetacher = Parent->Detach( Enfant )

- donc ObjetDetacher == Enfant

Leviathan

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : SFML Game Development - comment utiliser la méthode detachChild()
« Réponse #2 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.

victorlevasseur

  • Full Member
  • ***
  • Messages: 206
    • Voir le profil
Re : SFML Game Development - comment utiliser la méthode detachChild()
« Réponse #3 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).

Leviathan

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : SFML Game Development - comment utiliser la méthode detachChild()
« Réponse #4 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.