Forum de la communauté SFML

Aide => Général => Discussion démarrée par: S66 le Avril 08, 2015, 06:27:21 pm

Titre: [ Résolu ] SIGSEGV (inventaire)
Posté par: S66 le Avril 08, 2015, 06:27:21 pm
Bonjour,
...
Regardez en bas. Enfin, à la page 3.
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 08, 2015, 06:34:53 pm
Wow la grossière erreur !
J'ai mis dans inventory.h: if (pos > maxTailleX) alors que c'est l'inverse ! :o
Désolé du dérangement
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 08, 2015, 06:42:06 pm
Bon.. triple post et 2e erreur, exactement le même message, mais cette fois le problème est ici:
Le programme plante quand je fais I, ce qui est censé m'afficher l'inventaire...

// inventory.h

std::string recupStr (const int pos) {
        if(pos < maxTailleX)
            return invStr[pos]; // fleche jaune ici
        else
            return "";
    }
 
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 09, 2015, 11:31:19 am
Ah, l'éternel sigsev...le terrible, le redouté sigsev.
Il n'y a pas quarante solutions. Lance le debugger, exécute le programme pas-à-pas, et au moment où ça plante, trouve l'erreur.
SIGSEV apparaît dans les cas suivants :
– Quand tu essaies de déréférencer un pointeur nul.
Exemple :
MaClasse *ptr = nullptr;
ptr->fonctionMembre(); // ERREUR : Le pointeur est nul, la fonction ne peut être appelée.
– Quand tu essaies d'accéder à une case de mémoire qui n'est pas allouée à ton programme.
Exemple :
int *entier = new int(0);
*entier = 5; // pas de problème, la case de mémoire pointée est à toi.
delete entier;
*entier = 0; // ERREUR : la case de mémoire pointée n'est plus allouée à ton programme.

Dans tous les cas tu as un problème de pointeurs quelque part, et le seul moyen de trouver où est d'y aller à grands coups de debugger.


EDIT : J'avoue avoir répondu sans lire ton post.
Conseil : Pour stocker une position, prend un entier non signé, basiquement unsigned int plutôt que juste int.
Je te conseillerais même d'utiliser std::size_t qui est là exprès pour ça. Ça t'évitera des problèmes de positions négatives qui sont parfois source de problèmes.

Autre conseil : donne des noms explicites. J'ai pris une ligne au pif et ai trouvé ble4.getAvb(). Comment suis-je supposé comprendre ce que cela signifie ?! Chage tes noms, là c'est incompréhensible, personne ne va vouloir t'aider avec un code pareil.
Pareil, dans ta classe inventaire, il y a : std::string invStr[];
Je suppose que invStr signifie "inventory string". La chaîne de caractères de l'inventaire. Cool, ça correspond à quoi ? À quoi sert cete attribut ? C'est son nom ? Si c'est son nom, appelle-le name, ne lui donne pas un nom à la noix. Et surtout pas un nom qui contient celui du type, n'appelle pas un string str, il y a std::string juste avant, je voir bien que c'est un string, pas la peine de le remettre dans le nom de l'instance.
D'ailleurs au début j'avais pas pigé que inv c'était pour inventory, je croyais que c'était inverse...comme quoi...
Titre: Re : Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 09, 2015, 06:39:08 pm
EDIT : J'avoue avoir répondu sans lire ton post.
Conseil : Pour stocker une position, prend un entier non signé, basiquement unsigned int plutôt que juste int.
Je te conseillerais même d'utiliser std::size_t qui est là exprès pour ça. Ça t'évitera des problèmes de positions négatives qui sont parfois source de problèmes.

Autre conseil : donne des noms explicites. J'ai pris une ligne au pif et ai trouvé ble4.getAvb(). Comment suis-je supposé comprendre ce que cela signifie ?! Chage tes noms, là c'est incompréhensible, personne ne va vouloir t'aider avec un code pareil.
Pareil, dans ta classe inventaire, il y a : std::string invStr[];
Je suppose que invStr signifie "inventory string". La chaîne de caractères de l'inventaire. Cool, ça correspond à quoi ? À quoi sert cete attribut ? C'est son nom ? Si c'est son nom, appelle-le name, ne lui donne pas un nom à la noix. Et surtout pas un nom qui contient celui du type, n'appelle pas un string str, il y a std::string juste avant, je voir bien que c'est un string, pas la peine de le remettre dans le nom de l'instance.
D'ailleurs au début j'avais pas pigé que inv c'était pour inventory, je croyais que c'était inverse...comme quoi...

ble4.getAvb ? Bah je vais pas non plus écrire tous les noms des fonctions en entier, je suis feignant moi...
la fonction getAvb signifie getAvaible, pour voir si l'objet est avaible ou pas. <.<
Pourquoi invStr ? Bah qu'est ce que tu veux que je te dises, invStr ou invName, ça change pas grand chose...
J'ai mis unsigned int à la place de int, ça change rien vu que l'erreur est sur invStr, mais bon, au moins ça sera fait x)

std::string recupStr (const int pos) {
        if(pos < maxTailleX)
            return invStr[pos]; // Trace du débogueur. J'vois pas ce qu'y'a de mal ici...
        else
            return "";
    }
