Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.X] Glitch renderowania tekstury - sf::Drawable, sf::Transformable

Ostatnio zmodyfikowano 2024-11-14 17:07
Autor Wiadomość
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 ?



C/C++
float tileSide = 16.0f;
class Terrain
    : public sf::Drawable
    , public sf::Transformable
{
public:
   
short width, height; // normal is a 16x16
   
sf::Vector2i coords; // multiply by 16x16
   
sf::VertexArray vertexes; // vertexes of tiles
   
Texture * tileset; // main texture
   
std::vector < short > tiles; // tile values
   
   
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 ); // widthMap * heightMap * TwoTrianglesVertices
       
       
short coord_x, coord_y;
       
       
// TERRAIN - GRASS
       
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 );
       
       
//cout << "tu: " << tu << ", tv: " << tv << "\n";
       
       
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 );
   
}
}
;
P-181913
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.

C/C++
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 );
P-181914
« 1 »
  Strona 1 z 1