Comment est déclaré le map mPixelToTile?
Un petit peu plus de code aiderait pour mieux xomprendre ce qui va pas
Bah, j'ai déjà donné la réponse hein
Effectivement, et merci beaucoup !
Cependant, rien ne s'affiche encore... Je cherche de mon côté, et voici le code si le concept (piqué au SdZ) vous intéresse ! (J’accepte aussi de l'aide et toute autre remarque, à préciser que le seul affichage est la couleur de fond de la fenêtre.
)
/***** main.cpp *****/
#include <SFML/System.hpp>
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include "TileMap.h"
int main(int argc, char *argv[])
{
// Initialisation
sf::RenderWindow Window(sf::VideoMode(1200, 800), "SFML Window", sf::Style::Default);
TileMap Map("TileSet.png", "PixelSet.png", "MenuMap.png");
// Boucle principale
while (Window.isOpen()) // Tant que la fenêtre est ouverte
{
sf::Event Event;
while (Window.pollEvent(Event)) // On récupère l'évènement suivant de la pile
{
if(Event.type == sf::Event::Closed || sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) // Si Escape est appuyée ou si la fenêtre est fermée
Window.close(); // Alors on ferme la fenêtre
}
Window.clear(sf::Color::Blue);
Window.draw(Map);
Window.display();
}
return EXIT_SUCCESS;
}
/***** TileMap.h *****/
#ifndef TILEMAP_H
#define TILEMAP_H
#include <SFML/Graphics.hpp>
#include <string>
#include <map>
class ColorComparaison {
public:
bool operator() (const sf::Color &left, const sf::Color &right) const
{
return (left.r + left.b + left.g) < (right.r + right.b + right.g); // Just histoire de faire le tri...
}
};
class TileMap : public sf::Drawable
{
public:
TileMap(const std::string &tile_set, const std::string &pixel_set, const std::string &pixel_map);
private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states = sf::RenderStates::Default) const;
private:
sf::Image mPixelMap; // Carte sous forme d'image, contenant des pixel qui correspondent chacuns à un tile
std::map <sf::Color, sf::Texture, ColorComparaison> mPixelToTile; // Tableau de correspondance entre les pixels et les tiles
sf::Vector2i mTileSize; // Taille d'un tile
};
#endif // TILEMAP_H
/***** TileMap.cpp *****/
#include "TileMap.h"
TileMap::TileMap(const std::string &tile_set, const std::string &pixel_set, const std::string &pixel_map)
{
// On convertit les noms d'images en images
sf::Image mPixelMap;
sf::Image TileSet; // Alignement de tiles
sf::Image PixelSet; // L'alignement de pixel correspondant à celui de tiles
if( !(mPixelMap.loadFromFile(pixel_map) && TileSet.loadFromFile(tile_set) && PixelSet.loadFromFile(pixel_set)) ) // Chargement des images
exit(EXIT_FAILURE); // On termine le programme si une image n'est pas valide
// Taille d'un tile
sf::Vector2i mTileSize(TileSet.getSize().x / PixelSet.getSize().x, TileSet.getSize().y);
// On attribue chaque pixel à un tile, suivant l'odre des sets
for(unsigned int i = 0; i < PixelSet.getSize().x; i++) // Pour chacun des pixels...
mPixelToTile[PixelSet.getPixel(i, 0)].loadFromImage(TileSet, sf::IntRect(mTileSize.x * i, 0, mTileSize.x, mTileSize.y));
}
void TileMap::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
static sf::Sprite Drawer;
// On parcourt la carte de pixels
for(unsigned int x = 0; x < mPixelMap.getSize().x; x++)
for(unsigned int y = 0; y < mPixelMap.getSize().y; y++)
{
Drawer.setTexture(mPixelToTile.find(mPixelMap.getPixel(x, y))->second);
Drawer.setPosition(mTileSize.x * x, mTileSize.y * y);
target.draw(Drawer, states);
}
// Test :
static sf::Sprite Test;
Test.setColor(sf::Color::Green);
Test.setPosition(0, 0);
target.draw(Test, states); // Même cela ne s'affiche pas...
}
Merci à tous !