1
Système / [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.
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
#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