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

[Allegro]Scrollowanie mapki

Ostatnio zmodyfikowano 2009-02-22 18:03
Autor Wiadomość
PhonniX
Temat założony przez niniejszego użytkownika
[Allegro]Scrollowanie mapki
» 2009-02-21 14:31:42
Witam. Od niedawna piszę swoją grę i ni ewiem jak zrobić scrolling, który płynnie przewija mapkę. Oto mój kod:
C/C++
#include <allegro.h>

class Cpostac
{
public:
    int x, y;
    short int kierunek, klatka;
};
// Zmienna naszej klasy
Cpostac ludek;
// Inicjowanie timera
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );

// Zmienne potrzebne do mapy
int mapa_x = 0, mapa_y = 0;
BITMAP * teren = NULL;
BITMAP * bufor = NULL;

// DEFINICJA MAPY
short int map[ 40 ][ 20 ] =
{
    15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 4, 9, 10, 10, 10, 8, 3, 5, 15, 0, 2, 2, 2, 1, 15,
    2, 1, 15, 15, 15, 15, 7, 10, 10, 10, 6, 15, 15, 15, 7, 10, 10, 10, 6, 15,
    10, 6, 15, 15, 15, 15, 4, 9, 10, 10, 6, 15, 15, 15, 4, 3, 3, 3, 5, 15,
    10, 12, 2, 1, 15, 15, 15, 7, 10, 8, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    10, 10, 10, 6, 15, 15, 15, 4, 3, 5, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2,
    10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2, 13, 10, 10,
    3, 3, 3, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 10, 10, 10, 8, 3,
    15, 15, 15, 15, 15, 0, 1, 15, 15, 15, 15, 15, 0, 2, 13, 10, 10, 10, 6, 15,
    15, 15, 15, 15, 15, 4, 5, 15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 6, 15,
    15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 4, 9, 10, 10, 10, 8, 3, 5, 15, 0, 2, 2, 2, 1, 15,
    2, 1, 15, 15, 15, 15, 7, 10, 10, 10, 6, 15, 15, 15, 7, 10, 10, 10, 6, 15,
    10, 6, 15, 15, 15, 15, 4, 9, 10, 10, 6, 15, 15, 15, 4, 3, 3, 3, 5, 15,
    10, 12, 2, 1, 15, 15, 15, 7, 10, 8, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    10, 10, 10, 6, 15, 15, 15, 4, 3, 5, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2,
    10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2, 13, 10, 10,
    3, 3, 3, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 10, 10, 10, 8, 3,
    15, 15, 15, 15, 15, 0, 1, 15, 15, 15, 15, 15, 0, 2, 13, 10, 10, 10, 6, 15,
    15, 15, 15, 15, 15, 4, 5, 15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 6, 15,
    15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 4, 9, 10, 10, 10, 8, 3, 5, 15, 0, 2, 2, 2, 1, 15,
    2, 1, 15, 15, 15, 15, 7, 10, 10, 10, 6, 15, 15, 15, 7, 10, 10, 10, 6, 15,
    10, 6, 15, 15, 15, 15, 4, 9, 10, 10, 6, 15, 15, 15, 4, 3, 3, 3, 5, 15,
    10, 12, 2, 1, 15, 15, 15, 7, 10, 8, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    10, 10, 10, 6, 15, 15, 15, 4, 3, 5, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2,
    10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2, 13, 10, 10,
    3, 3, 3, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 10, 10, 10, 8, 3,
    15, 15, 15, 15, 15, 0, 1, 15, 15, 15, 15, 15, 0, 2, 13, 10, 10, 10, 6, 15,
    15, 15, 15, 15, 15, 4, 5, 15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 6, 15,
    15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15,
    15, 15, 15, 15, 15, 4, 9, 10, 10, 10, 8, 3, 5, 15, 0, 2, 2, 2, 1, 15,
    2, 1, 15, 15, 15, 15, 7, 10, 10, 10, 6, 15, 15, 15, 7, 10, 10, 10, 6, 15,
    10, 6, 15, 15, 15, 15, 4, 9, 10, 10, 6, 15, 15, 15, 4, 3, 3, 3, 5, 15,
    10, 12, 2, 1, 15, 15, 15, 7, 10, 8, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15,
    10, 10, 10, 6, 15, 15, 15, 4, 3, 5, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2,
    10, 10, 10, 6, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 2, 2, 13, 10, 10,
    3, 3, 3, 5, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 7, 10, 10, 10, 8, 3,
    15, 15, 15, 15, 15, 0, 1, 15, 15, 15, 15, 15, 0, 2, 13, 10, 10, 10, 6, 15,
    15, 15, 15, 15, 15, 4, 5, 15, 15, 15, 15, 15, 7, 10, 10, 10, 10, 10, 6, 15
};

// Funkcja wyświetlająca mapę:
void wys_mape()
{
    int licznik_x, licznik_y;
    for( licznik_x = 0; licznik_x < 16; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 12; licznik_y++ )
        {
            blit( teren, bufor,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 4 ) * 40,
            ( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 4 ) * 40,
            licznik_x * 40, licznik_y * 40, 40, 40 );
        }
    }
};

