[SFML 2.x.x] Renderowanie obrazu w obrębie widocznego ekranu
Ostatnio zmodyfikowano 2016-02-21 22:33
baddevil96 Temat założony przez niniejszego użytkownika |
[SFML 2.x.x] Renderowanie obrazu w obrębie widocznego ekranu » 2016-02-21 03:07:48 Witam. Szukam metody na przedstawiony w opisie problem, ktoś byłby w stanie pomóc? |
|
Gibas11 |
» 2016-02-21 11:47:03 SFML z tego co kojarzę sprawnie obcina nadmiar i renderowane jest tylko to, co jest widoczne. Jeżeli Cię to nie satysfakcjonuje i chcesz jeszcze uniknąć wywoływania metody draw(...), możesz jeszcze tworzyć prostokąt obejmujący widoczny ekran z kawałkiem i metodą sf::IntRect::contains() sprawdzać czy dany obiekt się w nim mieści. Niezbyt precyzyjne, bo jeżeli stworzysz zbyt duży obiekt, który powinien częściowo się pojawić na ekranie, ale jego środek (patrz setOrigin / getOrigin) znajdzie się poza ekranem i trochę dalej, to i tak się nie pojawi. Tak czy inaczej jest to w miarę szybkie. Sam musisz wybrać co najbardziej Cię zadowoli. |
|
baddevil96 Temat założony przez niniejszego użytkownika |
A wytlumaczylby mi troche ktoś poniższy kod? » 2016-02-21 22:17:47 Troche się uczyłem c++, lecz to poniżej wydaje mi sie trochę niezrozumiałe 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 mam pytanie, w jakiej kolejności wykonują się funckje w tej klasie? Czy virtual void draw() wykonuje sie po bool.load() czy przed.. a może przy pobraniu tego wskaźnika? Proszę o pomoc. |
|
Gibas11 |
» 2016-02-21 22:33:54 load wykonuje się kiedy ktoś bezpośrednio wywoła je w kodzie, draw podczas przekazywania obiektu do metody draw obiektu klasy sf::RenderWindow. Nie da się w takiej sytuacji przewidzieć co wykona się pierwsze, zwłaszcza, że to sam kod klasy. Można tylko dedukować, że load będzie pierwsze, a draw cyklicznie, co obieg pętli. Ps. jeden temat na forum – jeden wątek. |
|
« 1 » |