pekfos |
» 2011-12-04 21:05:34 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? |
|
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. |
|
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. if( w_lewo ) { if( mapa_x - przesuniecie >= 0 ) { mapa_x -= przesuniecie; } if( ludek_x - przesuniecie_ludka >= 0 && !kolizja( ludek_x, ludek_y ) ) { mapa_x -= przesuniecie; } }
Nie wiem nad czym Ty chcesz tu tak myśleć ? |
|
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 :) 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ę: 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ę. |
|
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. |
|
1 « 2 » |