// Funkcja Główna
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) );
   
    BITMAP * ludekb = NULL;
   
    // Tworzenie bufora
    bufor = create_bitmap( 640, 480 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie mogę utworzyć bufora !" );
        allegro_exit();
        return 0;
    }
    // Ładowanie grafiki
    ludekb = load_bmp( "postac.bmp", default_palette );
    teren = load_bmp( "teren.bmp", default_palette );
   
    // Ustalanie początkowej pozycji ludzika
    int frame = 0;
    ludek.x = 300;
    ludek.y = 200;
    ludek.klatka = 0;
    ludek.kierunek = 0;
   
    while( !key[ KEY_ESC ] )
    {
        while( speed > 0 )
        {
            if( key[ KEY_LEFT ] ) { mapa_x--; ludek.kierunek = 1; ludek.x -= 2; frame++; }
            if( key[ KEY_RIGHT ] ) { mapa_x++; ludek.kierunek = 2; ludek.x += 2; frame++; }
            if( key[ KEY_UP ] ) { mapa_y--; ludek.kierunek = 3; ludek.y -= 2; frame++; }
            if( key[ KEY_DOWN ] ) { mapa_y++; ludek.kierunek = 0; ludek.y += 2; frame++; }
            speed--;
           
            if( frame >= 40 ) frame = 0;
           
        }
        // Czyszczenie bufora
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
        // Wyświetlanie mapy
        wys_mape();
       
        // Sterowanie animacją
        if( frame >= 0 && frame < 10 ) { ludek.klatka = 0; }
        else if( frame >= 10 && frame < 20 ) { ludek.klatka = 1; }
        else if( frame >= 20 && frame < 30 ) { ludek.klatka = 2; }
        else if( frame >= 30 && frame < 40 ) { ludek.klatka = 3; }
        //Wyświetlanie ludzika
        masked_blit( ludekb, bufor, ludek.klatka * 32, ludek.kierunek * 48, 300, 200, 32, 48 );
       
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
    // Usuwanie wszystkiego z pamięci.
    remove_int( increment_speed );
    destroy_bitmap( ludekb );
    destroy_bitmap( teren );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

Z góry dziękuje :)
P-4309
TGR
» 2009-02-21 14:55:20
P-4310
PhonniX
Temat założony przez niniejszego użytkownika
» 2009-02-21 15:22:40
Zajrzałeś chociaż w kod? Napisałem tą mapkę na tym przykładzie...
P-4312
TGR
» 2009-02-21 15:43:12
Zauważyłem to. Skoro sugerowałeś się na kodzie z tej strony to powinienes zauwazyc kawalek kodu:

C/C++
// SCROLLOWANIE MAPY
if(( key[ KEY_RIGHT ] ) &&( mapa_x < 10 ) ) { mapa_x = mapa_x + 1; } else
if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) ) { mapa_x = mapa_x - 1; } else
if(( key[ KEY_DOWN ] ) &&( mapa_y < 5 ) ) { mapa_y = mapa_y + 1; } else
if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }
P-4313
PhonniX
Temat założony przez niniejszego użytkownika
» 2009-02-21 17:38:16
 
C/C++
if( key[ KEY_LEFT ] ) { mapa_x--; ludek.kierunek = 1; ludek.x -= 2; frame++; }
if( key[ KEY_RIGHT ] ) { mapa_x++; ludek.kierunek = 2; ludek.x += 2; frame++; }
if( key[ KEY_UP ] ) { mapa_y--; ludek.kierunek = 3; ludek.y -= 2; frame++; }
if( key[ KEY_DOWN ] ) { mapa_y++; ludek.kierunek = 0; ludek.y += 2; frame++; }
u mnie to tak wygląda, i daje taki efekt, że po kliknięciu klawisza przeskakuje o 1 kratkę, a ja chcę, żeby płynnie to przechodziło...
P-4317
DejaVu
» 2009-02-21 19:54:24
Jeśli chcesz mieć płynne przechodzenie musisz inaczej sobie to oprogramować. Zasadniczo powinieneś mieć coś w tym stylu:
C/C++
int scrollX = 0;
int scrollY = 0;
while(...)
{
    //tu obsługa klawiatury (modyfikacja scrollX i scrollY)
    if( scrollX < 0 ) scrollX = 0;
   
    if( scrollY < 0 ) scrollY = 0;
   
    int startMapaX = scrollX / 32; //32 to szerokość tekstury (teren)
    int startMapaY = scrollY / 32; //32 to wysokość tekstury (teren)
    rysujMape( bufor, startMapaX, startMapaY, scrollX % 32, scrollY % 32 ); //To funkcja która rysuje mapę z przesunięciem scrollingowym
} //while

Funkcja rysuj mapę powinna wyglądać mniej więcej tak:
C/C++
void rysujMape( BITMAP * bufor, int startMapaX, int startMapaY, int scrollX, int scrollY )
{
    for( int y = startMapaY; y < startMapaY + 10; y++ )
    for( int x = startMapaX; x < startMapaX + 10; x++ )
    {
        renderujTeksture( bufor, tekstura[ y ][ x ],( x - startMapaX ) * 32 + scrollX,( y - startMapaY ) * 32 + scrollY );
    }
   
}
To jest takie rozwiązanie pi razy drzwi ale powinno Cię na to naprowadzić na pełne rozwiązanie.
P-4320
PhonniX
Temat założony przez niniejszego użytkownika
» 2009-02-22 12:13:04
Nie umiem podpiąć tego pod swój skrypt :/ czy ktoś mógł by mi pomóc?
P-4329
DejaVu
» 2009-02-22 16:24:24
Zacznij od zmiany sterowania klawiaturą (tj. żeby zmieniała Ci się wartość zmiennych scrollX i scrollY). Oblicz górne granice scrollingu (czyli jeśli miałeś mapaX<5, to teraz będzie scrollX<5*32).
Później ustal, od którego klocka powinna się mapa rysować (wyznaczając startX=scrollX/32; ).
Na końcu popraw kod odpowiedzialny za rysowanie mapy.
P-4346
« 1 » 2
  Strona 1 z 2 Następna strona