Dodawanie własnych obiektów do std::vector
Ostatnio zmodyfikowano 2020-07-07 19:30
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. 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. 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 std::vector < sf::IntRect > currentObjects; currentObjects.reserve( 1 ); currentObjects.push_back( sf::IntRect( 0, 0, 0, 0 ) );
Tylko muszę dodawać taki już istniejący? |
|
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. |
|
BraveRat Temat założony przez niniejszego użytkownika |
» 2020-07-07 19:30:28 Dzięki za pomoc, chyba to ruzumiem. |
|
« 1 » |