Et toujours le même problème, Sigsegv
Titre: Re : SIGSEGV plantage du prog
Posté par: G. le Avril 09, 2015, 06:46:56 pm
Tu devrais tenter d'initialiser invStr avant de t'en servir... ce que tu fais dans ton constructeur ne sert a RIEN.
Et quel rapport entre un tableau de string et SFML ?
Titre: Re : Re : Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 09, 2015, 07:20:16 pm
ble4.getAvb ? Bah je vais pas non plus écrire tous les noms des fonctions en entier, je suis feignant moi...
Eh bien, je ne vais pas m'embêter à comprendre ton code plus que ça, je suis fainéant moi...
Plus sérieusement, si tu ne donnes pas de noms explicites dans ton code, si un jour tu veux réutiliser ce code mais que tu n'y as pas touché depuis des mois, tu vas toi-même avoir beaucoup de mal à comprendre comment cela fonctionne.

invStr ou invName, ça change pas grand chose
Ah ben à l'exécution, c'est sûr, ça ne change absolument rien. Mais comme je l'ai dit, c'est plus clair. Une chaîne de caractères c'est pas forcément un nom, ça peut être par exemple un texte qui s'affiche quand tu ouvres l'inventaire, ou encore plein d'autres trucs qu'on pourrait imaginer.

Il est important de donner des noms clairs. Si tu refuses de le faire, ne t'attends pas à recevoir de l'aide rapide et efficace.
Titre: Re : Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 11, 2015, 09:42:54 am
Tu devrais tenter d'initialiser invStr avant de t'en servir... ce que tu fais dans ton constructeur ne sert a RIEN.
Ah bon ? Voici mon nouveau code alors <.<

class Inventory {
public:
    Inventory () :  maxTailleX(16), invInt(), invName() {
        //unsigned int invInt[maxTailleX];
        //std::string invName[maxTailleX];
    }
    ~Inventory () {}
    bool modifier (int posX, int nbr, std::string str) {
        if(posX < maxTailleX)
            return false;
        invInt[posX] = nbr;
        invName[posX] = str;
        return true;
    }
    unsigned int recupInt (int posX) {
        if(posX < maxTailleX)
            return invInt[posX];
        else
            return 0;
    }
    std::string recupStr (const int pos) {
        if(pos < maxTailleX)
            return invName[pos]; //toujours ici la trace du débogueur...
        else
            return "";
    }
private:
   const int maxTailleX;
   unsigned int invInt[]; // Nombre d'objets dans la place de l'inventaire X
   std::string invName[]; // Nom de l'objet dans l'inventaire X
};

M'enfin..

Object.h:

class RObject : public Entity {
public:
    RObject(int xx, int yx, std::string nam, bool canBeUsed = true, bool isAvaible = true) : \
        Entity(), name(nam), type(3), isStillAvaible(isAvaible), isUsed(canBeUsed) {
        x = 0;
        y = 0;
        //name = nam;
        //type = 3;
        int i = 1;
        while (i < xx) {
            Icon.move(32.f, 0.f);
            x+=1;
            i+=1;
        }
        i = 1;
        while (i < yx) {
            Icon.move(0.f, 32.f);
            y+=1;
            i+=1;
        }
        i = 0;
        //isStillAvaible = isAvaible;
        //isUsed = canBeUsed;
    }
    bool load(const std::string& texture) {
        if (m_texture.loadFromFile(texture))
            Icon.setTexture(m_texture);
        else
            return false;
        return true;
    }
    ~RObject() {}
    bool inter() {
        if (isStillAvaible && isUsed)
            return true;
        else
            return false;
    }
    void changeU(bool u) {
        isUsed = u;
    }
    bool getU() {
        return isUsed;
    }
    bool getAvb() {
        return isStillAvaible;
    }
    void changeAvb(bool n) {
        isStillAvaible = n;
    }
    std::string getName() {
        return name;
    }
private:
    int type;
    bool isStillAvaible; // Montré/Caché, si oui = montré
    bool isUsed; // Pour interagir, si oui = peut interagir
    std::string name;
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const {

        // on applique la transformation
        states.transform *= getTransform();

        // on applique la texture du tileset
        states.texture = &m_texture;

        // et on dessine enfin le tableau de vertex
        target.draw(Icon, states);
    }
};

Code qui me donne un warning '-'

C:\Users\william\Projets\C++\newQt\Projects\dofus\Code\tilemap\Object.h:66: avertissement : 'RObject::name' will be initialized after [-Wreorder]
     std::string name;
                 ^

Mais, rien n'a changé, toujours le même problème, et pourtant j'ai initialisé...
Enfin je crois...
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 11, 2015, 10:42:03 am
unsigned int invInt[]; // Nombre d'objets dans la place de l'inventaire X
std::string invName[]; // Nom de l'objet dans l'inventaire X
C'est simple. Tu n'as pas donné de taille à tes tableaux. invInt et invName sont des tableaux de 0 cases.
Donc évidemment si tu essaies d'accéder à la case 4 (par exemple), ça plante, et ta condition ne l'empêche pas puisque 4 est bien inférieur à 16 (maxTalleX).

unsigned int invInt[16]; // Nombre d'objets dans la place de l'inventaire X
std::string invName[16]; // Nom de l'objet dans l'inventaire X
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 11, 2015, 12:12:39 pm
Juste pour ça ! ><
Merci beaucoup '-'
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 11, 2015, 01:14:58 pm
Super. Mais j'ai un autre problèmes.
Enfin deux, mais pour le 2e, on verra après...

