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

Auteur Sujet: Program received signal SIGSEGV  (Lu 1047 fois)

0 Membres et 1 Invité sur ce sujet

Kopplex

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Program received signal SIGSEGV
« le: Janvier 27, 2016, 05:00:03 pm »
Bonsoir à tous/toutes,

Je suis en plein apprentissage et prise en main de la lib SFML et pour m'exercer j'essaie de faire un petit jeu en 2D tout simple, et là je bloque sur le tile mapping, j'ai pourtant l'impression d'avoir tout bien fais ... mais rien n'y fait je reçois constamment cette erreur du debugger "Program received signal SIGSEGV" je m'en remet donc à vous  ::) voici donc mon code et mes class :

entity.h

   
#ifndef ENTITY_H
#define ENTITY_H
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
using namespace std;
enum direction {DOWN,LEFT,RIGHT,UP};
const int taille_block = 32;
class entity : public Drawable
{
    public:
        entity(string path);
        Sprite& getSprite();
        entity();
    protected:
    private:
        Texture perso;
        Sprite sp_perso;
        bool collision;
 
        virtual void draw(RenderTarget& target, RenderStates states) const
    {
        target.draw(sp_perso, states);
 
    }
 
};

#endif // ENTITY_H


entity.cpp

   
#include "entity.h"
 
entity::entity(string path)
{
 
    perso.loadFromFile(path);
    sp_perso.setTexture(perso);
 
}
entity::entity()
{
 
 
 
}
 
Sprite& entity:: getSprite()
{
    return sp_perso;
}
 
Map.h
   
#ifndef MAP_H
#define MAP_H
#include <SFML/Graphics.hpp>
#include "entity.h"
#include <vector>
 
class Map : public entity
{
    public:
        Map();
       void add_object(entity e);
       vector<entity>& get_Objects();
    protected:
    private:
        int carte[800/taille_block][400/taille_block];
        vector<entity> objects;
        entity carte_base;
        int carte_w,carte_h,num_ofObject;
 
};
 
#endif // MAP_H

Map.cpp

   
#include "Map.h"
 
Map::Map()
{
 
int carte[800/taille_block][400/taille_block];
vector<entity> objects;
entity carte_base("map1.png");
 
 
carte_w = carte_base.getSprite().getTexture()->getSize().x;
carte_h = carte_base.getSprite().getTexture()->getSize().y;
 
num_ofObject = (carte_w/taille_block)*(carte_h/taille_block);
cout << num_ofObject << endl;
 
for(int i = 0; i < carte_w/taille_block; i++)
{
  for(int y = 0; y < carte_h/taille_block; y++)
{
carte_base.getSprite().setTextureRect(IntRect(i*taille_block,y*taille_block,taille_block,taille_block));
objects.push_back(carte_base);
cout << "Object added sucessfully ! x : "<<i*taille_block<<" y : "<<y*taille_block<<endl;
 
}
}
 
 
 
}
 
void Map:: add_object(entity e)
{
 
//objects.push_back(e);
 
 
}
vector<entity>& Map:: get_Objects()
{
    return objects;
}

Et pour finir mon main :
       
