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
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.
Un petit :
for(int i(0); i < nbEnnemi; i++)
_ennemi.push_back(new Ennemi());
Devrait règler entièrement le problème ;D