[SFML 2.X] Glitch renderowania tekstury - sf::Drawable, sf::Transformable
Ostatnio zmodyfikowano 2024-11-14 17:07
tBane Temat założony przez niniejszego użytkownika |
[SFML 2.X] Glitch renderowania tekstury - sf::Drawable, sf::Transformable » 2024-11-14 16:54:08 Witam. Programuję klasę Terrain. Zauważyłem, że jak przemieszczam obiekt tej klasy w osi X to czasami pojawiają się glitche takie jak na screenie. Pomyślałem więc, że wykraczam poza zakres tekstury w zbiorze tekstur (jedna długa tekstura), więc poprawiłem współrzędne dla vertexes.texCoords. Jednak to nie pomogło, glitch nadal występuje. Gdzie robię błąd ? float tileSide = 16.0f; class Terrain : public sf::Drawable , public sf::Transformable { public: short width, height; sf::Vector2i coords; sf::VertexArray vertexes; Texture * tileset; std::vector < short > tiles; Terrain( short x, short y, short width, short height ) { coords.x = x; coords.y = y; this->width = width; this->height = height; tileset = getTexture( "tiles/0_tileset" ); tiles.resize( width * height, 2 ); vertexes.setPrimitiveType( sf::Triangles ); vertexes.resize( width * height * 6 ); short coord_x, coord_y; for( short y = 0; y < height; y++ ) for( short x = 0; x < width; x++ ) { sf::Vertex * triangles = & vertexes[( y * width + x ) * 6 ]; coord_x =( coords.x + x ); coord_y =( coords.y + y ); triangles[ 0 ].position = sf::Vector2f( coord_x * tileSide, coord_y * tileSide ); triangles[ 1 ].position = sf::Vector2f(( coord_x + 1 ) * tileSide, coord_y * tileSide ); triangles[ 2 ].position = sf::Vector2f( coord_x * tileSide,( coord_y + 1 ) * tileSide ); triangles[ 3 ].position = sf::Vector2f( coord_x * tileSide,( coord_y + 1 ) * tileSide ); triangles[ 4 ].position = sf::Vector2f(( coord_x + 1 ) * tileSide, coord_y * tileSide ); triangles[ 5 ].position = sf::Vector2f(( coord_x + 1 ) * tileSide,( coord_y + 1 ) * tileSide ); edit( x, y, 2 ); } } void edit( short x, short y, short value ) { if( x < 0 || x >= width || y < 0 || y >= height ) return; tiles[ y * width + x ] = value; short global_x = coords.x + x; short global_y = coords.y + y; sf::Vertex * triangles = & vertexes[( y * width + x ) * 6 ]; short tu =( short( global_x * tileSide ) % 64 ) +( value * 64 ); short tv =( short( global_y * tileSide ) % 64 ); triangles[ 0 ].texCoords = sf::Vector2f( tu, tv ); triangles[ 1 ].texCoords = sf::Vector2f( tu + tileSide - 1, tv ); triangles[ 2 ].texCoords = sf::Vector2f( tu, tv + tileSide - 1 ); triangles[ 3 ].texCoords = sf::Vector2f( tu, tv + tileSide - 1 ); triangles[ 4 ].texCoords = sf::Vector2f( tu + tileSide - 1, tv ); triangles[ 5 ].texCoords = sf::Vector2f( tu + tileSide - 1, tv + tileSide - 1 ); } };
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-14 17:07:45 Rozwiązanie. Ustawiać texCoords'y przesunięte o 1 do środka. quad[ 0 ].texCoords = sf::Vector2f( tu + 1, tv + 1 ); quad[ 1 ].texCoords = sf::Vector2f( tu + tileSide - 1, tv + 1 ); quad[ 2 ].texCoords = sf::Vector2f( tu + tileSide - 1, tv + tileSide - 1 ); quad[ 3 ].texCoords = sf::Vector2f( tu + 1 + 1, tv + tileSide - 1 );
|
|
« 1 » |