Salut! Je suis entrain de travailler sur un jeu. J'ai crée une tilemap mais la map était tellement grande (2000 x 2000 tiles de 16 pixels) que j'avais genre 5 fps (même en Release), j'ai donc décidé de n'afficher que les tiles qui sont dans une rectangle autour du joueur. Pour faire je met à jour ma map tous les secondes sur un thread (pour pas que ça gène la boucle principale, j'ai un for qui traverse 4 millions de tiles quand même). J'suis très content du résultat.
Mais j'ai un problème, quand mon joueur vas vers le bas et qu'il dépasse les 5200 pixels environ en Y, le jeu plante (En X, je peux aller aussi loin que je veux). Le problème viens de la tilemap (quand je l'enlève il n'y a plus de problème). Voici mon code qui met à jour la tilemap:
void Tilemap::uptade(sf::FloatRect rect) //On prend en paramètre la rectangle dont on doit afficher les tiles à l'intérieur
{
//Tilemap
sf::VertexArray vertex; //Tableau temporaire car sur le tableau principale on doit clear et ça clignote, moche
unsigned width = rect.width / mTileSize.x + mTileSize.x * 16; //Nombre de tile par ligne à afficher
unsigned height = rect.height / mTileSize.y + mTileSize.y * 16; //Nombre de tile par colonne à afficher
vertex.setPrimitiveType(sf::Quads);
vertex.resize(width * height * 4); //On redimmensionne le tableau
for(unsigned i = 0; i < mLevelSize.x; ++i)
for(unsigned j = 0; j < mLevelSize.y; ++j)
{
int tileX = i * mTileSize.x; //Position X du tile courant dans le jeu
int tileY = j * mTileSize.y; //Position Y du tile courant dans le jeu
//Si le tile courant est dans la rectangle, on l'ajoute au tableau
if(rect.intersects(sf::FloatRect(tileX, tileY, mTileSize.x, mTileSize.y)))
{
//Comme dans le tutoriel à partir de là
int tileNumber = mLevel[i + j * mLevelSize.x];
int tu = tileNumber % (mTileset.getSize().x / mTileSize.x);
int tv = tileNumber / (mTileset.getSize().x / mTileSize.x);
sf::Vertex* quad = &vertex[(i + j * width) * 4];
//Quand j'enlève les 8 lignes suivants, aucun problème, ça vient d'ici
quad[0].position = sf::Vector2f(i * mTileSize.x, j * mTileSize.y);
quad[1].position = sf::Vector2f((i + 1) * mTileSize.x, j * mTileSize.y);
quad[2].position = sf::Vector2f((i + 1) * mTileSize.x, (j + 1) * mTileSize.y);
quad[3].position = sf::Vector2f(i * mTileSize.x, (j + 1) * mTileSize.y);
quad[0].texCoords = sf::Vector2f(tu * mTileSize.x, tv * mTileSize.y);
quad[1].texCoords = sf::Vector2f((tu + 1) * mTileSize.x, tv * mTileSize.y);
quad[2].texCoords = sf::Vector2f((tu + 1) * mTileSize.x, (tv + 1) * mTileSize.y);
quad[3].texCoords = sf::Vector2f(tu * mTileSize.x, (tv + 1) * mTileSize.y);
}
}
mVertices = vertex; //On met à jour la map
}
Comme il est écrit, quand j'enlève les 8 lignes qui définit la position dans le jeu du tile et la position dans la texture, tous vas bien. Je ne comprend vraiment pas pourquoi :/
Merci de bien vouloir m'aider!