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

Dodawanie własnych obiektów do std::vector

Ostatnio zmodyfikowano 2020-07-07 19:30
Autor Wiadomość
BraveRat
Temat założony przez niniejszego użytkownika
Dodawanie własnych obiektów do std::vector
» 2020-07-07 17:19:49
Witam, napotkałem problem którego nie rozumiem. Mając klasę na mapę kafelkową z poradnika sfml.
C/C++
class TileMap
    : public sf::Drawable
     , public sf::Transformable
{
public:
   
    bool load( const std::string & tileset, sf::Vector2u tileSize, const int * tiles, unsigned int width, unsigned int height )
    {
        if( !m_tileset.loadFromFile( tileset ) )
             return false;
       
        m_vertices.setPrimitiveType( sf::Quads );
        m_vertices.resize( width * height * 4 );
       
        for( unsigned int i = 0; i < width; ++i )
        for( unsigned int j = 0; j < height; ++j )
        {
            int tileNumber = tiles[ i + j * width ];
           
            int tu = tileNumber %( m_tileset.getSize().x / tileSize.x );
            int tv = tileNumber /( m_tileset.getSize().x / tileSize.x );
           
            sf::Vertex * quad = & m_vertices[( i + j * width ) * 4 ];
           
            quad[ 0 ].position = sf::Vector2f( i * tileSize.x, j * tileSize.y );
            quad[ 1 ].position = sf::Vector2f(( i + 1 ) * tileSize.x, j * tileSize.y );
            quad[ 2 ].position = sf::Vector2f(( i + 1 ) * tileSize.x,( j + 1 ) * tileSize.y );
            quad[ 3 ].position = sf::Vector2f( i * tileSize.x,( j + 1 ) * tileSize.y );
           
            quad[ 0 ].texCoords = sf::Vector2f( tu * tileSize.x, tv * tileSize.y );
            quad[ 1 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x, tv * tileSize.y );
            quad[ 2 ].texCoords = sf::Vector2f(( tu + 1 ) * tileSize.x,( tv + 1 ) * tileSize.y );
            quad[ 3 ].texCoords = sf::Vector2f( tu * tileSize.x,( tv + 1 ) * tileSize.y );
        }
       
        return true;
    }
   
private:
   
    virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const
    {
        states.transform *= getTransform();
       
        states.texture = & m_tileset;
       
        target.draw( m_vertices, states );
    }
   
    sf::VertexArray m_vertices;
    sf::Texture m_tileset;
};
I na jej podstawie stworzyłem obiekt który umieściłem w wektorze.
C/C++
TileMap map;
if( !map.load( "grassbackgro.png", sf::Vector2u( 106, 106 ), level, 13, 8 ) )
     return - 1;

std::vector < TileMap > currentObjects;
currentObjects.reserve( 1 );
currentObjects.push_back( map );
I po uruchomieniu na konsoli wypisuje się:
An internal OpenGL call failed in Texture.cpp(98).
Expression:
   glFlush()
Error description:
   GL_INVALID_OPERATION
   The specified operation is not allowed in the current state.
A jeśli chciałbym zamiast window.draw(map) napisać window.draw(currentObjects[1]) to dodatkowo wszystko wysypie się z komunikatem:
vector subscript out of range
Czemu tak jest? I dlaczego nie mogę stworzyć obiektu podczas jego dodawania jak w przypadku np. IntRect
C/C++
std::vector < sf::IntRect > currentObjects;
currentObjects.reserve( 1 );
currentObjects.push_back( sf::IntRect( 0, 0, 0, 0 ) );
Tylko muszę dodawać taki już istniejący?
P-177321
pekfos
» 2020-07-07 17:59:38
Próbujesz kopiować teksturę. To wiąże się z wykonywaniem operacji OpenGL, które nie mogą być użyte byle gdzie. Nawet bez tego to zły pomysł, bo tekstury są ciężkie i nie ma potrzeby ich kopiować. Albo nie kopiuj obiektów swojej klasy, albo (preferowalnie) nie kopiuj samych tekstur. Załaduj teksturę raz i tylko się do niej odwołuj, np przez wskaźnik.
P-177323
BraveRat
Temat założony przez niniejszego użytkownika
» 2020-07-07 19:30:28
Dzięki za pomoc, chyba to ruzumiem.
P-177333
« 1 »
  Strona 1 z 1