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

Auteur Sujet: [Resolu] Seg Fault [Resolu]  (Lu 2588 fois)

0 Membres et 1 Invité sur ce sujet

Geeque

  • Newbie
  • *
  • Messages: 13
    • Voir le profil
[Resolu] Seg Fault [Resolu]
« le: Juin 11, 2016, 10:28:41 am »
Bonjour,
je code actuellement un projet de type Mario 2D et après avoir fait mon premier ennemi, j'ai voulu en créer plusieurs à l'aide d'un vector, cependant lors de la compilation tout marche , c'est lors de l'execution que j'ai un seg fault.  Ne sachant pas d'ou viens l'erreur, je vous poste la classe complete et espere que vous pourrais m'aider.
#ifndef APPLICATION_HPP
#define APPLICATION_HPP

#include <iostream>
#include <fstream>
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include "map.hpp"
#include "personnage.hpp"
#include "ennemi.hpp"

class Application
{
        // Graphique
        sf::RenderWindow                _window;
       
        sf::Texture                             _background;
        sf::Sprite                              _spriteBackground;
       
        sf::FloatRect                   _headboxPerso;
        sf::FloatRect                   _headboxEnnemi;
       
        sf::RectangleShape              _rectangle[19][25];
        sf::FloatRect                   _headboxRect;
       
        // Logique
        TileMap                                 _map;
        Personnage                              _perso;
        vector<Ennemi*>                 _ennemi;
       
        int                                     nbEnnemi = 5;
       
        sf::Font                                _Font;
        sf::Text                                _text;
        bool                                    GameOver=false;
        bool                                    afficherCol=false; // Permet d'afficher ou non les collisions avec la Map (mode test)

        sf::Music                               _music;
       
public:
        Application():
        _window(sf::VideoMode(800, 600), sf::String(L"Projet Mario"))
        {
                for(int i=0;i<nbEnnemi;i++){
                        Ennemi* nouvEnne=new Ennemi();
                        _ennemi[i]=nouvEnne;
                }
               
                if(!_background.loadFromFile("./src/graphics/background.png"))
                        cout << ">> Erreur lors du chargement background.jpg"<<endl;
                _spriteBackground.setTexture(_background);
               
                if(_Font.loadFromFile("./src/polices/policeMario.ttf")==false)
                        cout<<">> Erreur chargement emulogic.ttf"<<endl;
                _text.setFont(_Font);
                _text.setCharacterSize(32);
               
                if (!_music.openFromFile("./src/audio/Music.ogg"))
                        cout<<"Erreur au chargement de music.ogg"<<endl;
                _music.play();
                _music.setLoop(true);

                int level_string[19][25] = { 0 };
                int level[19][25] = { 0 };

                fstream fichier("./src/graphics/map.txt");
                if (!fichier)
                        cout << "niveau inexistant" << endl;
                else
                {
                        int y = 0;
                        string ligne;
                        while (!fichier.eof())
                        {
                                getline(fichier, ligne); // On recupere une ligne dans le fichier sous la forme d'une string
                                for (int x = 0; x<(signed)ligne.length(); x++)
                                {
                                        //ligne[i] renvoit le caractère placer a la i ème position.
                                        level_string[y][x] = ligne[x];
                                }
                                y++;
                        }
                }
                for (int y = 0; y < 19; y++) {
                        for (int x = 0; x < 25; x++) {

                                switch (level_string[y][x]) {
                                case 'X':
                                        _rectangle[y][x].setSize(sf::Vector2f(32,32));
                                        _rectangle[y][x].setPosition(x*32,y*32);
                                        level[y][x] = 0;
                                        break;
                                case 'P':
                                        _rectangle[y][x].setSize((sf::Vector2f(32,32)));
                                        _rectangle[y][x].setPosition(x*32,y*32);
                                        level[y][x] = 2;
                                        break;
                                default :
                                        level[y][x] = 30;
                                }
                        }
                }
                               
                // on crée la tilemap avec le niveau précédemment défini
                if (!_map.load("./src/graphics/tileset.png", sf::Vector2u(32, 32), level, 25, 19))
                        cout<<"erreur chargement tileset"<<endl;
        }