#include <iostream>
#include <SFML/Graphics.hpp>
#include <sstream>
#include <string>
#include "shape.h"
#include "map.h"
using namespace sf;
using namespace std;
const int window_h = 400, window_w = 800, block_size = 32;
float speed = 0.1f;
Vector2i anim(1,DOWN);
Texture perso;
Sprite sp_perso;
Event event;
Clock t1,t2,cspeed;
Time temps,tspeed;
bool update_anim = true;
void gestion_clavier();
View vue;
Font font;
Text text_fps;
ostringstream os;
RectangleShape rect2,rect;
entity joueur("image.png");
int vie = 100;
const int distance_need = 20;
 
 
int main()
{
    joueur.getSprite().setPosition(0,0);
 
 
    RenderWindow window(VideoMode(window_w, window_h,32), "SFML works!");
    rect = DRAW_RECTANGLE(680,10,100,16);
    rect2 = DRAW_RECTANGLE(680,10,100,16);
    rect.setOutlineColor(Color::White);
    rect.setOutlineThickness(1);
    rect2.setFillColor(Color::Red);
    rect.setFillColor(Color::Black);
 
    font.loadFromFile("arial.ttf");
    text_fps.setFont(font);
    text_fps.setCharacterSize(10);
    text_fps.setString("FPS :");
    text_fps.setColor(Color::White);
    text_fps.setPosition(50,50);
    window.setFramerateLimit(60);
 
    Map carte;
 
    vector<entity> les = carte.get_Objects();
   int xTest = les[4].getSprite().getTexture()->getSize().x ;
 
 
    while(window.isOpen())
    {
        window.pollEvent(event);
 
       switch(event.type)
     //case Event::Closed: window.close();break;
 
        t1.getElapsedTime();
        gestion_clavier();
 
 
 
if(update_anim){
    if(t1.getElapsedTime().asMilliseconds() >= 100)
{
        anim.x++;
        if(anim.x * block_size >= joueur.getSprite().getTexture()->getSize().x)
        {
            anim.x=0;
        }
t1.restart();
}
}update_anim=false;
 
       joueur.getSprite().setTextureRect(IntRect(anim.x*block_size,anim.y*block_size,block_size,block_size));
 
    Vector2f centre(joueur.getSprite().getPosition().x + (block_size/2) - (window_w/2), joueur.getSprite().getPosition().y - (window_h/2) + (block_size/2) );
 
 
        if(centre.x < 0 )centre.x=0;
        if(centre.y < 0 )centre.y=0;
 
        if(vie>=100)vie=100;
        if(vie<=0)vie=0;
        rect2.setSize(Vector2f(vie,16));
 
        vue.reset(FloatRect(centre.x,centre.y,window_w,window_h));
        rect2.setPosition(vue.getCenter().x+280,vue.getCenter().y-190);
        rect.setPosition(vue.getCenter().x+280,vue.getCenter().y-190);
        text_fps.setPosition(vue.getCenter().x-390,vue.getCenter().y-190);
 
 
        window.setView(vue);
        window.draw(text_fps);
        window.draw(rect);
        window.draw(rect2);
        window.draw(joueur);
 
       float frps = 1 / (t2.restart().asSeconds());
        os << frps;
        window.setTitle("FPS : "+ os.str());
        text_fps.setString("FPS : "+os.str());
        os.str("");
        tspeed = cspeed.restart();
 
 
 
        window.display();
        window.clear();
 
    }
 
 
 
 
}
void gestion_clavier()
{
 
  switch(event.type)
        {
        case Event::KeyPressed:
            switch(event.key.code)
            {
            case Keyboard::Up: vie++;anim.y = UP;joueur.getSprite().move(0,-speed*tspeed.asMilliseconds());update_anim=true;break;
            case Keyboard::Down: vie-- ;anim.y = DOWN; joueur.getSprite().move(0,speed*tspeed.asMilliseconds());update_anim=true;break;
            case Keyboard::Left: anim.y=LEFT; joueur.getSprite().move(-speed*tspeed.asMilliseconds(),0);update_anim=true;break;
            case Keyboard::Right: anim.y=RIGHT; joueur.getSprite().move(speed*tspeed.asMilliseconds(),0);update_anim=true;break;
 
                }break;
        }
    if(joueur.getSprite().getPosition().x <= 0 )joueur.getSprite().setPosition(0,joueur.getSprite().getPosition().y);
    if(joueur.getSprite().getPosition().y <= 0 )joueur.getSprite().setPosition(joueur.getSprite().getPosition().x,0);
}

Sachant que d'après le debugger le problème viendrais de la ligne 53

   
int xTest = les[4].getSprite().getTexture()->getSize().x ;