Voici mon main:
#include "tilemap.h"
#include "perso.h"
#include "Entity.h"
#include "PNJ.h"
#include "Object.h"
#include "Monster.h"
#include "Inventory.h"

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <string>
#include <fstream>
#include <QApplication>
#include <QDebug>

using namespace std;

bool RInter(Perso& p, RObject& e, const std::string& texture, Inventory& inv) {
    if (p.inter(e) == e.getType()) {
        qDebug() << "23";
        if (e.inter()) {
            qDebug() << "25";
            e.changeU(false);
            if (!e.load(texture))
                 return false;
            string e_name = e.getName();
            if (e_name == "ble") {
                qDebug() << "31";
                int nb = inv.recupInt(0);
                int nbr = nb+1;
                inv.modifier(0, nbr, e_name);
            }
            if (e_name == "orge") {
                qDebug() << "37";
                int nb = inv.recupInt(1);
                int nbr = nb+1;
                inv.modifier(1, nbr, e_name);
            }
            qDebug() << "42";
            qDebug() << "";
            return true;
        }
    }
    qDebug() << "46";
    qDebug() << "";
    return false;
}

int main(int argc, char *argv[])
{
    // on crée la fenêtre
    QApplication app(argc, argv);
    //------------------------------------17----8
sf::RenderWindow window(sf::VideoMode(544, 256), "Tilemap");
    sf::RenderWindow w;
    sf::VideoMode v(400, 200);
    int errCode = 0;
    sf::Font font;
    font.loadFromFile("arial.ttf");
    sf::View view = window.getDefaultView();

    // on définit le niveau à l'aide de numéro de tuiles
    const int level[] ={.........};

    // on crée la tilemap avec le niveau précédemment défini
    TileMap map;
    if (!map.load("tileset.png", sf::Vector2u(32, 32), level, 52, 24)) {
          //gestion d'erreur...
    }
    //                            ____________________________^ THIS
    Perso perso; //               v THIS
    if (!perso.load("perso.png", 52)) {
        //gestion d'erreur...
    }
    // __________________________^
    RObject ble(49, 13, "ble"), \
            ble2(47, 13, "ble"), \
            ble3(48, 12, "ble"), \
            ble4(45, 11, "ble"), \
            ble5(44, 12, "ble"), \
            ble6(47, 11, "ble");

    if (!ble.load("ble.png") \
            || !ble2.load("ble.png") \
            || !ble3.load("ble.png") \
            || !ble4.load("ble.png") \
            || !ble5.load("ble.png") \
            || !ble6.load("ble.png")) {
        //...
    }
    //
    RObject orge(47, 14, "orge"), \
            orge2(45, 13, "orge"), \
            orge3(44, 14, "orge"), \
            orge4(49, 11, "orge");

    if (!orge.load("orge.png") \
            || !orge2.load("orge.png") \
            || !orge3.load("orge.png") \
            || !orge4.load("orge.png")) {
        //...
    }

    //RObjects = true; A desactiver si on
    // ne veut pas faire les interactions.
    // RObjects = false pour desactiver
    bool RObjects = true;
        bool Ble = true;
        bool Orge = true;

        Inventory Inventaire;
    int myInt;
    float myFloat;
    sf::Sprite mySprite;
    sf::Texture myTexture;

   while (window.isOpen())
    {
        // on gère les évènements
        sf::Event event;
        while (window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed) {
                window.sf::RenderWindow::close();
                if (errCode != 0)
                    w.sf::RenderWindow::close();
                return 0;
            }

            if (event.type == sf::Event::KeyPressed && errCode == 0) // Si on appuie sur une touche
            {
                if (event.key.code == sf::Keyboard::Right)
                    perso.deplacer(Perso::Orientation::Droite, level, view);
                if (event.key.code == sf::Keyboard::Left)
                    perso.deplacer(Perso::Orientation::Gauche, level, view);
                if (event.key.code == sf::Keyboard::Down)
                    perso.deplacer(Perso::Orientation::Bas, level, view);
                if (event.key.code == sf::Keyboard::Up)
                    perso.deplacer(Perso::Orientation::Haut, level, view);
                if (event.key.code == sf::Keyboard::E) {
                    if (RObjects) {
                        if (Ble) {
                            RInter(perso, ble, "deadBle.png", Inventaire); // E => Interaction
                            RInter(perso, ble2, "deadBle.png", Inventaire);
                            RInter(perso, ble3, "deadBle.png", Inventaire);
                            RInter(perso, ble4, "deadBle.png", Inventaire);
                            RInter(perso, ble5, "deadBle.png", Inventaire);
                            RInter(perso, ble6, "deadBle.png", Inventaire);
                        }
                        if(Orge) {
                            RInter(perso, orge, "deadOrge.png", Inventaire);
                            RInter(perso, orge2, "deadOrge.png", Inventaire);
                            RInter(perso, orge3, "deadOrge.png", Inventaire);
                            RInter(perso, orge4, "deadOrge.png", Inventaire);
                        }
                    }
                }
                if (event.key.code == sf::Keyboard::I) {
                    if (perso.getStatus() == 0)
                        perso.setStatus(1); //mode inventaire
                    else
                        perso.setStatus(0); //mode jeu
                }
            }

        }
window.clear(sf::Color::Green);

        if (errCode == 0) {
            window.setView(view);
            if (perso.getStatus() == 0) {
                window.draw(map);
                if (RObjects) {
                    if (Ble) {
                        if (ble.getAvb())
                            window.draw(ble);
                        if (ble2.getAvb())
                           window.draw(ble2);
                        if (ble3.getAvb())
                           window.draw(ble3);
                        if (ble4.getAvb())
                          window.draw(ble4);
                        if (ble5.getAvb())
                          window.draw(ble5);
                        if (ble6.getAvb())
                            window.draw(ble6);
                    }
                    if (Orge) {
                        if (orge.getAvb())
                            window.draw(orge);
                        if (orge2.getAvb())
                            window.draw(orge2);
                        if (orge3.getAvb())
                            window.draw(orge3);
                        if (orge4.getAvb())
                            window.draw(orge4);
                    }
                }
                window.draw(perso);
            }
if (perso.getStatus() == 1) {
                //Draw Invetory
                myInt = 0;
                myFloat = 0;
                while (Inventaire.recupInt(myInt) > 0) {
                    string strr = Inventaire.recupStr(myInt);
                    string str_texture = strr;
                    str_texture += ".png";
                    if (myTexture.loadFromFile(str_texture)) {
                        mySprite.setTexture(myTexture);
                        int nbrr = Inventaire.recupInt(myInt);
                        string nbrrr = to_string(nbrr);
                        sf::Text myText(strr, font, 10);
                        sf::Text myText2(nbrrr, font, 10);
                        myText2.move(20.f, 0.f);

                        myText.move(myFloat, 0.f);
                        myText2.move(myFloat, 0.f);
                        mySprite.move(myFloat, 0.f);

                        window.draw(mySprite);
                        window.draw(myText);
                        window.draw(myText2);
                    }
                    myFloat += 32;
                    myInt += 1;
                }
            }
        }
        window.display();
    }
    return 0;
}
 