        void run()
        {
                sf::Clock clock;
                while (_window.isOpen())
                {
                        processEvents();
                        update();
                        render();      
                }
        }

protected:
        // Boucle événementielle
        void processEvents()
        {
                sf::Event event;
                while (_window.pollEvent(event))
                {
                        if (event.type == (sf::Event::Closed) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)))
                                _window.close();                       
                }
        }

        void update()
        {
                _headboxPerso=_perso.Headbox();
               
                for(int i=0;i<nbEnnemi;i++){
                        _headboxEnnemi=_ennemi[i]->Headbox();
               
                        for(int y=0;y<19;y++){
                                for(int x=0;x<25;x++){
                                        _headboxRect=_rectangle[y][x].getGlobalBounds();
                                        if(_headboxPerso.intersects(_headboxRect)){
                                                if(afficherCol)
                                                        _rectangle[y][x].setFillColor(sf::Color(0,255,0,128)); // Filtre si le personnage rentre en collision
                                                if(_headboxRect.top<_perso.PosY())
                                                                        _perso.setPos(0,1);
                                                                else
                                                                        _perso.setPos(0,0);                            
                                                }
                                        else
                                        {
                                                if(afficherCol)
                                                        _rectangle[y][x].setFillColor(sf::Color(255, 0, 0,128)); // Filtre par defaut
                                                else
                                                        _rectangle[y][x].setFillColor(sf::Color(193, 154, 107,128)); // Filtre par defaut
                                        }
                                        if(_headboxEnnemi.intersects(_headboxRect)){
                                                if(afficherCol)
                                                        _rectangle[y][x].setFillColor(sf::Color(0,0,255,128));
                                                if(_headboxRect.top<_headboxEnnemi.top)
                                                                        _ennemi[i]->setPos(0,1);
                                                                else
                                                                        _ennemi[i]->setPos(0,0);
                                        }
                                }
                        }
                }
        }


        void render()
        {              
                _window.clear();
               
                _window.draw(_spriteBackground);
                _map.draw(_window);

                _perso.update();
                for(int i=0;i<nbEnnemi;i++)
                        _ennemi[i]->update();

                for(int i=0;i<nbEnnemi;i++){
                        _headboxEnnemi.width=_ennemi[i]->Headbox().width-10;
                        if(_headboxPerso.intersects(_headboxEnnemi)){
                                if((_headboxPerso.top<=_headboxEnnemi.top-10) and ( _headboxEnnemi.left<=_headboxPerso.left+20 or _headboxEnnemi.left>_headboxPerso.left )){
                                        for (int i = 0; i < 800; ++i){
                                                _ennemi[i]->move(0,0.2);
                                                sf::sleep(sf::milliseconds(0.01));
                                                _ennemi[i]->setColor();
                                        }
                                }
                                else{
                                        GameOver=true;
                                }
                        }

                        _headboxEnnemi.height=_ennemi[i]->Headbox().height+32;
                        if(_headboxPerso.intersects(_headboxEnnemi) and (_headboxEnnemi.left<=_headboxPerso.left+20 or _headboxEnnemi.left+20>_headboxPerso.left)){
                                if(_headboxPerso.top>=_headboxEnnemi.top){
                                        for (int i = 0; i < 800; ++i){
                                                _ennemi[i]->move(0,0.2);
                                                sf::sleep(sf::milliseconds(0.01));
                                                _ennemi[i]->setColor();
                                        }
                                }
                        }
               
                        _headboxEnnemi.height=_ennemi[i]->Headbox().height;
                        _headboxEnnemi.width=_ennemi[i]->Headbox().width;
                }
               
                if(_perso.PosY()>=700){ // 700 car il y a le saut de rattrapage
                        GameOver=true;
                } // teste si le joueur tombe en dessous du sol
               
                for(int i=0;i<nbEnnemi;i++)
                        if(_ennemi[i]->PosY()>=600){
                                _ennemi[i]->setPos(1,0);
                        }
               
                for(int i=0;i<nbEnnemi;i++)
                        if(_ennemi[i]->Color()==sf::Color(0,0,0,0)){
                                _ennemi[i]->setPos(1,1);
                        }
               
                if(GameOver){
                        _music.stop();
                        _text.setString("Game Over");
                        _text.setPosition(800/2-_text.getGlobalBounds().width/2,600/2-_text.getGlobalBounds().height/2);
                }else{
                        _perso.draw(_window);
                        for(int i=0;i<nbEnnemi;i++)
                                _ennemi[i]->draw(_window);
                }
               
                for(int y=0;y<19;y++){
                        for(int x=0;x<25;x++){
                                _window.draw(_rectangle[y][x]); // Visualiser les collisions avec le systeme de filtre
                        }
                }
        _window.draw(_text);
        _window.display();
        }
};

#endif
 
« Modifié: Juin 12, 2016, 06:13:04 pm par Geeque »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Seg Fault
« Réponse #1 le: Juin 11, 2016, 04:44:32 pm »
Utilise plutôt un debugger, ça sert à ça.
Laurent Gomila - SFML developer

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : Seg Fault
« Réponse #2 le: Juin 12, 2016, 01:51:00 am »
Bonjour à première vue (et en étant pas frais) le soucis survient lors de ton allocation dynamique.
for(int i=0;i<nbEnnemi;i++){
            Ennemi* nouvEnne=new Ennemi();
            _ennemi[i]=nouvEnne;
}
 
Ton pointeur est directement détruit à chaque itération de boucle il faudrait procéder ainsi
for(int i(0); i < nbEnnemi; i++)
           _ennemi[i] = new Ennemi();
 

Ici on alloue la mémoire directement sur un espace qui sera pas réalloué à la ram en fin de boucle. (si tout ça ne te semble pas clair regarde un cours sur la portée de variables)

En espérant t'avoir aidé je te souhaite une bonne continuation.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Seg Fault
« Réponse #3 le: Juin 12, 2016, 11:18:25 am »
Citer
Ton pointeur est directement détruit à chaque itération de boucle
C'est gentil d'aider, mais si c'est pour dire des bêtises pareilles... Reviens quand tu seras un peu plus frais :P
Laurent Gomila - SFML developer

Bilt

  • Newbie
  • *
  • Messages: 48
    • Voir le profil
Re : [Resolu] Seg Fault [Resolu]
« Réponse #4 le: Juin 12, 2016, 09:08:25 pm »
Un petit :
for(int i(0); i < nbEnnemi; i++)
           _ennemi.push_back(new Ennemi());
 

Devrait règler entièrement le problème  ;D