Bonsoir à tous/toutes,
Je suis en plein apprentissage et prise en main de la lib SFML et pour m'exercer j'essaie de faire un petit jeu en 2D tout simple, et là je bloque sur le tile mapping, j'ai pourtant l'impression d'avoir tout bien fais ... mais rien n'y fait je reçois constamment cette erreur du debugger "Program received signal SIGSEGV" je m'en remet donc à vous
voici donc mon code et mes class :
entity.h
#ifndef ENTITY_H
#define ENTITY_H
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
using namespace std;
enum direction {DOWN,LEFT,RIGHT,UP};
const int taille_block = 32;
class entity : public Drawable
{
public:
entity(string path);
Sprite& getSprite();
entity();
protected:
private:
Texture perso;
Sprite sp_perso;
bool collision;
virtual void draw(RenderTarget& target, RenderStates states) const
{
target.draw(sp_perso, states);
}
};
#endif // ENTITY_H
entity.cpp
#include "entity.h"
entity::entity(string path)
{
perso.loadFromFile(path);
sp_perso.setTexture(perso);
}
entity::entity()
{
}
Sprite& entity:: getSprite()
{
return sp_perso;
}
Map.h
#ifndef MAP_H
#define MAP_H
#include <SFML/Graphics.hpp>
#include "entity.h"
#include <vector>
class Map : public entity
{
public:
Map();
void add_object(entity e);
vector<entity>& get_Objects();
protected:
private:
int carte[800/taille_block][400/taille_block];
vector<entity> objects;
entity carte_base;
int carte_w,carte_h,num_ofObject;
};
#endif // MAP_H
Map.cpp
#include "Map.h"
Map::Map()
{
int carte[800/taille_block][400/taille_block];
vector<entity> objects;
entity carte_base("map1.png");
carte_w = carte_base.getSprite().getTexture()->getSize().x;
carte_h = carte_base.getSprite().getTexture()->getSize().y;
num_ofObject = (carte_w/taille_block)*(carte_h/taille_block);
cout << num_ofObject << endl;
for(int i = 0; i < carte_w/taille_block; i++)
{
for(int y = 0; y < carte_h/taille_block; y++)
{
carte_base.getSprite().setTextureRect(IntRect(i*taille_block,y*taille_block,taille_block,taille_block));
objects.push_back(carte_base);
cout << "Object added sucessfully ! x : "<<i*taille_block<<" y : "<<y*taille_block<<endl;
}
}
}
void Map:: add_object(entity e)
{
//objects.push_back(e);
}
vector<entity>& Map:: get_Objects()
{
return objects;
}
Et pour finir mon main :
#include <iostream>
#include <SFML/Graphics.hpp>
#include <sstream>
#include <string>
#include "shape.h"
#include "map.h"
using namespace sf;
using namespace std;
const int window_h = 400, window_w = 800, block_size = 32;
float speed = 0.1f;
Vector2i anim(1,DOWN);
Texture perso;
Sprite sp_perso;
Event event;
Clock t1,t2,cspeed;
Time temps,tspeed;
bool update_anim = true;
void gestion_clavier();
View vue;
Font font;
Text text_fps;
ostringstream os;
RectangleShape rect2,rect;
entity joueur("image.png");
int vie = 100;
const int distance_need = 20;
int main()
{
joueur.getSprite().setPosition(0,0);
RenderWindow window(VideoMode(window_w, window_h,32), "SFML works!");
rect = DRAW_RECTANGLE(680,10,100,16);
rect2 = DRAW_RECTANGLE(680,10,100,16);
rect.setOutlineColor(Color::White);
rect.setOutlineThickness(1);
rect2.setFillColor(Color::Red);
rect.setFillColor(Color::Black);
font.loadFromFile("arial.ttf");
text_fps.setFont(font);
text_fps.setCharacterSize(10);
text_fps.setString("FPS :");
text_fps.setColor(Color::White);
text_fps.setPosition(50,50);
window.setFramerateLimit(60);
Map carte;
vector<entity> les = carte.get_Objects();
int xTest = les[4].getSprite().getTexture()->getSize().x ;
while(window.isOpen())
{
window.pollEvent(event);
switch(event.type)
//case Event::Closed: window.close();break;
t1.getElapsedTime();
gestion_clavier();
if(update_anim){
if(t1.getElapsedTime().asMilliseconds() >= 100)
{
anim.x++;
if(anim.x * block_size >= joueur.getSprite().getTexture()->getSize().x)
{
anim.x=0;
}
t1.restart();
}
}update_anim=false;
joueur.getSprite().setTextureRect(IntRect(anim.x*block_size,anim.y*block_size,block_size,block_size));
Vector2f centre(joueur.getSprite().getPosition().x + (block_size/2) - (window_w/2), joueur.getSprite().getPosition().y - (window_h/2) + (block_size/2) );
if(centre.x < 0 )centre.x=0;
if(centre.y < 0 )centre.y=0;
if(vie>=100)vie=100;
if(vie<=0)vie=0;
rect2.setSize(Vector2f(vie,16));
vue.reset(FloatRect(centre.x,centre.y,window_w,window_h));
rect2.setPosition(vue.getCenter().x+280,vue.getCenter().y-190);
rect.setPosition(vue.getCenter().x+280,vue.getCenter().y-190);
text_fps.setPosition(vue.getCenter().x-390,vue.getCenter().y-190);
window.setView(vue);
window.draw(text_fps);
window.draw(rect);
window.draw(rect2);
window.draw(joueur);
float frps = 1 / (t2.restart().asSeconds());
os << frps;
window.setTitle("FPS : "+ os.str());
text_fps.setString("FPS : "+os.str());
os.str("");
tspeed = cspeed.restart();
window.display();
window.clear();
}
}
void gestion_clavier()
{
switch(event.type)
{
case Event::KeyPressed:
switch(event.key.code)
{
case Keyboard::Up: vie++;anim.y = UP;joueur.getSprite().move(0,-speed*tspeed.asMilliseconds());update_anim=true;break;
case Keyboard::Down: vie-- ;anim.y = DOWN; joueur.getSprite().move(0,speed*tspeed.asMilliseconds());update_anim=true;break;
case Keyboard::Left: anim.y=LEFT; joueur.getSprite().move(-speed*tspeed.asMilliseconds(),0);update_anim=true;break;
case Keyboard::Right: anim.y=RIGHT; joueur.getSprite().move(speed*tspeed.asMilliseconds(),0);update_anim=true;break;
}break;
}
if(joueur.getSprite().getPosition().x <= 0 )joueur.getSprite().setPosition(0,joueur.getSprite().getPosition().y);
if(joueur.getSprite().getPosition().y <= 0 )joueur.getSprite().setPosition(joueur.getSprite().getPosition().x,0);
}
Sachant que d'après le debugger le problème viendrais de la ligne 53
int xTest = les[4].getSprite().getTexture()->getSize().x ;
Bien évidement j'ai chercher sur google et j'ai trouver que ce problème vient lorsque qu'un pointer pointe vers NULL et qu'on essaie de faire une action avec, mais je comprend toujours pas j'ai beau essayé de modifier ma méthode get_Objects rien n'y fais toujours ce problème
j'ai continuer de chercher d’où provient mon problème et apparemment ça serait dès que j'essaie d’accéder à un élément du vector "objects" que ça bloque ... je comprend vraiment pas , pourtant j'ai bien ajouté des Sprites à mon vector
Merci d'avance pour votre temps et vos réponses.