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

[SFML] Minimapa z możliwością zoom'owania

Ostatnio zmodyfikowano 2014-03-20 20:09
Autor Wiadomość
OczkoSX
Temat założony przez niniejszego użytkownika
[SFML] Minimapa z możliwością zoom'owania
» 2014-03-18 21:11:07
Witam! To znowu ja ze swoimi problemami :D Mam następującą funkcję rysującą:
C/C++
void CMapa::rys_mape() // Rysowanie mapy
{
    for( int i = 0; i < wys; i++ ) // Petla - wysokosc mapy
    {
        for( int j = 0; j < szer; j++ ) // Petla - szerokosc mapy
        {
            bloki.blok[ mapa_tab[ i ][ j ] ].setPosition( sf::Vector2f(( float ) j * bloki.blok_wymiar,( float ) i * bloki.blok_wymiar ) ); // Ustawia pozycje kafelka
            if( mapa_tab[ i ][ j ] != - 1 ) // Jesli blok nie jest powietrzem
            {
                if( czy_w_polu_View( i, j ) ) // Czy blok znajduje sie w polu widzenia gracza
                {
                    APP.draw( bloki.blok[ mapa_tab[ i ][ j ] ] ); // Narysuj blok
                }
            }
        }
    }
}

Wywołuję ją za każdym obiegiem pętli, która służy za wyświetlanie obrazu. Tutaj jest pokazane tworzenie obiektów i innych obrazków podczas rysowania:
C/C++
sf::Texture bg_txt;
bg_txt.loadFromFile( "bg.png" );
sf::Sprite bg( bg_txt );
bg.setOrigin( sf::Vector2f( bg.getGlobalBounds().width / 2, bg.getGlobalBounds().height / 2 ) );

view.setViewport( sf::FloatRect( 0.f, 0.f, 1.f, 1.f ) );
view.setSize( sf::Vector2f( APP.getSize() ) );
view.zoom( 10.0f );
bg.setScale( sf::Vector2f( view.getSize().x / bg.getGlobalBounds().width, view.getSize().y / bg.getGlobalBounds().height ) );

while( APP.isOpen() )
{
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::D ) ) hero.move( 5, 0 );
   
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::A ) ) hero.move( - 5, 0 );
   
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::W ) ) hero.move( 0, - 5 );
   
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::S ) ) hero.move( 0, 5 );
   
    if( sf::Keyboard::isKeyPressed( sf::Keyboard::Escape ) ) APP.close();
   
    widok();
   
    bg.setPosition( sf::Vector2f( view.getCenter() ) );
    APP.draw( bg );
   
    mapy[ wybr_mapa ].rys_mape();
    APP.draw( hero );
   
    APP.display();
    APP.clear();
}
}

void postac()
{
hero.setSize( sf::Vector2f( 400, 400 ) );
hero.setFillColor( sf::Color::Red );
}

void widok()
{
view.setCenter( sf::Vector2f( hero.getPosition().x +( hero.getGlobalBounds().width / 2 ), hero.getPosition().y +( hero.getGlobalBounds().height / 2 ) ) );
APP.setView( view );
}
View jest zawsze skierowany na gracza tak, aby był w centrum ekranu. Chciałbym umieścić w prawym górnym rogu minimapę. Nie miałbym problemów ze stworzeniem minimapy, która pobiera aktualny obraz wyświetlany przez View i odpowiednie scalowanie do jej rozmiarów, ale chciałbym aby w minimapie była CAŁA MAPA. Mapa by była rysowana do minimapy tylko raz, gdyż nie ulega ona zmianie. Chciałem to zrobić tak, że zapisuję całą mapę do Sprite, tworzę widok minimapy, w nim rysuję sprite. Z zoomowaniem też nie ma problemu, wystarczy minimapaView.zoom(). Chodzi mi teraz głównie o to jak zapisać całą mapę do sprite. Pozdrawiam
P-106738
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-03-18 22:08:24
Wpadłem na pomysł ze mogę zrobić RenderTexture, rysować do niego mapę, zrobić z niego sprite, potem osobny view i wyświetlić. Co o tym myślicie?
P-106743
waxx
» 2014-03-19 14:23:41
Tak to się robi - albo możesz samemu narysować mapę do tekstury, albo wcześniej przygotować teksturę i ją wrzucić...
Oczywiście do osobnego sf::View.
P-106782
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-03-19 16:23:14
Jak przechowywać w RenderTexture gigantyczną texture? Mam texture mapy o rozmiarch 200px * 100. Trochę sporo. Jak wpsrowadzę takie dane to nie działa.

PS. Jak dam warunek if nie można utworzyć to wyłącz, to wyłącza aplikacje. Nie ma takiej możliwości przechowywania takich textur?
P-106788
DejaVu
» 2014-03-19 16:37:02
200x200x32bit = 156,25KB * 100 = 15,26MB
100 obrazków o takim rozmiarze wczytasz bez problemu.
1 obrazek zawierający o wymiarach (100*200)x200x32bit => nie wczytasz na Windows XP (na Windows 7 być może jak Ci się poszczęści to się uda).
P-106789
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-03-19 18:06:13
Żle zrozumiałeś. Mapa składa się z kafli o wymiarach 200x200, a ona sama ma 100x100 kafli

// Jak to można inaczej zrobić? Chciałbym aby była widoczna cała mapa na minimapie... No i ta możliwość zoomowania
P-106798
Wrzud
» 2014-03-19 19:04:43
Zmniejsz rozmiar kafla. Potem renderuj i daj skale. W czym widzisz problem?
P-106799
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-03-19 19:29:01
Tylko ze użytkownik robi własną mapę... Nie mogę rozmiarów określić
P-106801
« 1 » 2
  Strona 1 z 2 Następna strona