Regarde mon 1er post pour les sf::Sprite, la dans le dernier j'ai juste mis ce que j'ai modifié.
Ensuite j'ai mis decor_monde.push_back(Entite_Static(200));
car le tri se fait pas rapport au y (donc je reporte le 200 ici du 1er ajout_entite) et je ne vois pas comment remplir le vector sans cette façon (cela fait que 5 mois que j'ai commencé à aprendre le c++ donc je suis loin de connaitre la meileur façon de faire)
Je ne voyais pas comment faire autrement pour trier le vector avec std:sort, à moins qu'il y ai une methode plus simple.
sinon voici le code un peu plus complet :
Entite_statuc.h
class Entite_static
{
private :
sf::Texture tree_texture, tree2_texture, tree3_texture;
sf::Sprite sprite_tree, sprite_tree2, sprite_tree3;
//Tableau qui va retourner toutes les valeurs des box des Entite_Static
sf::FloatRect rect_decor[NB_DECOR];
float top;
public :
Entite_static(int y);//Constructeur
int value;
~Entite_static();//Destructeur
void ajout_entite(unsigned char id, int x, int y);//Ajout entite
void afficher_decor(sf::RenderTarget &target);//Affichage de l'entité
std::vector<sf::FloatRect> decor_box();//Retour des valeurs de la box de l'entite pour collision
};
struct TriAscendant
{
inline bool operator() (const Entite_static & a, const Entite_static & b) const
{
return a.value <= b.value;
}
};
Entite_static.cpp
Entite_static::Entite_static(int y) : value(y)
{
for(int i = 0; i < NB_DECOR; i++)
{
rect_decor[i].left = 0;
rect_decor[i].top = 0;
rect_decor[i].width = 0;
rect_decor[i].height = 0;
}
}
Entite_static::~Entite_static()
{
}
void Entite_static::ajout_entite(unsigned char id, int x, int y)
{
if(id == 0)
{
tree_texture.loadFromFile("sprites/environnements/tree_barrens/tree_450_500.png");
sprite_tree.setTexture(tree_texture);
}
if(id == 1)
{
tree2_texture.loadFromFile("sprites/environnements/tree_barrens/tree2_450_500.png");
sprite_tree2.setTexture(tree2_texture);
}
if(id == 2)
{
tree_texture.loadFromFile("sprites/environnements/tree_barrens/tree3_700_500.png");
sprite_tree3.setTexture(tree_texture);
}
//Positions des Entite_static
sprite_tree.setPosition(x, y);
sprite_tree2.setPosition(x, y);
sprite_tree3.setPosition(x, y);
//Recuperation box tree
rect_decor[0] = sprite_tree.getGlobalBounds();
//Ajustement box tree
rect_decor[0].left = rect_decor[0].left + 113;
rect_decor[0].top = rect_decor[0].top + 380;
rect_decor[0].width = 226;
rect_decor[0].height = 72;
//Recuperation box tree2
rect_decor[1] = sprite_tree2.getGlobalBounds();
//Ajustement box tree2
rect_decor[1].left = rect_decor[1].left + 250;
rect_decor[1].top = rect_decor[1].top + 400;
rect_decor[1].width = 150;
rect_decor[1].height = 72;
//Recuperation box tree3
rect_decor[2] = sprite_tree3.getGlobalBounds();
//Ajustement box tree3
rect_decor[2].left = rect_decor[2].left + 280;
rect_decor[2].top = rect_decor[2].top + 460;
rect_decor[2].width = 140;
rect_decor[2].height = 72;
}
void Entite_static::afficher_decor(sf::RenderTarget &target)
{
target.draw(sprite_tree);
target.draw(sprite_tree2);
target.draw(sprite_tree3);
}
std::vector<sf::FloatRect> Entite_static::decor_box()
{
std::vector<sf::FloatRect> return_rect_decor;
for(int i = 0; i < NB_DECOR; i++)
return_rect_decor.push_back(rect_decor[i]);
return return_rect_decor;
}
Map.h
#ifndef MAP_H_INCLUDED
#define MAP_H_INCLUDED
#include "Entites.h"
#include "Constantes.h"
#include <algorithm>
class Map
{
private :
sf::Texture map_monde1;
sf::Sprite sprite_map_monde1;
//Creation des entites
std::vector<Entite_static> decor_monde1;
std::vector<sf::FloatRect> copy_rect_decor;
public :
Map();
~Map();
void monde1(); //Chargement map et entite monde1
void afficher_map(sf::RenderTarget &target, unsigned char monde);//Affichage de la map
void afficher_decor(sf::RenderTarget &target, unsigned char monde);//Affichage du decor
std::vector<sf::FloatRect> tableau_decor_box();//Retour des valeurs des box entite
};
#endif // MAP_H_INCLUDED
et pour finir Map.cpp
#include "Map.h"
Map::Map() : copy_rect_decor(0)
{
}
Map::~Map()
{
}
void Map::monde1()
{
//Chargement monde1
map_monde1.loadFromFile("maps/map1.png");
sprite_map_monde1.setTexture(map_monde1);
sprite_map_monde1.setPosition(-1400, -700);
/*
Chargement du decor
*/
//La valeur correspond à la position en Y de l'entite ajoutée
decor_monde1.push_back(Entite_static(200));
decor_monde1.push_back(Entite_static(0));
decor_monde1.push_back(Entite_static(0));
decor_monde1.push_back(Entite_static(-110));
decor_monde1.push_back(Entite_static(300));
//ajout_entite(id_du_decor, position_en_x, position_en_y)
//TREE
decor_monde1[0].ajout_entite(0, 200, 200);
decor_monde1[1].ajout_entite(0, 200, 0);
//TREE2
decor_monde1[2].ajout_entite(1, 500, 0);
decor_monde1[3].ajout_entite(1, 1000, -110);
//TREE3
decor_monde1[4].ajout_entite(2, 800, 300);
/*
Dans le tableau decor_box()[i]
i = id du décor ajouté
*/
copy_rect_decor.push_back(decor_monde1[0].decor_box()[0]);
copy_rect_decor.push_back(decor_monde1[1].decor_box()[0]);
copy_rect_decor.push_back(decor_monde1[2].decor_box()[1]);
copy_rect_decor.push_back(decor_monde1[3].decor_box()[1]);
copy_rect_decor.push_back(decor_monde1[4].decor_box()[2]);
//std::sort(decor_monde1.begin(), decor_monde1.end(), TriAscendant());
}
void Map::afficher_map(sf::RenderTarget &target, unsigned char monde)
{
target.draw(sprite_map_monde1);
}
void Map::afficher_decor(sf::RenderTarget &target, unsigned char monde)
{
for(int i = 0; i < NB_TOTAL_DECOR; i++)
decor_monde1[i].afficher_decor(target);
}
std::vector<sf::FloatRect> Map::tableau_decor_box()
{
return copy_rect_decor;
}