Voila, je tente d'utiliser le tutoriel pour afficher une TileMap à l'écran, j'ai reussi à le faire fonctionner, cependant je suis incapable de créer un mouvement "fluide" pixel par pixel et non tuile par tuile.
J'utilise la fonction load que j'ai un peu modifiée :
bool TileMap::load(const std::string& tileset, sf::Vector2u tileSize, unsigned char** level, unsigned int height, unsigned int width,int dx, int dy)
{
// on charge la texture du tileset
if (!m_tileset.loadFromFile(tileset))
return false;
// on redimensionne le tableau de vertex pour qu'il puisse contenir tout le niveau
m_vertices.setPrimitiveType(sf::Quads);
m_vertices.resize((height) * (width) * 4);//nombre de tiles de haut * nb tiles de large * nombre de points par tiles.
// on remplit le tableau de vertex, avec un quad par tuile
for (unsigned int j = 0; j < height; ++j)
for (unsigned int i = 0; i < width; ++i)
{
// on récupère le numéro de tuile courant
int tileNumber = level[height-j-1-(dy/PPB)][i+(dx/PPB)];//on inverse l'axe des Y(j),de cette manière on obtient que la coordonnées 0,0 est le coin en bas à gauche, c'est plus pratique.
// on en déduit sa position dans la texture du tileset
int tu = tileNumber % (m_tileset.getSize().x / tileSize.x);
int tv = tileNumber / (m_tileset.getSize().x / tileSize.x);
// on récupère un pointeur vers le quad à définir dans le tableau de vertex
sf::Vertex* quad = &m_vertices[(i + j * width) * 4];
// on définit ses quatre coins
quad[0].position = sf::Vector2f((i * tileSize.x)+dx%PPB, (j * tileSize.y));// coin haut gauche
quad[1].position = sf::Vector2f(((i + 1) * tileSize.x)+dx%PPB, (j * tileSize.y));//coin haut droit
quad[2].position = sf::Vector2f(((i + 1) * tileSize.x)+dx%PPB, ((j + 1) * tileSize.y));//coin bas droit
quad[3].position = sf::Vector2f((i * tileSize.x)+dx%PPB, ((j + 1) * tileSize.y));//coin bas gauche
// on définit ses quatre coordonnées de texture
quad[0].texCoords = sf::Vector2f(tu * tileSize.x, tv * tileSize.y); // coin haut gauche
quad[1].texCoords = sf::Vector2f((tu + 1) * tileSize.x, tv * tileSize.y);//coin haut droit
quad[2].texCoords = sf::Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y);//coin bas droit
quad[3].texCoords = sf::Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y);//coin bas gauche
}
return true;
}
J'ai entre autre, rajouté des argument dx et dy qui servent à bouger l'image.
Cependant, j'ai un problème, quand j'essaye d'ajouter un mouvement horizontal, les tuiles les plus à gauches (dont les points les plus à gauche sont en dehors de l'écran) ne s'affichent pas.
J'ai rajouté dx/PPB (pixel par bloc) pour charger les bonnes tuiles.
et je les déplace le tout de dx%PPB pixel vers la droite(en ajoutant dx%PPB à leurs coordonnées)
Du coup j'ai une barre noire de taille dx%PPB à gauche de mon écran.
Si j'enlève 32 pixel à toutes mes coordonnées le problème reste le même.
J'ai l'impression qu'on ne peut pas afficher des choses trop à gauche de l'écran.edit(il n'aime peut-être pas les coordonnées négatives)