Partage
  • Partager sur Facebook
  • Partager sur Twitter

variables non modifiées.

Sujet résolu
    30 novembre 2019 à 21:12:35

    Salut, je possède une classe Quest (une quête), une classe Pnj (un personnage non joueur) et une classe Hero. (le joueur)

    Je modifie la variable ici :

    void MyAppli::actionPerformed(gui::Button* item) {
            std::cout<<"text : "<<item->getText()<<std::endl;
            if (item->getText() == "Accept") {
                if (!static_cast<Hero*>(hero)->containsQuest(selectedQuest)) {
                    static_cast<Hero*>(hero)->addQuest(selectedQuest);
                }
                wDisplayQuest->setVisible(false);
                setEventContextActivated(true);
                selectedQuest.setStatus(Quest::IN_PROGRESS);
                for (unsigned int i = 0; i < selectedPnj->getQuests().size(); i++) {
                    if (selectedQuest.getName() == selectedPnj->getQuests()[i].getName()) {
                        selectedPnj->getQuests()[i].setStatus(Quest::IN_PROGRESS);
                    }
                }
                std::string request = "ACCEPT*"+conversionIntString(selectedPnj->getId())+"*"+selectedQuest.getName()+"*"+conversionIntString(hero->getId());
                SymEncPacket packet;
                packet<<request;
                Network::sendTcpPacket(packet);
                bAccept->setEventContextActivated(false);
                bGiveUp->setEventContextActivated(false);
            }

    Là normalement, je modifie la valeur du status et je la met à Quest::InProgress pour le pnj sélectionné.

    Mais après, lorsque je vais là :

    void MyAppli::onLabQuestClicked(Label* label) {
            label->setEventContextActivated(false);
            wDisplayQuests->setVisible(false);
            for (unsigned int i = 0; i < selectedPnj->getQuests().size(); i++) {
                if (selectedPnj->getQuests()[i].getName() == label->getText()) {
                    selectedQuest = selectedPnj->getQuests()[i];
                }
            }
            lQuestName->setText(selectedQuest.getName());
            lQuestTask->setText(selectedQuest.getTask());
            pRewards->removeAll();
            FontManager<Fonts> &fm = cache.resourceManager<Font, Fonts>("FontManager");
            Label* lxp = new Label(*wDisplayQuest, pRewards->getPosition(), Vec3f(50, 100, 0),fm.getResourceByAlias(Fonts::Serif),"xp : "+conversionIntString(selectedQuest.getXp()), 10);
            pRewards->addChild(lxp);
            lxp->setParent(pRewards);
            std::map<unsigned int, Item> rewards = selectedQuest.getRewards();
            std::map<unsigned int, Item>::iterator it;
            TextureManager<Item::Type> &tm2 = cache.resourceManager<Texture, Item::Type>("TextureManager2");
            unsigned int i = 0;
            for (it = rewards.begin(); it != rewards.end(); it++) {
                Sprite sprite (*tm2.getResourceByAlias(it->second.getType()),Vec3f(pRewards->getPosition().x + 50 * (i+1), pRewards->getPosition().y, 0),Vec3f(50, 50, 0), sf::IntRect(0, 0, 50, 50));
                Icon* icon = new Icon(*wDisplayQuest,Vec3f(pRewards->getPosition().x + 50 * (i+1), pRewards->getPosition().y, 0),Vec3f(50, 50, 0),sprite);
                pRewards->addChild(icon);
                icon->setParent(pRewards);
                Label* lNbItems = new Label(*wDisplayQuest, Vec3f(pRewards->getPosition().x + 50 * (i+1), pRewards->getPosition().y, 0), Vec3f(50, 50, 0),fm.getResourceByAlias(Fonts::Serif),conversionIntString(it->first), 10);
                lNbItems->setBackgroundColor(sf::Color::Transparent);
                pRewards->addChild(lNbItems);
                lNbItems->setParent(pRewards);
                i++;
            }
            if (selectedQuest.getStatus() == Quest::NEW) {
                std::cout<<"new"<<std::endl;
                bAccept->setText("Accept");
            } else if (selectedQuest.getStatus() == Quest::IN_PROGRESS || selectedQuest.getStatus() == Quest::COMPLETE && selectedQuest.getPnjToVisit() != selectedPnj->getName())  {
                bAccept->setText("Continue");
            } else if (selectedQuest.getStatus() == Quest::COMPLETE && selectedQuest.getPnjToVisit() == selectedPnj->getName()) {
                std::cout<<"finished"<<std::endl;
                bAccept->setText("Get rewards");
            }
            bAccept->setEventContextActivated(true);
            bGiveUp->setEventContextActivated(true);
            wDisplayQuest->setVisible(true);
        }

    Le status de la quête n'est pas changé, il vaut toujours NEW, hors que je l'ai mit à IN_PROGRESS!

    J'ai le même problème ici, lorsque je tue un monstre, j'incrémente le nombre de monstres tués de un :

     void Quest::addMonsterToKillProgress(std::string name) {
            std::map<std::string, std::pair<unsigned int, unsigned int>>::iterator it;
            it = monstersToKill.find(name);
            if (it != monstersToKill.end() && it->second.second < it->second.first) {
                it->second.second++;
                if (checkIfIsComplete()) {
                    status = COMPLETE;
                    std::vector<Entity*> pnjs = World::getEntities("E_PNJ");
                    for (unsigned int i = 0; i < pnjs.size(); i++) {
                        if (name == static_cast<Pnj*>(pnjs[i])->getQuests()[i].getName())
                            static_cast<Pnj*>(pnjs[i])->getQuests()[i].setStatus(COMPLETE);
                    }
                }
            }
        }

    Mais après lorsque je veux afficher le nombre de monstre tuées il m'affiche toujours 0 :

    void MyAppli::onLabDiaryQuestName(Label* label)  {
            Quest quest;
            for (unsigned int i = 0; i < static_cast<Hero*>(hero)->getDiary().size(); i++) {
                if (label->getText() == static_cast<Hero*>(hero)->getDiary()[i].getName()) {
                    quest = static_cast<Hero*>(hero)->getDiary()[i];
                }
            }
            FontManager<Fonts>& fm = cache.resourceManager<Font, Fonts>("FontManager");
            std::map<std::string, std::pair<unsigned int, unsigned int>>::iterator it;
            std::map<std::string, std::pair<unsigned int, unsigned int>> monstersToKill = quest.getMonsterToKill();
            pQuestProgress->removeAll();
            unsigned int i = 0;
            for (it = monstersToKill.begin(); it != monstersToKill.end(); it++) {
                Label* lab = new Label(*wDiary, Vec3f(300, i*100, 0), Vec3f(300, 100, 0), fm.getResourceByAlias(Fonts::Serif),conversionIntString(it->second.second)+"/"+conversionIntString(it->second.first)+" "+it->first, 15);
                pQuestProgress->addChild(lab);
                lab->setParent(pQuestProgress);
                i++;
            }
            std::map<std::string, std::pair<unsigned int, unsigned int>> itemsToCollect = quest.getItemsToCollect();
            for (it = itemsToCollect.begin(); it != itemsToCollect.end(); it++) {
                Label* lab = new Label(*wDiary, Vec3f(300, i*100, 0), Vec3f(300, 100, 0), fm.getResourceByAlias(Fonts::Serif),conversionIntString(it->second.first)+"/"+conversionIntString(it->second.second)+" "+it->first, 15);
                pQuestProgress->addChild(lab);
                lab->setParent(pQuestProgress);
                i++;
            }
        }



    Et je ne peux pas utiliser de pointeurs sinon ça plante, donc, je suis obligé de mettre à jour manuellement pnj.quest quand diary.quest change.


    Edit : pour le premier problème j'ai trouvé il fallait que je renvoie une référence sur le vecteur, par contre pour le deuxième problème je ne vois pas, pourtant je modifie bien la std::map dans la classe et lorsque je la récupère je veux juste faire une lecture...

    Problème résolu, du coups grâce à la référence sur le std::vector j'ai pu utilisé des pointeurs.

    -
    Edité par OmbreNoire 30 novembre 2019 à 22:37:40

    • Partager sur Facebook
    • Partager sur Twitter
      1 décembre 2019 à 22:42:10

      Hmm, revoit ta conception.

      Par experience, l'utilisation d'un objet représentant la séléction courrante, n'est jamais une bonné idée.

      Et quand je voit que ceci prolifère partout dans ton code:

      static_cast<Hero*>(hero)

      Ca indique clairement que l'héritage n'est pas le bon choix pour ton appli, oriente toi plutôt vers une agrégation de données et/ou de comportements (système ECS).

      -
      Edité par Deedolith 2 décembre 2019 à 13:57:36

      • Partager sur Facebook
      • Partager sur Twitter
        2 décembre 2019 à 9:32:05

        J'ai rarement vu autant de new et de static_cast vers le bas dans un code C++. Il y a un gros problème de conception ici.

        Pour ton problème, il va falloir faire un SSCCE car là difficile pour nous de deviner. Debugger au pas à pas pourra aussi te permettre d'analyser les variables et vérifier que tu passes dans tous les chemins.

        Tu peux aussi mettre des points d'arrêt quand une variable change, ce qui est particulièrement pratique.

        -
        Edité par markand 2 décembre 2019 à 9:34:59

        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

        variables non modifiées.

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown