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

Auteur Sujet: [Sfml 2.0] Segmentation Fault  (Lu 2325 fois)

0 Membres et 1 Invité sur ce sujet

timiway

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
    • http://orbit-trip.site40.net/
    • E-mail
[Sfml 2.0] Segmentation Fault
« le: Février 24, 2013, 12:24:13 am »
Bonsoir à tous.

Je ne sais pas si l'erreur vient de SFML ou pas...
En tout cas, elle me pose vraiment problème, je cherche je cherche mais je ne trouve rien qui pourait être la cause de l'erreur.
J'arrive à compiler, mais le programme crash au lancement...


Désolé pour tout ce Code mais vu que tout à l'air concerné par l'erreur, j'ai préféré tout vous montrer l'erreur se situerait dans la fonction Objet::Draw

// main.cpp

using namespace sf;

int main()
{
    RenderWindow window(VideoMode(800, 600), "Test");

    FileManager::Get().addTexture("res/logo.png");

    Objet image;
    image.SetFond(FileManager::Get().getTexture("res/logo.png"),1);
    image.SetFond(Color(255,255,155));
    image.Center(true);

    Page page;
    page.SetFond(Color(255,155,255),Color(205,145,5),3);
    page.newObjet(image);

    while (window.isOpen())
    {
        Event event;
        while (window.pollEvent(event))
        {
            if (event.type == Event::Closed)
                window.close();

            if (event.type == Event::Resized)
            {
                window.setView(View(sf::FloatRect(0, 0, event.size.width, event.size.height)));
            }
        }

        page.Draw(&window);

        window.display();
    }

    return EXIT_SUCCESS;
}
 
//Objet.h
class Objet
{
    public:
        Objet();
        Objet(sf::Vector2f Taille,sf::Vector2f Position);
        void update();
        void SetFond(sf::Color Couleur);
        void SetFond(sf::Color Couleur1,sf::Color Couleur2, int Dir); // dir=0 vert dir=1 horiz dir=2 diag1 dir=3 diag2
        void SetFond(sf::Texture* Texture, bool repet); // true répeté false étiré
        void SetTaille(sf::Vector2f Taille);
        void SetPosition(sf::Vector2f Position);
        void SetScale(sf::Vector2f Scale);
        void SetScale(float Scale);
        void Center(bool center);
        void Draw(sf::RenderWindow *window);

    protected:

        sf::Vector2f m_Taille;
        sf::Vector2f m_Position;
        sf::Vector2f m_Scale;
        sf::VertexArray m_Fond;
        sf::Texture *m_ImageFond;
        bool m_Center;
        bool m_IsImageFond;

    private:
};
//Objet.cpp
#include "../include/Objet.h"

using namespace sf;

Objet::Objet():m_Taille(100,100),m_Position(0,0),m_Scale(1,1), m_Center(false), m_IsImageFond(false)
{
    m_Fond=VertexArray(sf::TrianglesFan, 4);
    update();
}

Objet::Objet(sf::Vector2f Taille,sf::Vector2f Position):m_Taille(Taille),m_Position(Position),m_Scale(1,1), m_Center(false), m_IsImageFond(false)
{
    m_Fond=VertexArray(sf::TrianglesFan, 4);
    update();
}

void Objet::SetFond(sf::Color Couleur)
{
    m_Fond[0].color = Couleur;
    m_Fond[1].color = Couleur;
    m_Fond[2].color = Couleur;
    m_Fond[3].color = Couleur;
}

void Objet::SetFond(sf::Color Couleur1,sf::Color Couleur2, int Dir) // dir=0 vert dir=1 horiz dir=2 diag1 dir=3 diag2
{
    switch(Dir)
    {
        case 0:{
            m_Fond[0].color = Couleur1;
            m_Fond[1].color = Couleur2;
            m_Fond[2].color = Couleur2;
            m_Fond[3].color = Couleur1;
        }break;
        case 1:{
            m_Fond[0].color = Couleur1;
            m_Fond[1].color = Couleur1;
            m_Fond[2].color = Couleur2;
            m_Fond[3].color = Couleur2;
        }break;
        case 2:{
            m_Fond[0].color = Couleur1;
            m_Fond[1].color = ColorMix(Couleur1,Couleur2);
            m_Fond[2].color = Couleur2;
            m_Fond[3].color = ColorMix(Couleur1,Couleur2);
        }break;
        case 3:{
            m_Fond[0].color = ColorMix(Couleur1,Couleur2);
            m_Fond[1].color = Couleur1;
            m_Fond[2].color = ColorMix(Couleur1,Couleur2);
            m_Fond[3].color = Couleur2;
        }break;
        default:{
            m_Fond[0].color = ColorMix(Couleur1,Couleur2);
            m_Fond[1].color = ColorMix(Couleur1,Couleur2);
            m_Fond[2].color = ColorMix(Couleur1,Couleur2);
            m_Fond[3].color = ColorMix(Couleur1,Couleur2);
        }break;
    }
}

void Objet::SetFond(Texture* Texture, bool repet)
{
    Image img;
    m_ImageFond=Texture;
    m_IsImageFond=true;


}

void Objet::SetTaille(sf::Vector2f Taille)
{
    m_Taille=Taille;
    update();
}

