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

[Allegro, C++] Płynny scrolling mapy

Ostatnio zmodyfikowano 2011-12-07 18:13
Autor Wiadomość
pekfos
» 2011-12-04 21:05:34
C/C++
if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) &&( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) ) ) { scrollX--; mapa_x--; }
wciśnięto w lewo i nie na krawędzi i ludek_x == ...
jaki sens?
P-45171
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-04 21:14:35
Chodzi o to, że jeżeli ekran nie jest doscrollowany max do lewej strony mapy, ludzik jest na środku ekranu i mamy wciśniętą strzałkę w lewo, to ekran scrolluje się w lewo, aż do napotkania końca mapy. Wtedy ludek ma podchodzić do końca ekranu.

Nie żebym twierdził, że to jest dobrze i w tym kierunku trzeba iść, przecież nie działa. I tutaj właśnie proszę o poprawki.
P-45172
kamillo121
» 2011-12-04 21:44:25
Hmmm, po przeczytaniu odpowiedzi szczególnie twoich(co prawda po łebkach) wnioskuję, że sądzisz iż scroll jest jakoś powiązany z postacią na sztywno.. Ludek sobie idzie tak czy tak, scroll sobie przesuwa mapę do końca potem staje ale ludek sobie dalej idzie aż napotka koniec mapy czy cokolwiek innego..
Przetrawię teraz moją myśl na pseudo kod.
C/C++
if( w_lewo )
{
    if( mapa_x - przesuniecie >= 0 )
    {
        mapa_x -= przesuniecie;
    }
    /* Drugi warunek jeżeli wykrywasz kolizje*/
    if( ludek_x - przesuniecie_ludka >= 0 && !kolizja( ludek_x, ludek_y ) )
    {
        mapa_x -= przesuniecie;
    }
}

Nie wiem nad czym Ty chcesz tu tak myśleć ?
P-45174
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-04 22:08:03
No w końcu się udało! Oto kod, może komuś się jeszcze przyda :)

C/C++
while( !key[ KEY_ESC ] )
{
    while( speed > 0 )
    {
        if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) &&( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) ) )
        {
            scrollX--; mapa_x--;
        }
        else if(( key[ KEY_LEFT ] ) &&( ludek_x > 0 ) ) ludek_x--;
       
        if(( key[ KEY_RIGHT ] ) &&( mapa_x < 40 * 20 ) &&( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) ) )
        {
            scrollX++; mapa_x++;
        }
        else if( key[ KEY_RIGHT ] &&( ludek_x <( SCREEN_W - ludek->w ) ) ) ludek_x++;
       
        if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) &&( ludek_y ==( SCREEN_H / 2 ) -( ludek->h / 2 ) ) )
        {
            scrollY--; mapa_y--;
        }
        else if(( key[ KEY_UP ] ) &&( ludek_y > 0 ) ) ludek_y--;
       
        if(( key[ KEY_DOWN ] ) &&( mapa_y < 40 * 25 ) &&( ludek_y ==( SCREEN_H / 2 ) -( ludek->h / 2 ) ) )
        {
            scrollY++; mapa_y++;
        }
        else if(( key[ KEY_DOWN ] ) &&( ludek_y <( SCREEN_H - ludek->h ) ) ) ludek_y++;
       
        speed--; }

W końcu działa jak należy.
Kocham to uczucie, kiedy program działa tak, jak ja chcę ;]

Ale pozostała ostatnia kwestia. Mianowicie nic przy funkcji wyświetlającej mapę nie grzebałem, ale i tak w jakiś cudowny sposób nie mam problemów z tak zwaną przeze mnie "szarą strefą" przy brzegach podczas scrollowania. Obawiam się, że cała mapa jest wyświetlana, nawet te części, których w danym momencie nie widać. Podajcie proszę jakich pomysł, by to trochę zoptymalizować, tzn. wyświetlać tylko tę część mapy, która w danym momencie jest potrzebna.

Oto moja funkcja wyświetlająca mapę:

C/C++
void renderuj_mape()
{
    for( int x = 0; x < 40; x++ )
    {
        for( int y = 0; y < 40; y++ )
        {
            blit( teren, bufor,
            ( map[ y ][ x ] % 4 ) * 40,
            ( map[ y ][ x ] / 4 ) * 40,
            x * 40 -( scrollX % 40 ),
            y * 40 -( scrollY % 40 ),
            40, 40 );
        }
    }
} void renderuj_mape()
{
    for( int x = 0; x < 40; x++ )
    {
        for( int y = 0; y < 40; y++ )
        {
            blit( teren, bufor,( map[ y ][ x ] % 4 ) * 40,
            ( map[ y ][ x ] / 4 ) * 40,
            x * 40 -( scrollX % 40 ),
            y * 40 -( scrollY % 40 ),
            40, 40 );
        }
    }
}

Dzięki kamillo za pseudokod, ale już sobie poradziłem. Jednak wzmianka o kolizji na pewno się przyda.
A na razie proszę was o słowną podpowiedź co do tego dynamicznego renderowania mapy. Nie lubię gotowców, chyba że w ostateczności, kiedy sam już naprawdę nic z siebie nie wycisnę.
P-45176
radmack
Temat założony przez niniejszego użytkownika
» 2011-12-07 18:13:41
A więc wszystkie problemy dotyczące scrollingu rozwiązane. Mam jeszcze kilka pytań o kolizje, ale to już nowy temat.

Dzięki wszystkim za pomoc.
P-45267
1 « 2 »
Poprzednia strona Strona 2 z 2