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

[SFML] View - stałe tło + renderowanie tylko spriteów które są widoczne w View.

Ostatnio zmodyfikowano 2014-03-16 22:19
Autor Wiadomość
Pokropow
» 2014-03-16 20:25:41
skoro to jest mapa kafelkowa to zamiast funkcji czy_w_polu_view możesz chyba zastosować następujący trick:
przeliczasz lokalizację View (a konkretnie jego lewy górny róg) na współrzędne z mapy kafelkowej
   dla przykładu załóżmy że View "Patrzy" na lokalizację [5][4] w mapie kafelkowej
   Wtedy rysujesz obiekty które znajdują się pomiędzy tą lokalizacją, a prawym dolnym rogiem

np:
C/C++
int wielkosc_kafelka = TUTAJ WIELKOSC KAFELKA;
sf::Vector2f pos = sf::Vector2f( view.getCenter().x - view.getSize().x / 2, view.getCenter().y - view.getSize().y / 2 ); /** pozycja lewego gornego rogu kamery */
sf::Vector2f pos_w_mapie = sf::Vector2f( pos.x / wielkosc_kafelka, pos.y / wielkosc_kafelka );
sf::Vector2f wielkosc_view_w_coordach_mapy = sf::Vector2f( view.getSize.x / wielkosc_kafelka, view.getSize.y / wielkosc_kafelka );

// Rysowanie:

for( int i = pos.x; i < wielkosc_view_w_coordach_mapy.x + pos.x; i++ )
for( int j = pos.y; j < wielkosc_view_w_coordach_mapy.y + pos.y; j++ )
//Tutaj rysowanie

EDIT
 myślę że taka wersja będzie działać znacznie szybciej niezależnie od wielkości mapy (nawet jakbyś dał miliard kafelków, ale wtedy chyba pamięć zamuli)
P-106578
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-03-16 21:20:09
Nie rozumiem do końca twojego rozumowania. Przepisałem kod żywcem zmieniając tylko nazwy zmiennych i nie trybi ;< Co ma reprezentować zmienna "i" i "j" ? Jak je użyje jak w poprzedniej funkcji rysowania to wywala errora związanego z brakiem dostępu chyba do obszaru pamięci.
Dokładny error:
Unhandled exception at 0x012FC737 in Sfml.exe: 0xC0000005: Access violation reading location 0xFFFFFCAE.
P-106590
Pokropow
» 2014-03-16 21:51:30
generalnie chodziło mi o to że kamera wypisuje tylko te kafelki które widzi. i i j to miejsce w tablicy, a ta pętla powinna być w funkcji rys_mape() jeżeli nie działa to nie wiem dlaczego
P-106597
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-03-16 21:59:27
Możesz napisać funkcję rys_mape na podst. poprzedniej? Abym mógł skompilować i sprawdzić
P-106598
Pokropow
» 2014-03-16 22:06:49
Miałem na myśli coś takiego:
C/C++
void rys_mape() // Rysowanie mapy
{
    int wielkosc_kafelka = bloki.blok_szer; // zakładam że bloki to kwadraty - tymczasowe rozwiazanie
    sf::Vector2f pos = sf::Vector2f( view.getCenter().x - view.getSize().x / 2, view.getCenter().y - view.getSize().y / 2 ); /** pozycja lewego gornego rogu kamery */
    sf::Vector2f pos_w_mapie = sf::Vector2f( pos.x / wielkosc_kafelka, pos.y / wielkosc_kafelka );
    sf::Vector2f wielkosc_view_w_coordach_mapy = sf::Vector2f( view.getSize.x / wielkosc_kafelka, view.getSize.y / wielkosc_kafelka );
   
    for( int i = pos.x; i < wielkosc_view_w_coordach_mapy.x + pos.x; i++ )
    {
        for( int j = pos.y; j < wielkosc_view_w_coordach_mapy.y + pos.y; j++ )
        {
            bloki.blok[ mapa_kaf.mapa_tab[ i ][ j ] ].setPosition( sf::Vector2f( j * bloki.blok_szer, i * bloki.blok_wys ) );
            if( mapa_kaf.mapa_tab[ i ][ j ] != - 1 && czy_w_polu_View( i, j ) ) APP.draw( bloki.blok[ mapa_kaf.mapa_tab[ i ][ j ] ] );
           
        }
    }
   
}

chyba powinno działać
P-106600
Pokropow
» 2014-03-16 22:08:41
Jakbyś mógł wrzucić całe aktualne źródło, bo już się trochę mylę co gdzie. do tego mam pytanie - czym to kompilujesz?
P-106601
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-03-16 22:19:46
Jutro ci podam może linka do zipa z projektem\ plikami. Jestem na telefonie teraz i nic za bardzo nie zrobię. Visual 2013 express

// Zamykam. Na razie dobrze działa i nie będę nic ruszał :D
P-106603
1 « 2 »
Poprzednia strona Strona 2 z 2