Quel gros main...

M'enfin, alors voilà, quand je fais E, n'importe où, et bien tous mes RObjects sont "utilisés" alors qu'ils ne devraient pas !
Par exemple, je suis en 3;3 et le RObject est en 49;13, quand je fais E, le RObject a l'image deadBle.png (ou deadOrge.png pour l'orge) alors qu'il ne devrait pas !
Et cela, pour tous les RObjects...
if (event.key.code == sf::Keyboard::E) {
                    if (RObjects) {
                        if (Ble) {
                            RInter(perso, ble, "deadBle.png", Inventaire); // E => Interaction
                            RInter(perso, ble2, "deadBle.png", Inventaire);
                            RInter(perso, ble3, "deadBle.png", Inventaire);
                            RInter(perso, ble4, "deadBle.png", Inventaire);
                            RInter(perso, ble5, "deadBle.png", Inventaire);
                            RInter(perso, ble6, "deadBle.png", Inventaire);
                        }
                        if(Orge) {
                            RInter(perso, orge, "deadOrge.png", Inventaire);
                            RInter(perso, orge2, "deadOrge.png", Inventaire);
                            RInter(perso, orge3, "deadOrge.png", Inventaire);
                            RInter(perso, orge4, "deadOrge.png", Inventaire);
                        }
                    }
                }

bool RInter(Perso& p, RObject& e, const std::string& texture, Inventory& inv) {
    if (p.inter(e) == e.getType()) {
        qDebug() << "23";
        if (e.inter()) {
            qDebug() << "25";
            e.changeU(false);
            if (!e.load(texture))
                 return false;
            string e_name = e.getName();
            if (e_name == "ble") {
                qDebug() << "31";
                int nb = inv.recupInt(0);
                int nbr = nb+1;
                inv.modifier(0, nbr, e_name);
            }
            if (e_name == "orge") {
                qDebug() << "37";
                int nb = inv.recupInt(1);
                int nbr = nb+1;
                inv.modifier(1, nbr, e_name);
            }
            qDebug() << "42";
            qDebug() << "";
            return true;
        }
    }
    qDebug() << "46";
    qDebug() << "";
    return false;
}

Donc quand je fais E, la console m'affiche:
23
25
31
42
pour le blé, et pour l'orge:
32
35
37
42

... ?

Ah et voici les fonctions inter...
perso.inter:
int inter(Entity e) {
        int eX = e.getX();
        int eYY = e.getY();
        int eY = mynumx*eYY;
        int eXY = eY+eX;
        if (e.getType() == 0)
            return 0;
        if (e.getType() != 0 && eXY == xy)
            return e.getType();
        else
            return 0;
    }
RObject.inter:
bool inter() {
        if (isStillAvaible && isUsed)
            return true;
        else
            return false;
    }
Entity.getType:
int getType() {
        return type;
    }
 

RObject hérite de Entity

Merci d'avance  :)
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 11, 2015, 01:38:26 pm
Avant tout, une petite chose :
RObject ble(49, 13, "ble"), \
            ble2(47, 13, "ble"), \
            ble3(48, 12, "ble"), \
            ble4(45, 11, "ble"), \
            ble5(44, 12, "ble"), \
            ble6(47, 11, "ble");
Alors ce code est correct, pas de problèmes. Sache juste que les \ sont inutiles vu qu'en C++ il n'y a aucune notion de fin de ligne. Par exemple, si tu avais écrit :
RObject ble(49, 13, "ble"),



            ble2(47, 13, "ble"),
            ble3(48, 12, "ble"),

            ble4(45, 11, "ble"),
            ble5(44, 12, "ble"),                           ble6(47, 11, "ble");
