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ść
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?
P-45000
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.
P-45019
SeaMonster131
» 2011-12-01 16:39:21
Hm...możesz coś w stylu tego zrobić:
C/C++
int cameraX = 0, cameraY = 0;

if( klawisz_w_lewo )
     cameraX++;

//itd

void Wyswietl_mape()
{
    // petla for itd
    wyswietl_kafelek( x * szerokosc_kafelka + cameraX, y * dlugosc_kafelka + cameraY );
}
P-45038
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?
P-45052
Gabes
» 2011-12-02 13:08:21
Dokumentacja wszystko ci powie http://cpp0x.pl/dokumentacja/?nro=210
P-45054
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?
P-45066
SeaMonster131
» 2011-12-03 10:15:43
Hm.. mapę trzymasz w tablicy tak ? To zrób np takie wyświetlanie:
C/C++
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 )
        //itd
       
    }
}
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..
C/C++
if( klawisz_w_lewo )
{
    if( cameraX >= 100 ) //np 100, koniec mapy
    {
        //tutaj jeszcze ograniczenie np, żeby gracz nie wychodził poza mape
        graczX++;
    }
    else
         cameraX++;
   
}
To są tylko przykłady :)
P-45082
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.

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--; }
        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.
P-45122
« 1 » 2
  Strona 1 z 2 Następna strona