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

[SFML 2.1] tworzenie minimapy

Ostatnio zmodyfikowano 2013-12-04 22:06
Autor Wiadomość
Raciawelli
Temat założony przez niniejszego użytkownika
[SFML 2.1] tworzenie minimapy
» 2013-11-26 07:33:42
po okrojeniu zbędnych części mam coś takiego:
C/C++
#include <SFML/Graphics.hpp>
int main()
{
    sf::RenderWindow window( sf::VideoMode( 660, 660, 32 ), "grom w gre! 2" );
    //tworzenie sprajta pionek
    sf::View gameView( sf::Vector2f( 330, 330 ), sf::Vector2f( 660, 660 ) );
    gameView.setViewport( sf::FloatRect( 0.f, 0.f, 1.f, 1.f ) );
    sf::View minimapView( sf::Vector2f( 750, 750 ), sf::Vector2f( 1500, 1500 ) );
    minimapView.setViewport( sf::FloatRect( 0.75f, 0.f, 0.25f, 0.25f ) );
   
    sf::Texture tekstura2;
    tekstura2.loadFromFile( "trawka.png" ); //ramka
    sf::Sprite trawka;
    trawka.setTexture( tekstura2 );
    int plansza[ 50 ][ 50 ];
    for( int b = 0; b <= 49; b++ )
    for( int a = 0; a <= 49; a++ )
         plansza[ a ][ b ] = 0;
   
    for( int b = 0; b <= 49; b += 49 ) //pozycjonowanie ramki
    for( int a = 0; a <= 49; a++ )
         plansza[ a ][ b ] = 1;
   
    for( int b = 0; b <= 49; b++ )
    for( int a = 0; a <= 49; a += 49 )
         plansza[ a ][ b ] = 1;
   
    while( window.isOpen() )
    {
        window.clear( sf::Color() );
        sf::Event event;
        while( window.pollEvent( event ) )
        {
            if( event.type == sf::Event::Closed ) //zamykanie
                 window.close();
           
        } //zdarzenia
        for( int b = 0; b <= 49; b++ )
        for( int a = 0; a <= 49; a++ )
        {
            if( plansza[ a ][ b ] == 1 )
            {
                trawka.setPosition( a * 30, b * 30 ); //rysowanie ramki
                window.draw( trawka );
            }
        }
        window.setView( gameView );
        window.setView( minimapView );
        //rysowanie pionka
        window.display();
        sf::sleep( sf::milliseconds( 10 ) );
    }
    return 0;
}
i program teoretycznie powinien rysować najpierw widok gry i na tym w prawym górnym rogu minimapę, ale niestety rysuje tylko mnimapę, lub jak zamienię
C/C++
window.setView( minimapView );
window.setView( gameView );
tylko widok gry... nie mam pojęcia dlaczego tak się dzieje ;/
       
P-97539
maly
» 2013-11-26 09:50:11
C/C++
window.setView( gameView );
// wyświetl mape

window.setView( minimapView );
// wyświetl mape
P-97542
polkom21
» 2013-11-26 12:24:45
Nie działa Ci ponieważ sf::RenderWindow może posiadać tyko jeden widok. Zrób to w ten sposób, że stwórz sobie sf::RenderTexture do którego przypisz widok minimapy bo z tego co widzę to taki zrobiłeś później przerzucisz to do sprite a resztę to już powinieneś wiedzieć jak.
P-97559
Raciawelli
Temat założony przez niniejszego użytkownika
» 2013-12-01 21:04:50
Ok, nadal nie wiem jak to zrobić. Pierwsze słyszałem o RanderTexture (w końcu sfml zacząłem 2 tygodnie temu) więc zajrzałem w dokumentację i poszperałem trochę po forach. wyszło mi coś takiego:
C/C++
#include <SFML/Graphics.hpp>
int main()
{
    sf::RenderWindow window( sf::VideoMode( 660, 660, 32 ), "grom w gre! 2" ); //tworzenie okna
    sf::RenderTexture texture;
    if( !texture.create( 500, 500 ) ) //tworzenie tekstury
         return - 1;
   
    sf::View gameView( sf::Vector2f( 330, 330 ), sf::Vector2f( 660, 660 ) ); //tworzenie 2 widoków
    gameView.setViewport( sf::FloatRect( 0.f, 0.f, 1.f, 1.f ) );
    sf::View minimapView( sf::Vector2f( 750, 750 ), sf::Vector2f( 1500, 1500 ) );
    minimapView.setViewport( sf::FloatRect( 0.75f, 0.f, 0.25f, 0.25f ) );
    //kod tworzący sprajty
    while( window.isOpen() )
    {
        window.clear( sf::Color() ); //czyszczenie ekranu
        //... reszta kodu
        texture.clear( sf::Color::Blue ); //czyszczenie tekstury
        texture.setView( minimapView ); //rysowanie widoku minimapy
        texture.display(); //kończenie rysowania
        sf::Sprite sprite( texture.getTexture() ); //ładowanie tekstury do sprajta
        window.setView( gameView ); //wyświetlanie widoku głównego
        window.draw( sprite ); //wyświetlanie sprajta(z minimapą)
        window.display(); // kończenie pracy okna
    }
    return 0;
}
komentarze przedstawiają jak ja rozumiem co się po kolei dzieje. Niestety nie dostaję oczekiwanego efektu, a jedynie niebieski prostokąt. Z tego wnioskuję, że mi się widok minimapy nie chce do tekstury załadować. I nie mam pojęcia dlaczego. Nie obsługuje view? Powinienem użyć innej funkcji?
P-98063
DejaVu
» 2013-12-04 22:06:45
http://www.sfml-dev.org​/tutorials/2.0/graphics-draw.php

Jeżeli dobrze rozumiem to z tutoriala, który podałem wynika, że:
C/C++
sf::RenderTexture minimapa;
if( !minimapa.create( 500, 500 ) )
{
    // błąd
}

minimapa.clear();
//(...) tu rysujesz to, co ma się wyświetlić na minimapie, np. minimapa.draw(sprite);
minimapa.display();


//Pobierasz wygenerowaną teksturę minimapy do sprajta
sf::Sprite sprite( minimapa.getTexture() );

//Renderujesz sprajta na scenie
window.draw( sprite );
P-98368
« 1 »
  Strona 1 z 1