Cela fonctionnerait tout aussi bien.

Pour ce qui est de ton problème...je ne suis pas sûr d'avoir très bien compris ton code, mais si c'est le cas, quand on appuie sur E, ça appelle la fonction RInter sur tous les objets ble ou orge, selon. Or cette fonction fait deux choses : ajouter le blé/orge dans ton inventaire et transformer celui au sol en blé/orge mort.
Ton programme fait exactement ce que tu lui demande : récupérer tout. Tu dois faire en sorte de vérifier pour chaque blé si ton perso est dessus, et si oui, récupérer le blé/orge. Là ,aucun test de hitbox n'est fait, donc évidemment, il récupère tout.
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 11, 2015, 02:19:35 pm
Euh, si, y'a des tests, regarde:
bool RInter(Perso& p, RObject& e, const std::string& texture, Inventory& inv) {
    if (p.inter(e) == e.getType()) {
        qDebug() << "23";
        if (e.inter()) {
            qDebug() << "25";
            e.changeU(false);
            if (!e.load(texture))
                 return false;
            string e_name = e.getName();
            if (e_name == "ble") {
                qDebug() << "31";
                int nb = inv.recupInt(0);
                int nbr = nb+1;
                inv.modifier(0, nbr, e_name);
            }
            if (e_name == "orge") {
                qDebug() << "37";
                int nb = inv.recupInt(1);
                int nbr = nb+1;
                inv.modifier(1, nbr, e_name);
            }
            qDebug() << "42";
            qDebug() << "";
            return true;
        }
    }
    qDebug() << "46";
    qDebug() << "";
    return false;
}
p.inter:
int inter(Entity e) {
        int eX = e.getX();
        int eYY = e.getY();
        int eY = mynumx*eYY;
        int eXY = eY+eX;
        if (e.getType() == 0)
            return 0;
        if (e.getType() != 0 && eXY == xy)
            return e.getType();
        else
            return 0;
    }
et e.inter:
bool inter() {
        if (isStillAvaible && isUsed)
            return true;
        else
            return false;
    }

Donc, c'est pas censé faire ça.

Et pour les \, pas grave, je préfère comme ça ^^
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 11, 2015, 03:15:55 pm
        int eXY = eY+eX;
        if (e.getType() == 0)
            return 0;
        if (e.getType() != 0 && eXY == xy)
Première erreur. Tu ne peux pas juste additionner les coordonnées. Si son perso est en (3;6) et ton blé en (5;4), ils ne sont pas du tout au même endroit et pourtant ton programme va croire que si. Tu dois comparer les x et le y séparément.
Ensuite j'aimerais comprendre : c'est quoi getType() ? Ça renvoie un int, mais qui correspond à quoi ? Usuellement, pour définir un type, on crée une énumération, on ne se contente pas d'un int...
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 11, 2015, 04:03:31 pm
getType correspond au type de l'entity
0 = juste une entité, aucune interaction
1 = un monstre.
2 = un PNJ.
3 = un RObject
Et, comparer les coordonnés séparément ?
D'accord, je vais essayer

EDIT:
int inter(Entity e) const {
        int eX = e.getX();
        int eY = e.getY();
        if (e.getType() == 0)
            return 0;
        if (e.getType() != 0 && eX == x && eY == y)
            return e.getType();
        else
            return 0;
    }

Ça change rien. Je comprends pas ><
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 11, 2015, 07:13:34 pm
J'ai décortiqué ta fonction RInter() :
if (p.inter(e) == e.getType())
Mettons que e soit de type 0, donc une simple entité. p.inter(e) renvoie 0, et e.getType() aussi, donc la condition vaut vrai. Les tests suivants seront donc exécutés, ce qui est idiot puisqu'un RObject de type 0 n'a aucune interaction. La première ligne de cette fonction devrait être
if (e.getType() == 0)
    return false;
Ensuite, appel à p.inter(e). Oh, cette fonction est inutilement compliquée, puisqu'un test de collision, sur ce type de configuration, se résume à ça :
bool inter(Entity e)
{
    return ( e.getX() == x && e.getY() == y )
}

Et ta fonction RInter devient :
bool RInter(Perso& p, RObject& e, const std::string& texture, Inventory& inv)
{
   if (e.getType() == 0)
        return false;

    // Comme tes QDebug() affichaient (je suppose) les numéro de ligne, je les ai enlevés, puisque ça ne va plus correspondre à rien.
    // À propos c'est une mauvaise façon de procéder, si tu veux savoir où en est ton programme, tu utilises le debugger en mode pas-à-pas.

    if (p.inter(e) && e.inter()) // Si le perso est bien au même endroit que e et que e est disponible...
        {
            e.changeU(false);   // Eh ben e n'est plus dispo, puisque p vient de le ramasser.

            if (!e.load(texture))   // Tu devrias plutôt ne charger qu'une seule fois la texture, le la donner à ton entité quand elle en a besoin
                 return false;      // Parce que là tu as une texture par entité alors qu'elles utilisent toutes la même, ce genre de truc bouffe vite de la mémoire pour rien.

            string e_name = e.getName();

            if (e_name == "ble")
            {
                int nb = inv.recupInt(0);
                int nbr = nb+1;
                inv.modifier(0, nbr, e_name); // On le met dans l'inventaire.
            }
            if (e_name == "orge")
            {
                int nb = inv.recupInt(1);
                int nbr = nb+1;
                inv.modifier(1, nbr, e_name); // Idem.
            }
            // D'ailleurs, si ton inventaire est plein et que tu essaies d'ajouter un truc, je crois que ton programme va planter. Mais ce n'est pas le problème.

            return true; // Et on dit "oui, cette entité a été ramassée".
    }

    return false; // Ou pas.
}

