16
Graphique / Re: VertexArray - Jeu qui plante
« le: Septembre 17, 2017, 05:53:37 pm »
Merci d'avoir répondu, j'ai suivi tes supers conseils, j'ai changé le code. Maintenant, au lieu de tester les 4 millions de tiles à chaque fois, je place directement dans le tableau ceux qui sont dans la rectangle. Et comme j'ai plus une long boucle, je met à jour ma map directement dans la boucle principale et ça ne gène plus le jeu, donc plus de thread.
J'ai déjà eu ce problème mais je l'avais réglé en ajoutant 1 tile à width quand je resize le tableau (comme tu peux le voir dans code). Et effectivement ça aussi ça faisait planter le jeu.
Sinon j'ai debug, il me dit que ça vient de la ligne "quad[0].." comme je l'avais deviné. Et il a reçu ce signal là quand le jeu a planté.
Je ne sais pas ce que ça veut dire, merci de m'aider!
void Tilemap::uptade(sf::FloatRect rect)
{
unsigned firstTileX = abs(std::floor(rect.left / mTileSize.x));
unsigned lastTileX = abs(std::ceil((rect.left + rect.width) / mTileSize.x));
unsigned firstTileY = abs(std::floor(rect.top / mTileSize.y));
unsigned lastTileY = abs(std::ceil((rect.top + rect.height) / mTileSize.y));
unsigned width = rect.width / mTileSize.x;
unsigned height = rect.height / mTileSize.y;
mVertices.clear();
mVertices.setPrimitiveType(sf::Quads);
mVertices.resize((width + mTileSize.x) * (height + mTileSize.y) * 4);
for(unsigned i = firstTileX; i < lastTileX; ++i)
for(unsigned j = firstTileY; j < lastTileY; ++j)
{
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 = &mVertices[(i + j * width) * 4];
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);
}
}
{
unsigned firstTileX = abs(std::floor(rect.left / mTileSize.x));
unsigned lastTileX = abs(std::ceil((rect.left + rect.width) / mTileSize.x));
unsigned firstTileY = abs(std::floor(rect.top / mTileSize.y));
unsigned lastTileY = abs(std::ceil((rect.top + rect.height) / mTileSize.y));
unsigned width = rect.width / mTileSize.x;
unsigned height = rect.height / mTileSize.y;
mVertices.clear();
mVertices.setPrimitiveType(sf::Quads);
mVertices.resize((width + mTileSize.x) * (height + mTileSize.y) * 4);
for(unsigned i = firstTileX; i < lastTileX; ++i)
for(unsigned j = firstTileY; j < lastTileY; ++j)
{
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 = &mVertices[(i + j * width) * 4];
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);
}
}
Citer
il se pourrait que ta boucle retienne "width + 1" et/ou "height + 1" tuiles, et que tu dépasses donc la capacité de ton vertex array
J'ai déjà eu ce problème mais je l'avais réglé en ajoutant 1 tile à width quand je resize le tableau (comme tu peux le voir dans code). Et effectivement ça aussi ça faisait planter le jeu.
Sinon j'ai debug, il me dit que ça vient de la ligne "quad[0].." comme je l'avais deviné. Et il a reçu ce signal là quand le jeu a planté.
Program received signal SIGSEGV, Segmentation fault.
Je ne sais pas ce que ça veut dire, merci de m'aider!