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

[SFML 2.x.x] Renderowanie obrazu w obrębie widocznego ekranu

Ostatnio zmodyfikowano 2016-02-21 22:33
Autor Wiadomość
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?
P-145098
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.
P-145104
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
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 )
    {
        // wczytanie atlasu tekstur
        if( !m_tileset.loadFromFile( tileset ) )
             return false;
       
        // zmiana rozmiaru tablicy, tak aby pasowała do wielkości mapy
        m_vertices.setPrimitiveType( sf::Quads );
        m_vertices.resize( width * height * 4 );
       
        // zapełnianie vertex array, po jednym na kafel
        for( unsigned int i = 0; i < width; ++i )
        for( unsigned int j = 0; j < height; ++j )
        {
            // pobranie obecnego numeru kafla
            int tileNumber = tiles[ i + j * width ];
           
            // znalezienie jego pozycji na tileset
            int tu = tileNumber %( m_tileset.getSize().x / tileSize.x );
            int tv = tileNumber /( m_tileset.getSize().x / tileSize.x );
           
            // pobranie wskaźnika do bieżącego kafla czworokąta
            sf::Vertex * quad = & m_vertices[( i + j * width ) * 4 ]; // I co daje pobranie tego wskaźnika jeśli chodzi o renderowanie tego obrazu?
           
            // ustawienie 4 rogów
            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 );
           
            // ustawienie 4 współrzędnych tekstury
            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 //O co tu chodzi? W jaki sposób renderuje się tutaj ta duża tekstura?
    {
        // ustawienie przekształceń
        states.transform *= getTransform();
       
        // ustawienie tekstury
        states.texture = & m_tileset;
       
        // narysowanie
        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.
P-145135
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.
P-145137
« 1 »
  Strona 1 z 1