void Objet::SetPosition(sf::Vector2f Position)
{
    m_Position=Position;
    update();
}

void Objet::SetScale(sf::Vector2f Scale)
{
    if(Scale.x >0.000001 || Scale.x < -0.000001 || Scale.y >0.000001 || Scale.y <-0.000001)
    m_Scale=Scale;
}

void Objet::SetScale(float Scale)
{
    if(Scale >0.000001 || Scale < -0.000001)
    m_Scale=Vector2f(Scale,Scale);
}

void Objet::Center(bool center)
{
    m_Center=center;
}

void Objet::Draw(RenderWindow *window)
{
    if(m_IsImageFond)
    SetTaille(Vector2f(m_ImageFond->getSize()));

    SetTaille(Vector2f(m_Taille.x*m_Scale.x,m_Taille.y*m_Scale.y));

    if(m_Center)
    SetPosition(Vector2f(window->getView().getSize().x/2-m_Taille.x/2+m_Position.x,window->getView().getSize().y/2-m_Taille.y/2+m_Position.y));

    if(m_IsImageFond)
    window->draw(m_Fond, m_ImageFond);
    else
    window->draw(m_Fond);

    if(m_Center)
    SetPosition(Vector2f(-(window->getView().getSize().x/2-m_Taille.x/2)+m_Position.x,-(window->getView().getSize().y/2-m_Taille.y/2)+m_Position.y));

    SetTaille(Vector2f(m_Taille.x/m_Scale.x,m_Taille.y/m_Scale.y));
}

void Objet::update()
{
    m_Fond[0].position = Vector2f(m_Position.x, m_Position.y);
    m_Fond[1].position = Vector2f(m_Position.x+m_Taille.x, m_Position.y);
    m_Fond[2].position = Vector2f(m_Position.x+m_Taille.x, m_Position.y+m_Taille.y);
    m_Fond[3].position = Vector2f(m_Position.x, m_Position.y+m_Taille.y);

    if(m_IsImageFond)
    {
        m_Fond[0].texCoords= Vector2f(0,0);
        m_Fond[1].texCoords= Vector2f(m_ImageFond->getSize().x,0);
        m_Fond[2].texCoords= Vector2f(m_ImageFond->getSize().x,m_ImageFond->getSize().y);
        m_Fond[3].texCoords= Vector2f(0,m_ImageFond->getSize().y);
    }
}

 
//Page.h
class Page : public Objet
{
    public:
        Page();

        void newObjet(Objet obj);
        void lraw(sf::RenderWindow *window);
    protected:
    private:
        std::vector< Objet > m_Objets;

};
// page.cpp

using namespace sf;
using namespace std;

Page::Page():Objet()
{

}

void Page::newObjet(Objet obj)
{
    m_Objets.push_back(obj);
}

void Page::Draw(RenderWindow *window)
{
    Draw(window);
    if(m_Objets.size()!=0)
    {
        for(int i(0);i<=m_Objets.size();i++)
        {
            m_Objets[i].Objet::Draw(window);
        }
    }
}
 

Merci d'avance, votre aide serait vraiment indispensable, je ne trouve vraiment pas

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Sfml 2.0] Segmentation Fault
« Réponse #1 le: Février 24, 2013, 12:50:12 am »
Utilise le debugger, ça sert à ça. On ne va pas essayer de trouver un bug parmi tant de lignes de code alors qu'il peut te dire précisément où ça crashe en 2 secondes ;)
Laurent Gomila - SFML developer

timiway

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
    • http://orbit-trip.site40.net/
    • E-mail
Re : [Sfml 2.0] Segmentation Fault
« Réponse #2 le: Février 24, 2013, 12:05:28 pm »
Merci pour ta réponse.

J'ai déjà utilisé le debugger, il me dit que c'est lors de l'appel de la fonction Draw de ma class Page dans mon main, plus précisément lors de l'emploi de Objet::Draw dans cette fonction. Et c'est toujours la première ligne de Objet Draw qui crash, lors de l'appel de variable ou fonctions membre. Cette fonction Objet::Draw fonctionne parfaitement dans d'autres conditions. ..

++ et merci d'avance

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Sfml 2.0] Segmentation Fault
« Réponse #3 le: Février 24, 2013, 12:08:38 pm »
Citer
void Page::Draw(RenderWindow *window)
{
    Draw(window);
    ...
}
Ca c'est une récusion infinie. Je ne sais pas ce que tu voulais faire avec ce code, mais à part provoquer un crash, ça ne fera rien de bon ;)
Laurent Gomila - SFML developer

timiway

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
    • http://orbit-trip.site40.net/
    • E-mail
Re : [Sfml 2.0] Segmentation Fault
« Réponse #4 le: Février 24, 2013, 06:11:04 pm »
désolé, j'ai mal recopié,

c'est

void Page::Draw(RenderWindow *window)
{
    Objet::Draw(window);
    ...
}

timiway

  • Newbie
  • *
  • Messages: 19
    • Voir le profil
    • http://orbit-trip.site40.net/
    • E-mail
Re : [Sfml 2.0] Segmentation Fault
« Réponse #5 le: Février 24, 2013, 06:38:19 pm »
Problème réglé, la boucle était mal paramétrée... désolé  :-\

Merci pour ta réactivité!
PS: La 2.0 est vraiment bien merci beaucoup ^^