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