Bien évidement j'ai chercher sur google et j'ai trouver que ce problème vient lorsque qu'un pointer pointe vers NULL et qu'on essaie de faire une action avec, mais je comprend toujours pas j'ai beau essayé de modifier ma méthode get_Objects rien n'y fais toujours ce problème :(

j'ai continuer de chercher d’où provient mon problème et apparemment ça serait dès que j'essaie d’accéder à un élément du vector "objects" que ça bloque ... je comprend vraiment pas , pourtant j'ai bien ajouté des Sprites à mon vector

Merci d'avance pour votre temps et vos réponses.

Kokyett

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Program received signal SIGSEGV
« Réponse #1 le: Janvier 27, 2016, 05:43:04 pm »
J'essaie aussi d'apprendre à utiliser la SFML.

Je modifie ma précédente réponse. Je suis sur mon téléphone et lire le code c'est pas facile mais je pense avoir trouvé.

Map::Map()
{
 
int carte[800/taille_block][400/taille_block];
vector<entity> objects;
entity carte_base("map1.png");
 

Tu crées la variable objets dans le constructeur alors qu'il existe une propriété objects dans cette classe. Le constructeur "charge" la variable et non la propriété. Supprime donc la variable du constructeur.
« Modifié: Janvier 27, 2016, 06:48:40 pm par Kokyett »

Kopplex

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Program received signal SIGSEGV
« Réponse #2 le: Janvier 27, 2016, 08:57:41 pm »
Salut Kokyett !
Merci infiniment c'était bel et bien la déclaration de la variable dans le constructeur qui posais problème  :D !
mais maintenant je me retrouve avec mes sprite tout blancs comme si il était sans Texture  :o

Kokyett

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Program received signal SIGSEGV
« Réponse #3 le: Janvier 27, 2016, 09:40:02 pm »
Les sprites je connais pas encore. Si tout est blanc, je me dis que le programme ne trouve pas l'image. Essaie de mettre le chemin de l'image au complet. Si ça marche, c'est qu'il trouve pas l'image dans le dossier à partir duquel tu lances ton application.

Kokyett

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
Re : Program received signal SIGSEGV
« Réponse #4 le: Janvier 28, 2016, 06:41:38 am »
Je peux me planter car encore une fois je connais pas bien les sprites et, le c/c++, ça fait longtemps que j'ai pas utilusé. De plus je n'ai pas de PC sous la main, je ne peux pas vérifier ce que je dis.

Map.cpp
   
#include "Map.h"
 
Map::Map()
{
 
int carte[800/taille_block][400/taille_block];
vector<entity> objects;
entity carte_base("map1.png");
 
 
carte_w = carte_base.getSprite().getTexture()->getSize().x;
carte_h = carte_base.getSprite().getTexture()->getSize().y;
 
num_ofObject = (carte_w/taille_block)*(carte_h/taille_block);
cout << num_ofObject << endl;
 
for(int i = 0; i < carte_w/taille_block; i++)
{
  for(int y = 0; y < carte_h/taille_block; y++)
{
carte_base.getSprite().setTextureRect(IntRect(i*taille_block,y*taille_block,taille_block,taille_block));
objects.push_back(carte_base);
cout << "Object added sucessfully ! x : "<<i*taille_block<<" y : "<<y*taille_block<<endl;
 
}
}

}
 

En regardant mieux, a quoi sert la ligne
objects.push_back(carte_base);
objects contient plusieurs éléments mais ils sont tous identiques.

Juste avant le push_back tu fais
carte_base.getSprite()...
Cette méthode te retourne toujours le même sprite : sp_perso de la classe entity. Donc tu modifies toujours sp_perso qui contient toujours le dernier sprite de ton fichier texture à la fin de ton traitement.
« Modifié: Janvier 28, 2016, 06:47:45 am par Kokyett »

Kopplex

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Program received signal SIGSEGV
« Réponse #5 le: Janvier 28, 2016, 06:53:48 pm »
Salut, en fait j'ai résolue le problème et je suis parvenue au résultat désiré, le problème venait de ma class entity que j'ai due supprimer vue qu’elle ralentit mon programme et en plus de ça elle ne sert pas à grand chose étant donné que les Sprite sont déjà en quelque sorte des entités, merci encore de ton aide  :)