Lis bien les commentaires, ils pourraient t'apprendre un truc ou deux.
Cette version de p.inter(e) et de RInter() devrait fonctionner, tu me confirmes ça ?
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 11, 2015, 07:36:19 pm
« D'ailleurs, si ton inventaire est plein et que tu essaies d'ajouter un truc, je crois que ton programme va planter. Mais ce n'est pas le problème. »
Bin non, vu que mon inventaire est primitif, chaque objet a sa place. Blé aura la place 0, orge la place 1.

if (e_name == "ble")
                {
                    int nb = inv.recupInt(0);
                    int nbr = nb+1;
                    inv.modifier(0, nbr, e_name); // On le met dans l'inventaire.
                }
                if (e_name == "orge")
                {
                    int nb = inv.recupInt(1);
                    int nbr = nb+1;
                    inv.modifier(1, nbr, e_name); // Idem.
                }

Et, euh, maintenant c'est le type qui déraille.

pour le truc e.load, j'ai fait ça:
main.cpp:
//mes includes

using namespace std;

sf::Texture deadBle;

deadBle.loadFromFile("deadBle.png");

bool RInter(Perso& p, RObject& e, const std::string& texture, Inventory& inv) {...}
et il me met deadBle en rouge surligné, et lors de la compilation, la compilo me dit:
C:\Users\william\Projets\C++\newQt\Projects\dofus\Code\tilemap\main.cpp:23: erreur : 'deadBle' does not name a type
 deadBle.loadFromFile("deadBle.png");
 ^
Mon compilateur est fou !
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 11, 2015, 07:57:51 pm
Déj), c'est j'ai bien compris, deadBle est global. Tetete. On ne t'as jamais appris que les variables global c'était mal ?

