1
Graphique / Problèmes RPG 2d affichage map (trucs bizarres, renderTexture?)
« le: Août 18, 2015, 06:51:40 pm »
Bonjour, depuis quelque temps j'essaie de coder un petit RPG 2d en C++ avec la SFML, mais je suis malheureusement bloqué à cause d'un gros problème d'affichage: comme vous pouvez le voir sur les captures d'écran suivantes, des choses bizarres s'affichent sur le côté droit et le bas de la map:
Voici la fonction qui affiche les tuiles:
J'ai l'impression que c'est un problème de renderTexture, mais j'ai vérifié, je l'ai bien créé avec create(), et je n'ai pas oublié de faire display(), ni de faire clear().
Merci d'avance pour votre aide.
Voici la fonction qui affiche les tuiles:
void TileMap::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
// on applique la transformation
states.transform *= getTransform();
sf::RenderTexture render;
render.create(tileSize.x, tileSize.y);
unsigned int nbrLayers = mapCouches.size();
std::vector<sf::Sprite> couchesSprites;
for(size_t layerActuel(0); layerActuel < nbrLayers; layerActuel++) //Pour chaque couche disponible (layer)
{
sf::Sprite uneCouche; uneCouche.setTexture(tileTexture);
couchesSprites.push_back(uneCouche);
}
//Préparation au calcul de la position des tuiles dans le tileset
unsigned int nbrCasesParLigneTileset = tilesetWidth / tileSize.x;
unsigned int nbrCasesParLigneMap = tailleMap.x / tileSize.x;
//TEST
std::ofstream fichier("map.txt", std::ios::out | std::ios::trunc);
//
unsigned int nbrCases = mapCouches[0].size();
for(size_t i = 0; i < nbrCases; i++) // Pour chaque case de la première couche
{
//On définit la position du sprite représentant la case actuelle
unsigned int positionX(0);
unsigned int positionY(0);
computePosition(positionX, positionY, nbrCasesParLigneMap, i);
tiles->setPosition(positionX * tileSize.x, positionY * tileSize.y);
for(size_t spriteActuel(0); spriteActuel < couchesSprites.size(); spriteActuel++)
{
if(mapCouches[spriteActuel][i] != -1)
{
unsigned int positionXTileset(0);
unsigned int positionYTileset(0);
computePosition(positionXTileset, positionYTileset, nbrCasesParLigneTileset, mapCouches[spriteActuel][i]);
couchesSprites[spriteActuel].setPosition(0,0);
couchesSprites[spriteActuel].setTextureRect(sf::IntRect(positionXTileset * tileSize.x, positionYTileset * tileSize.y, tileSize.x, tileSize.y));
render.draw(couchesSprites[spriteActuel]);
} else if(spriteActuel == 0)
{
sf::Sprite sprite1; sprite1.setTexture(tileTexture); sprite1.setTexture(sf::Texture());
sprite1.setColor(sf::Color::Black);
render.draw(sprite1);
}
}
render.display();
tiles->setTexture(render.getTexture());
target.draw(*tiles, states);
render.clear();
fichier << i << "; ";
}
//TEST
fichier.close();
//
}
{
// on applique la transformation
states.transform *= getTransform();
sf::RenderTexture render;
render.create(tileSize.x, tileSize.y);
unsigned int nbrLayers = mapCouches.size();
std::vector<sf::Sprite> couchesSprites;
for(size_t layerActuel(0); layerActuel < nbrLayers; layerActuel++) //Pour chaque couche disponible (layer)
{
sf::Sprite uneCouche; uneCouche.setTexture(tileTexture);
couchesSprites.push_back(uneCouche);
}
//Préparation au calcul de la position des tuiles dans le tileset
unsigned int nbrCasesParLigneTileset = tilesetWidth / tileSize.x;
unsigned int nbrCasesParLigneMap = tailleMap.x / tileSize.x;
//TEST
std::ofstream fichier("map.txt", std::ios::out | std::ios::trunc);
//
unsigned int nbrCases = mapCouches[0].size();
for(size_t i = 0; i < nbrCases; i++) // Pour chaque case de la première couche
{
//On définit la position du sprite représentant la case actuelle
unsigned int positionX(0);
unsigned int positionY(0);
computePosition(positionX, positionY, nbrCasesParLigneMap, i);
tiles->setPosition(positionX * tileSize.x, positionY * tileSize.y);
for(size_t spriteActuel(0); spriteActuel < couchesSprites.size(); spriteActuel++)
{
if(mapCouches[spriteActuel][i] != -1)
{
unsigned int positionXTileset(0);
unsigned int positionYTileset(0);
computePosition(positionXTileset, positionYTileset, nbrCasesParLigneTileset, mapCouches[spriteActuel][i]);
couchesSprites[spriteActuel].setPosition(0,0);
couchesSprites[spriteActuel].setTextureRect(sf::IntRect(positionXTileset * tileSize.x, positionYTileset * tileSize.y, tileSize.x, tileSize.y));
render.draw(couchesSprites[spriteActuel]);
} else if(spriteActuel == 0)
{
sf::Sprite sprite1; sprite1.setTexture(tileTexture); sprite1.setTexture(sf::Texture());
sprite1.setColor(sf::Color::Black);
render.draw(sprite1);
}
}
render.display();
tiles->setTexture(render.getTexture());
target.draw(*tiles, states);
render.clear();
fichier << i << "; ";
}
//TEST
fichier.close();
//
}
J'ai l'impression que c'est un problème de renderTexture, mais j'ai vérifié, je l'ai bien créé avec create(), et je n'ai pas oublié de faire display(), ni de faire clear().
Merci d'avance pour votre aide.