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

Auteur Sujet: [ Résolu ] SIGSEGV (inventaire)  (Lu 11781 fois)

0 Membres et 2 Invités sur ce sujet

Glân de Brylan

  • Invité
Re : SIGSEGV (inventaire)
« Réponse #30 le: Avril 18, 2015, 08:16:42 pm »
Ah oui, exact. Étant donné la structure des vectors ça me semblait impossible, mais apparemment non. Au temps pour moi.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV (inventaire)
« Réponse #31 le: Avril 19, 2015, 08:50:49 am »
Rah... mais ça marche toujours pas >< !
Je vois que du vert... évidemment j'ai ramassé 1 blé avant d'essayer.
Enfin en fait j'ai fait ça:
J'ai essayé.
Que du vert.(normal)
J'ai ramassé le blé
Que du vert(pas normal)

*expose des murs de code*
Inventory:
class Inventory {
public:
    Inventory () :  maxTailleX(16), dfault(), invTextName(), myObjects() {
        //unsigned int invInt[maxTailleX];
        //std::string invName[maxTailleX];
        sf::IntRect inRec(0, 0, 32, 32);
        dfault.setTextureRect(inRec);
        dfault.setColor(sf::Color::Black);
    }
    ~Inventory () {}
    bool add (int nbr, std::string str, const sf::Texture& texture) {

         for (std::size_t i(0) ; i < 16 ; i++)
         {
             if (myObjects[i].name == str) // on a trouvé une case qui contient déjà de ces objets !
             {
                 myObjects[i].number += nbr; // donc on en ajoute le nombre qu'il faut.
                 return true; // objets ajoutés à l'inventaire avec succès.
             }
         }

         for(std::size_t i(0) ; i < 16 ; i++) // aucune case contenant déjà de ces objets n'a été trouvée, on va donc en chercher une vide.
         {
             if(myObjects[i].number == 0) // si cette case est vide...
             {
                 myObjects[i].number = nbr; // ...on la remplit avec notre nouvel objet.
                 myObjects[i].name = str;
                 myObjects[i].image.setTexture(texture);

                 if(i == 0) // si c'est la première case de l'inventaire...
                     myObjects[i].image.setPosition(0.f, 0.f); // ...on lui donne la position du premier objet à afficher.
                 else
                 {
                     myObjects[i].image.setPosition( myObjects[i-1].image.getPosition() ); // ...sinon on lui donne la position de l'objet d'avant...
                     myObjects[i].image.move(32.f, 0.f); // ...avec x+32 !
                 }
                 return true; // objets ajoutés à l'inventaire avec succès.
             }
         }

         return false; // échec, l'inventaire est plein, les objets n'ont pas pu y être ajoutés.
     }

    bool del(std::string delName) {
        for (std::size_t i(0) ; i < 16 ; i++) {
            if (myObjects[i].name == delName) {
                myObjects[i].number = 0;
                myObjects[i].name = "";
                myObjects[i].image = dfault;
            }
        }
        return true;
    }

    unsigned int recupInt (const unsigned int pos) const {
        if(pos < 16)
            return myObjects[pos].number;
        else
            return 0;
    }

    std::string recupStr (const unsigned int pos) const {
        if(pos < 16)
            return myObjects[pos].name;
        else
            return "";
    }

    sf::Sprite recupSprite (const unsigned int pos) const {
        if(pos < 16) {
            if (recupInt(pos) != 0)
                return myObjects[pos].image;
            else
                return dfault;
        } else
            return dfault;
    }

    void drawInventory(sf::RenderWindow& w)
    {
        //w.draw(invTextName);

        for( std::size_t i(0) ; i < 16 ; i++)
            if(myObjects[i].number > 0)
                w.draw(myObjects[i].image);
    }

    // //////////////// ///
    // Attributs privés ///
    // //////////////// ///
private:
   const unsigned int maxTailleX;
   sf::Sprite dfault; // carré noir de 32x32
   //std::vector<int> invInt; // Nombre d'objets dans la place de l'inventaire X
   //std::vector<std::string> invName; // Nom de l'objet dans la place de l'inventaire X
   //std::vector<sf::Sprite> invImg;
   sf::Text invTextName; // = invName en sf::Text.

   //std::vector<InvSpace> myObjects;
   InvSpace myObjects[16];
};
Quelqu'un peut me dire pourquoi c'est si dur de copier-coller sous Qt ?! RAAAAAAGE !
Et dans invspace, j'ai juste rajouté un public: au début.
Par défaut les attibuts d'une class sont privés,
pour une struct ils sont publics.

J'ai pas de chance :x

Glân de Brylan

  • Invité
Re : SIGSEGV (inventaire)
« Réponse #32 le: Avril 19, 2015, 11:34:35 am »
J'avais oublié que les attributs étaient par défaut privés dans une classe...je manque terriblement de pratique.