Crée ta texture dans ta fonction main. Change le prototype de RInter pour que sont paramètre texture soit effectivement une sf::Texture et non un std::string et modifie des RObject pour que leur fonction load() prenne directement la texture plutôt que de prendre son adresse et de la charger. (pareil pour ble.png, orge.png et deadOrge.png, bien sûr)
Si une même texture est chargée plusieurs fois dans ton programme, c'est qu'il y a un problème de conception. Perso j'utilise une classe textureCore qui s'occupe de charger les texture et de distribuer leurs adresses aux classes qui les demandent.
(par exemple une class Champignon va faire :
 m_texture = textCore->giveMeTexture("champignon");
)
Où textCore est un pointeur global qui pointe sur l'unique instance de textureCore (bon, les variables globales son pratique dans ce genre de cas, mais d'après moi c'est le seul)
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 12, 2015, 11:40:42 am
Okay. J'utilise 4 textures pour ble, orge, deadBle, deadOrge, et j'ai changé les std::string en sf::Texture.
Le blé veut toujours pas se faire ramasser.
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 12, 2015, 02:47:54 pm
C'est bien dans ton main et pas en variables globales ? Parce que si oui...ben, ton compilo est fou et j'y peux rien :(
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 12, 2015, 03:09:00 pm
Oui, c'est bien dans mon main  :( :o
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 15, 2015, 04:50:01 pm
C'est vrai, mon compilateur était fou.
Mais j'ai résolu le problème par diverses manipulations.
2e problème: L'inventaire qui affiche rien.
else {
                //Draw Invetory
                myInt = 0;
                myFloat = 0;
                while (Inventaire.recupInt(myInt) > 0) {
                    string strr = Inventaire.recupStr(myInt);
                    string str_texture = strr;
                    str_texture += ".png";
                    if (myTexture.loadFromFile(str_texture)) {
                        mySprite.setTexture(myTexture);
                        int nbrr = Inventaire.recupInt(myInt);
                        string nbrrr = to_string(nbrr);
                        sf::Text myText(strr, font, 10);
                        sf::Text myText2(nbrrr, font, 10);
                        myText2.move(20.f, 0.f);

                        myText.move(myFloat, 0.f);
                        myText2.move(myFloat, 0.f);
                        mySprite.move(myFloat, 0.f);

                        window.draw(mySprite);
                        window.draw(myText);
                        window.draw(myText2);
                    }
                    window.draw(InvMode); // texte dont le string est "Inventaire"
                    myFloat += 32;              // Pour annoncer qu'on est en mode inventaire
                    myInt += 1;
                }
            }

Le problème... rien ne s'affiche. même pas le sf::Text InvMode.
(Je vois juste du vert, car j'ai window.clear(sf::Color::Green); avant.)
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 15, 2015, 05:20:23 pm
Premièrement, tu charges une texture à chaque itération de la boucle, ce qui est extrêmement mauvais pour les performances, encore plus que d'avoir une texture par entité.
Normalement, tu avais déjà chargé les texture, mettons que tu les as nommées textureBle et textureOrge, remplace :
str_texture += ".png";
if (myTexture.loadFromFile(str_texture)) {
    mySprite.setTexture(myTexture);
Par :
if(str_texture == "Ble")
    mySprite.setTexture(textureBle);
else
    mySprite.setTexture(textureOrge);
Cela ne résoudra pas ton problème mais c'est important. Enfin en fait, le résoudra peut-être? Tu sais, un texture, c'est fait pour être chargé une fois, par pour changer à tout bout de champ. Tu es sensé la créer, charger son image, puis ne t'en servir que pour la plaquer sur des entités comme les sprites. Peut-être que ce sont ces changements intempestifs d'images qui empêchent le dessin de se dérouler correctement.

Sinon, peut-être est-ce parce que myText, myText2 et mySprite sont des variables temporaires, supprimées à chaque fin d'itération de la boucle ? Essaie de mettre des sprites dans ton inventaire, puis de dessiner le tout avec par exemple une fonction Inventaire.makeDraws(window) qui ferait tous les window.draw() nécessaires.
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 15, 2015, 06:12:15 pm
EDIT: non c'est bon, j'ai plus l'erreur to_string

Par contre il veut toujours pas draw.

if (perso.getStatus() == 0) {
                window.draw(map);
                if (RObjects) {
                    if (Ble) {
                        if (ble.getAvb())
                            window.draw(ble);
                        if (ble2.getAvb())
                           window.draw(ble2);
                        if (ble3.getAvb())
                           window.draw(ble3);
                        if (ble4.getAvb())
                          window.draw(ble4);
                        if (ble5.getAvb())
                          window.draw(ble5);
                        if (ble6.getAvb())
                            window.draw(ble6);
                    }
                    if (Orge) {
                        if (orge.getAvb())
                            window.draw(orge);
                        if (orge2.getAvb())
                            window.draw(orge2);
                        if (orge3.getAvb())
                            window.draw(orge3);
                        if (orge4.getAvb())
                            window.draw(orge4);
                    }
                }
                window.draw(perso);
            }
            //if (perso.getStatus() == 1)
            else {
                //Draw Inventory
                Inventaire.drawInventory(window, font);
            }
Fonction drawInventory:
void drawInventory(sf::RenderWindow& w, sf::Font& font) {
        int myInt = 0;
        float myFloat = 0;
        while(recupInt(myInt) != 0) {
            std::string iStr = recupStr(myInt);
            int iNb = recupInt(myInt);
            std::string iNbr = std::to_string(iNb);
            sf::Sprite iImg = recupSprite(myInt);
            sf::Text oName(iStr, font, 10);
            sf::Text oNbr(iNbr, font, 10);
            oNbr.move(20.f, 0.f);

            iImg.move(myFloat, 0.f);
            oName.move(myFloat, 0.f);
            oNbr.move(myFloat, 0.f);

            w.draw(iImg);
            w.draw(oName);
            w.draw(oNbr);

            myInt += 1;
            myFloat += 32;
        }
    }
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 15, 2015, 06:18:45 pm
std::to_string
Titre: Re : SIGSEGV plantage du prog
Posté par: S66 le Avril 16, 2015, 06:11:27 pm
Hem, et maintenant ? :x
Titre: Re : SIGSEGV plantage du prog
Posté par: Glân de Brylan le Avril 16, 2015, 06:18:20 pm
Il y a toujours le problème de tes sprites et textes qui cessent d'exister à chaque fin d'itération de la boucle. Fais-toi un vector de sprite (ajoutant une nouveau sprite avec la bonne texture et la bonne position à chaque ble ou orge récupéré) et fais :
for( std::size_t i(0) ; i < mesObjets.size() ; i++)
    window.draw(mesObjets[i]);[/cpp]
Titre: Re : SIGSEGV (inventaire)
Posté par: S66 le Avril 18, 2015, 03:46:33 pm
Toujours rien.
Et voici mon nouveau code:
RInter:
bool RInter(Perso& p, RObject& e, sf::Texture& texture, Inventory& inv, sf::Sprite& img) {
    if (e.getType() == 0)
            return false;
    if (p.inter(e) && e.inter()) // Si le perso est bien au même endroit que e et que e est disponible...
            {
        //Ln 48
                e.changeU(false);   // Eh ben e n'est plus dispo, puisque p vient de le ramasser.

                if (!e.load(texture))   // Tu devrais plutôt ne charger qu'une seule fois la texture, le la donner à ton entité quand elle en a besoin
                     return false;      // Parce que là tu as une texture par entité alors qu'elles utilisent toutes la même, ce genre de truc bouffe vite de la mémoire pour rien.
                //Ln 53
                std::string eName = e.getName();
                inv.add(1, eName, img);
                // D'ailleurs, si ton inventaire est plein et que tu essaies d'ajouter un truc, je crois que ton programme va planter. Mais ce n'est pas le problème.

                return true; // Et on dit "oui, cette entité a été ramassée".
        }
        // return false ln 72
        return false; // Ou pas.
}

Et Inventory.h:
class Inventory {
public:
    Inventory () :  maxTailleX(16), dfault(), invInt(0, 0), invName(0, ""), invImg(0), invTextName() {
        //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, sf::Sprite img) {
        if (invInt.size() < maxTailleX) {
            bool trouver = false;
            for (std::size_t i(0) ; i < invName.size() ; i++) {
                if (invName[i] == str) {
                    invInt[i] += nbr;
                    trouver = true;
                }
            }
            if (!trouver) {
                if (invInt.size() < maxTailleX) {
                    invInt.push_back(nbr);
                    invName.push_back(str);
                    invImg.push_back(img);
                }
            }
        return true;
        } else
            return false;
    }
    bool del(/*std::string delName*/) {
        //je sais pas comment delete une case précise dans un vector.
        //et evidemment, je peux pas utiliser pop_back...
        return true;
    }
    unsigned int recupInt (const unsigned int pos) const {
        if(pos < invInt.size())
            return invInt[pos];
        else
            return 0;
    }
    std::string recupStr (const unsigned int pos) const {
        if(pos < invName.size())
            return invName[pos];
        else
            return "";
    }
    sf::Sprite recupSprite (const unsigned int pos) const {
        if(pos < invImg.size()) {
            if (recupInt(pos) != 0)
                return invImg[pos];
            else
                return dfault;
        } else
            return dfault;
    }
    void drawInventory(sf::RenderWindow& w/*, sf::Font& font*/) {
        //int myInt = 0;
        //float myFloat = 0;
        for( std::size_t i(0) ; i < invImg.size() ; i++) {
            invImg[i].move(32.f, 0.f);
            w.draw(invImg[i]);
        }
    }
private:
   const unsigned int maxTailleX;
   sf::Sprite dfault; //carré noir de 32x32 pixels
   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;
};
Titre: Re : SIGSEGV (inventaire)
Posté par: Glân de Brylan le Avril 18, 2015, 04:48:11 pm
bool del(/*std::string delName*/) {
        //je sais pas comment delete une case précise dans un vector.
        //et evidemment, je peux pas utiliser pop_back...
        return true;
    }
Alors si tu veux pouvoir supprimer des cases au milieu de ton tableau tu devrais utiliser des list (http://en.cppreference.com/w/cpp/container/list). Avec un vector, c'est impossible. Par contre, tu ne pourras plus utiliser les crochets [] pou accéder à un élément. Tu sais te servir des itérateurs ?

En fait, idéalement, tu te servirais des priority_queue pour trier tes éléments en mettant celui le plus à gauche (avec le x le plus petit) en premier, pour facilement ajouter 32 au x d'un élément que tu ajouterais.

Ensuite, plutôt que d'avoir un vector<int>, un vector<std::string> et un vector<sf::Sprite>, tu devrais avoir un seul vector d'objets de ce genre :
class InvSpace
{
    InvSpace() : number(0), name(""), image() {}
    InvSpace(int qty, const std::string& nm, const sf::Texture& texture) : number(qty), name(nm), image(texture) {}

    int number;
    std::string name;
    sf::Sprite image;
}
Ce serait plus simple. Et surtout, le C++ te permet de mettre ensemble les données qui sont liées, alors ne te gêne pas.
Comme ton inventaire a une taille limite, je te conseillerais d'avoir un simple tableau d'InvSpace de taille 16, ou à la rigueur un std::array<InvSpace, 16>. Et pour indiquer qu'une case est vide, il suffirait de faire :
myObjects[index].number = 0;
Pour indiquer que cette case est vide.
La position du sprite devrait être indiquée dans ta fonction add, ce n'est pas le rôle d'une fonction de dessin, qui devrait seulement faire :
void drawInventory(sf::RenderWindow& w)
{
    w.draw(invTextName);

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

Ensuite, ta fonction add :
bool add (int nbr, std::string str, const sf::Texture& img) // note comme je demande une texture plutôt qu'un sprite
{
    bool found = false;

    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(/* x et y du premier objet*/); // ...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(32f, 0); // ...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.
}

Si ça ne fonctionne pas...je ne sais plus quoi faire.


Enfin, met des retours à la ligne entre tes fonctions, aère ton code, ça le rend plus facile à lire. Si tu regardes le code source de la SFML tu verras qu'il met même des grandes lignes de / entre ses fonctions pour bien les séparer.
Titre: Re : SIGSEGV (inventaire)
Posté par: victorlevasseur le Avril 18, 2015, 07:04:37 pm
Citer
Alors si tu veux pouvoir supprimer des cases au milieu de ton tableau tu devrais utiliser des list. Avec un vector, c'est impossible. Par contre, tu ne pourras plus utiliser les crochets [] pou accéder à un élément. Tu sais te servir des itérateurs ?
http://www.cplusplus.com/reference/vector/vector/erase/
On peut tout à fait supprimer/insérer au milieu d'un std::vector (mais sera plus lent que sur une std::list)
Titre: Re : SIGSEGV (inventaire)
Posté par: Glân de Brylan 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.
Titre: Re : SIGSEGV (inventaire)
Posté par: S66 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
Titre: Re : SIGSEGV (inventaire)
Posté par: Glân de Brylan 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 ?
Titre: Re : SIGSEGV (inventaire)
Posté par: S66 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
Titre: Re : SIGSEGV (inventaire)
Posté par: Laurent 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.
Titre: Re : Re : SIGSEGV (inventaire)
Posté par: S66 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.
Titre: Re : [ Résolu (ou presque) ] SIGSEGV (inventaire)
Posté par: S66 le Avril 19, 2015, 01:55:17 pm
EDIT: ah non, c'était juste mes yeux qui me jouaient des tours :x
Titre: Re : [ Résolu ] SIGSEGV (inventaire)
Posté par: Glân de Brylan 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'.