radmack Temat założony przez niniejszego użytkownika |
[Allegro, C++] Płynny scrolling mapy » 2011-11-30 21:50:16 Witam. Jako że coś tam w C++ ogarniam, postanowiłem napisać grę RPG w Allegro na zaliczenie. Mapa kafelkowa, scrolling, wszystko cacy. No tak, scrolling... Potrzebuję pomocy w związku z płynnym przewijaniem mapy co 1px. Tutorial Easykodera pokazuje jak zrobić scrollowanie co jeden kafel, u mnie jest to 40px. Będę wdzięczny za każdą wskazówkę dotyczącą tego płynnego przewijania. A, i kolejna sprawa. Jak mam "kazać" postaci dochodzić do końca mapy, gdy dalszy scrolling nie będzie możliwy? |
|
pekfos |
» 2011-12-01 08:10:07 podziel przesuwanie na n klatek i przesuwaj cały obraz o rozmiar/n w wybranym kierunku. jak przesuwasz cały obraz to będziesz miał nie pokryty kaflami pasek (tam skąd mapę przesuwasz) więc dorób if w funkcji rysującej by rysowała o jeden rząd/kolumnę więcej. |
|
SeaMonster131 |
» 2011-12-01 16:39:21 Hm...możesz coś w stylu tego zrobić: int cameraX = 0, cameraY = 0;
if( klawisz_w_lewo ) cameraX++;
void Wyswietl_mape() { wyswietl_kafelek( x * szerokosc_kafelka + cameraX, y * dlugosc_kafelka + cameraY ); }
|
|
radmack Temat założony przez niniejszego użytkownika |
» 2011-12-02 09:59:35 Seamonster, te dwa argumenty, które podałeś, odnoszą się do których z sześciu w funkcji blit? Kminię od wczoraj, jakby to zrobić i nie mogę nic wymyślić. Może jakieś dalsze wskazówki? |
|
Gabes |
» 2011-12-02 13:08:21 |
|
radmack Temat założony przez niniejszego użytkownika |
» 2011-12-02 20:48:05 Ok, z pomocą dokumentacji, kolegi i dokładnego przeanalizowania kodu krok po kroku udało mi się zrobić płynny scrolling. Ale jak wiadomo czasem jeden problem rodzi drugi, tak więc teraz, po zrobieniu scrollingu powstał problem z szarą przestrzenią między kolumną/rzędem wyświetlanych kafli a brzegiem ekranu. To znaczy funkcja wyświetla kolumnę/rząd kafli dopiero, gdy jest akurat tyle miejsca, aby to zrobić. Jeśli mam 39px u boku ekranu, to te 39px jest zamalowywane na szaro. Mam nadzieję, że dobrze zobrazowałem wam ten problem. Jak mam kazać grze wyświetlać te dodatkowe kolumny/rzędy? Mam wycinać odpowiednie kawałki z bitmapy z kaflami (to chyba wolniejsze rozwiązanie), czy może raczej w jakiś sposób mam wyświetlić dodatkowy rząd poza ekranem?
I ponawiam pytanie o kazaniu bohaterowi podchodzenia do brzegu ekranu, gdy dalszy scrolling jest niemożliwy. Wiąże się z tym też kolejna kwestia, mianowicie zablokowanie scrollowania u brzegów tablicy z mapą. W przeciwnym razie mapa dalej randomuje się w sposób bezsensowny.
Możecie mi pomóc? |
|
SeaMonster131 |
» 2011-12-03 10:15:43 Hm.. mapę trzymasz w tablicy tak ? To zrób np takie wyświetlanie: for( int y = 0; y < dlugosc_mapy; y++ ) { for( int x = 0; x < szerokosc_mapy; x++ ) { if( mapa[ y ][ x ] == 1 ) wyswietl_kafelek( trawa, x * szerokosc_kafelka + cameraX, y * dlugosc_kafelka + cameraY ) } }
Jeżeli chcesz to zoptymalizować i zwiększyć FPS (jeżeli masz np dużą tablicę) to daj ograniczenie rysowania tylko tego co znajduje się na ekranie. A te drugie pytanie.. if( klawisz_w_lewo ) { if( cameraX >= 100 ) { graczX++; } else cameraX++; }
To są tylko przykłady :) |
|
radmack Temat założony przez niniejszego użytkownika |
» 2011-12-04 13:24:24 Hmm siedzę i rozumuję, dlaczego instrukcja sterująca odmawia współpracy. 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--; } if(( key[ KEY_LEFT ] ) &&( mapa_x == 0 ) &&( ludek_x > 0 ) ) { ludek_x--; } if(( key[ KEY_RIGHT ] ) &&( mapa_x < 20 * 40 ) &&( ludek_x ==( SCREEN_W / 2 ) -( ludek->w / 2 ) ) ) { scrollX++; mapa_x++; } if(( key[ KEY_RIGHT ] ) &&( mapa_x == SCREEN_W ) &&( ludek_x < SCREEN_W ) ) { ludek_x++; } if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) &&( ludek_x ==( SCREEN_H / 2 ) -( ludek->h / 2 ) ) ) { scrollY--; mapa_y--; } if(( key[ KEY_UP ] ) &&( mapa_y == 0 ) &&( ludek_y > 0 ) ) { ludek_y--; } if(( key[ KEY_DOWN ] ) &&( ludek_y < SCREEN_H ) &&( mapa_y < 15 * 40 ) ) { scrollY++; mapa_y++; } if(( key[ KEY_DOWN ] ) &&( mapa_x == SCREEN_H ) &&( ludek_y < SCREEN_H ) ) { ludek_y++; } speed--; }
Czy ktoś mógłby mi to poprawić? Bo ja nie mam już żadnego pomysłu, instrukcja działa niewłaściwie. |
|
« 1 » 2 |