Sinon, tu donnes bien une texture valide quand tu appelles add() ? Une texture qui n'est pas détruite à un moment ou un autre ?
Il me semble que tu n'utilises pas de vue personnalisée, si ?

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV (inventaire)
« Réponse #33 le: Avril 19, 2015, 12:45:42 pm »
Oui elle est bien valide, c'est blepng et orgepng:
sf::Texture blepng, deadBlepng, orgepng, deadOrgepng;
Une vue personnalisée ? C'est à dire ? J'utilise une vue.
window.setView(view);
Que je modifie quand mon personnage court:
bool deplacer(Orientation orientation, const int level[], sf::View& view) {
        int xx;
        int numy = this->mynumx; // < THIS
       if (orientation == Droite) {
           xx = this->xy+1;
           if (canBeWalked(level[xx])) {
                SpritePerso.move(32.f, 0.f);
                this->x += 1;
                this->xy = y16+x;
                if (this->x == this->od) {
                    view.move(sf::Vector2f(160, 0));
                    this->od += 5;
                    this->og += 5;
                }
                return true;
           }
       }
       if (orientation == Bas) {
           xx = this->xy+numy;
           if (canBeWalked(level[xx])) {
           SpritePerso.move(0.f, 32.f);
           this->y += 1;
           this->y16 = y*numy;
           this->xy = y16+x;
           if (this->y == this->ob) {
               view.move(sf::Vector2f(0, 160));
               this->ob += 5;
               this->oh += 5;
           }
           return true;
           }
       }
       if (orientation == Gauche) {
           xx = this->xy-1;
           if (canBeWalked(level[xx])) {
           SpritePerso.move(-32.f, 0.f);
           this->x -= 1;
           this->xy = y16+x;
           if (this->x == this->og) {
               view.move(sf::Vector2f(-160, 0));
               this->od -= 5;
               this->og -= 5;
           }
           return true;
           }
       }
       if (orientation == Haut) {
           xx = this->xy-numy;
           if (canBeWalked(level[xx])) {
           SpritePerso.move(0.f, -32.f);
           this->y -= 1;
           this->y16 = y*numy;
           this->xy = y16+x;
           if (this->y == this->oh) {
               view.move(sf::Vector2f(0, -160));
               this->ob -= 5;
               this->oh -= 5;
           }
           return true;
           }
       }
return false;
}
Me dit pas que c'est à cause de ça quand même ?

Ah, SI !!!
On a trouvé le problème, quand je récolte le blé et que je reviens à la position de départ 0;0 je vois le blé dans mon inventaire !!!
GOTCHA !
Et maintenant ? :x
« Modifié: Avril 19, 2015, 12:49:10 pm par S66 »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : SIGSEGV (inventaire)
« Réponse #34 le: Avril 19, 2015, 01:37:57 pm »
Citer
Et maintenant ? :x
Désolé, je vais encore avoir l'air du grincheux de service, mais... on va faire ton jeu jusqu'à la fin ou bien à un moment donné tu vas essayer de faire des trucs tout seul ? C'est pas pour être désagréable que je dis ça, mais si tu veux progresser il va falloir que tu apprennes à debugger ton code tout seul. Les forums peuvent t'aider à sortir d'une impasse, ou à comprendre un point particulièrement obscur, mais poster tous les jours des kilomètres de code en nous laissant les inspecter, jusqu'à ce que tout marche bien, ce n'est pas la solution.

D'autant plus que là, c'est un problème de logique avec le code que tu as écrit toi-même (enfin j'espère :P). Si tu en arrives au point où tu n'arrives plus à déchiffrer les comportements que tu as codés, tu n'arriveras de toute façon plus à avancer correctement, et debugger toi-même le code t'aidera à comprendre ce qui se passe, à l'améliorer et passer à la suite.
Laurent Gomila - SFML developer

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : Re : SIGSEGV (inventaire)
« Réponse #35 le: Avril 19, 2015, 01:45:39 pm »
Désolé, je vais encore avoir l'air du grincheux de service, mais... on va faire ton jeu jusqu'à la fin ou bien à un moment donné tu vas essayer de faire des trucs tout seul ?
Des trucs tout seul ? Bah j'ai fait le jeu. Puis j'ai eu cette erreur. Ça te va ?

C'est pas pour être désagréable que je dis ça, mais si tu veux progresser il va falloir que tu apprennes à debugger ton code tout seul. Les forums peuvent t'aider à sortir d'une impasse, ou à comprendre un point particulièrement obscur, mais poster tous les jours des kilomètres de code en nous laissant les inspecter, jusqu'à ce que tout marche bien, ce n'est pas la solution.
Tu préfères que je te dises mon problème et que je ne te fournisse aucun code ? D'accord !

D'autant plus que là, c'est un problème de logique avec le code que tu as écrit toi-même (enfin j'espère :P).
Évidemment que je l'ai écrit moi-même <.<

Si tu en arrives au point où tu n'arrives plus à déchiffrer les comportements que tu as codés, tu n'arriveras de toute façon plus à avancer correctement, et debugger toi-même le code t'aidera à comprendre ce qui se passe, à l'améliorer et passer à la suite.
En effet.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : [ Résolu (ou presque) ] SIGSEGV (inventaire)
« Réponse #36 le: Avril 19, 2015, 01:55:17 pm »
EDIT: ah non, c'était juste mes yeux qui me jouaient des tours :x
« Modifié: Avril 19, 2015, 01:58:49 pm par S66 »

Glân de Brylan

  • Invité
Re : [ Résolu ] SIGSEGV (inventaire)
« Réponse #37 le: Avril 19, 2015, 03:17:30 pm »
Donc bah pour le reste débrouille-toi...vas-y à grands coups de mapCoordsToPixel() et mapPixelToCoords(). Pour le reste il y a la doc'.