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

[Allegro] Scrolling mapy

Ostatnio zmodyfikowano 2008-05-24 00:09
Autor Wiadomość
Ju1ian
Temat założony przez niniejszego użytkownika
[Allegro] Scrolling mapy
» 2008-05-19 17:11:55
Witam! Za nic nie mogę wpaść na to, jak zrobić efekt scrollingu mapy taki sam jak w Mario Forever, albo jakimś innym nowszym Mario. Czy ktoś wie o co chodzi i jak mi pomóc? Z góry wielkie dzięki. Umieszczam kod z moimi próbami:
C/C++
bool kolizja( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
   
    return( false );
};

#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 );
int przycisk_x = 50, przycisk_y = 300;

int mx = 0, my = 0, mb = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};


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 ) );
    install_mouse();
    show_mouse( screen );
    unscare_mouse();
   
    //clear_to_color(screen, makecol(300,300,300));
   
    BITMAP * klocki = NULL;
    BITMAP * niebo = NULL;
    BITMAP * ludekb = NULL;
    BITMAP * bufor = NULL;
    BITMAP * platfa = NULL;
    BITMAP * drzewo = NULL;
   
   
   
    int zycie = 100;
   
    bufor = load_bmp( "data/gfx/bufor.bmp", default_palette );
   
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc bufora !" );
        allegro_exit();
        return 0;
    }
    klocki = load_bmp( "data/gfx/klocki.bmp", default_palette );
    ludekb = load_bmp( "data/gfx/ludek.bmp", default_palette );
    niebo = load_bmp( "data/gfx/niebo.bmp", default_palette );
    platfa = load_bmp( "data/gfx/platforma.bmp", default_palette );
    drzewo = load_bmp( "data/gfx/drzewo.bmp", default_palette );
   
    if( !ludekb )
    {
       
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge zaladowac obrazka Ludek !" );
        allegro_exit();
        return 0;
    }
    int klocki_x = 0, klocki_y = 370;
    int klocki2_x = 0, klocki2_y = 370;
    int platfa_x = 350, platfa_y = 250;
    int drzewo_x = 800, drzewo_y = 80;
    float ludek_ruch_y = 8;
    int niebo_x = 0, niebo_y = 0;
    int niebo2_x = 0, niebo2_y = 0;
    ludek.y = 0;
    ludek.x = 100;
    int frame = 0;
    ludek.klatka = 0;
    ludek.kierunek = 0;
    int mapa_x = 0, mapa2_x = 0;
    int ekran_x = 640;
    int obraz_x = ekran_x;
    long int koniec = 1500;
    while( !key[ KEY_ESC ] )
    {
        niebo_x = - mapa2_x % ekran_x;
        niebo2_x = ekran_x - mapa2_x % ekran_x;
        klocki_x = - mapa_x % ekran_x;
        klocki2_x = ekran_x - mapa_x % ekran_x;
        //mapa_x++;
        while( speed > 0 )
        {
            //ludek.kierunek = 0;
            if( key[ KEY_RIGHT ] && koniec <= 570 )
            {
                ludek.x += 2;
                ludek.kierunek = 2;
            }
            // && ludek.x!=0
            if( key[ KEY_LEFT ] && mapa_x == 0 )
            {
                ludek.x -= 2;
                ludek.kierunek = 3;
            }
           
            //ludek.x==570 && ludek.x!=koniec
           
            else if( key[ KEY_RIGHT ] && koniec > 570 ) {
                platfa_x -= 2;
                koniec -= 2;
                ludek.x == 570;
                ludek.kierunek = 2;
                mapa_x += 2;
                drzewo_x -= 2;
                mapa2_x += 1;
            }
            // && mapa_x>0 && mapa2_x>0
            else if( key[ KEY_LEFT ] && koniec > 570 && ludek.x != 570 ) {
                platfa_x += 2;
                koniec += 2;
                drzewo_x += 2;
                ludek.x == 0;
                ludek.kierunek = 3;
                mapa_x -= 2;
                mapa2_x -= 1;
            }
            if( koniec <= 570 && ludek.x == 570 && key[ KEY_LEFT ] ) {
                ludek.x += 2;
                ludek.kierunek = 2;
            }
            if( mapa_x < 0 ) mapa_x = 0;
           
            if( mapa2_x < 0 ) mapa2_x = 0;
           
            if( ludek.x < 0 ) ludek.x = 0;
           
            if( ludek.x >= koniec ) ludek.x = koniec;
           
            if( koniec < 570 ) koniec = 570;
            //if (ludek.x<=poczatek_x && key[KEY_LEFT]) {
            //ludek.x=poczatek_x;
            //}
            myszka();
            if( ludek.y != klocki_y - 53 && kolizja( ludek.x, ludek.y, 60, 60, platfa_x, platfa_y, platfa->w, platfa->h ) == false )
                 ludek.kierunek = 1;
            //obsługa osi Y
            if(( key[ KEY_UP ] ) &&( ludek_ruch_y == 0 ) &&( ludek.y == klocki_y - 53 || ludek.y == platfa_y - 52 ) ) {
                ludek_ruch_y =- 8;
            }
            ludek.y += ludek_ruch_y;
            if(( ludek.y + ludek_ruch_y >= klocki_y - 53 ) &&( ludek.y <= klocki_y - 53 ) )
            {
                ludek_ruch_y = 0;
                ludek.y = klocki_y - 53;
            } else
            {
                ludek_ruch_y += 0.2;
            }
           
            if( kolizja( ludek.x, ludek.y, 60, 60, platfa_x, platfa_y, platfa->w, platfa->h ) == true )
            {
                if(( ludek_ruch_y > 0 ) &&( ludek.y >= platfa_y - 52 ) &&( ludek.y - ludek_ruch_y <= platfa_y - 52 ) )
                {
                    ludek_ruch_y = 0;
                    ludek.y = platfa_y - 52;
                }
            }
            speed--;
            if( key[ KEY_LEFT ] || key[ KEY_RIGHT ] ||( ludek.y != klocki_y - 53 && kolizja( ludek.x, ludek.y, 60, 60, platfa_x, platfa_y, platfa->w, platfa->h ) == false ) )
                 frame += 1;
           
            if( frame > 40 ) frame = 0;
           
        }
        //  rest(10);
        if( frame < 20 ) { ludek.klatka = 0; }
        else if( frame >= 20 && frame < 40 ) { ludek.klatka = 1; }
        clear_to_color( bufor, makecol( 150, 255, 0 ) );
        blit( niebo, bufor, 0, 0, niebo_x, niebo_y, niebo->w, niebo->h );
        blit( niebo, bufor, 0, 0, niebo2_x, niebo2_y, niebo->w, niebo->h );
        masked_blit( platfa, bufor, 0, 0, platfa_x, platfa_y, platfa->w, platfa->h );
        masked_blit( ludekb, bufor, ludek.kierunek * 60, ludek.klatka * 60, ludek.x, ludek.y, 60, 60 );
        masked_blit( drzewo, bufor, 0, 0, drzewo_x, drzewo_y, drzewo->w, drzewo->h );
        blit( klocki, bufor, 0, 0, klocki_x, klocki_y, klocki->w, klocki->h );
        blit( klocki, bufor, 0, 0, klocki2_x, klocki2_y, klocki->w, klocki->h );
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
    if( key[ KEY_ESC ] ) {
        allegro_message( "No dobra..." );
    }
    destroy_bitmap( klocki );
    destroy_bitmap( niebo );
    destroy_bitmap( ludekb );
    destroy_bitmap( bufor );
    destroy_bitmap( platfa );
    destroy_bitmap( drzewo );
    allegro_exit();
    return 0;
}

END_OF_MAIN();
P-767
DejaVu
» 2008-05-19 20:56:20
Możesz opisać jak taki scrolling wygląda w tych 'nowszych' grach? Wiem jak wygląda staaaaare bardzo stare Mario... :)
P-768
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-05-20 16:50:00
Właśnie o to chodzi, że nie wiem jak to opisać xD Tu masz link do Mario Forever:
http://www.idg.pl/ftp/gry_1935/Mario.Forever..html
P-769
DejaVu
» 2008-05-22 19:21:01
Wystarczy zrobić kilka zmiennych do nieba. Jedna część chmur będzie się przesuwała z prędkością np 5, a druga z prędkością 7. Dodatkowo cała mapa będzie się przesuwała jeśli ludek będzie się przesuwał, czyli dodajesz lub odejmujesz prędkość ludka do nieba.
P-775
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-05-23 09:48:40
Nie chodzi o to xD Chodzi mi tylko o to, żeby mapa się przesuwała, gdy ludek będzie na środku, a gdy dojdzie do końca to mapa się już nie przesuwa tylko ludek dochodzi do końca, tak samo jak wróci do początku. Teraz rozumiesz ?? ;P
P-776
DejaVu
» 2008-05-23 10:28:15
Nie widzę ludka na mapie w przykładzie, który dałeś... daj kod w którym ludek będzie widoczny, to będzie można coś poprawić. Jeśli u siebie widzisz ludzika to podaj wymiary tekstur, bo może mam za duże/za małe.

W każdym razie to może wyglądać mniej więcej tak:
C/C++
if( poz_ludek_x - scroll_mapa_x <( szerokosc_ekranu / 2 ) ) scroll_mapa_x = poz_ludek_x -( szerokosc_ekranu / 2 );

if( scroll_mapa_x < 0 ) scroll_mapa_x = 0;

if( poz_ludek_x < 0 ) poz_ludek_x = 0;

if( poz_ludek_x - scroll_mapa_x >( szerokosc_ekranu / 2 ) ) scroll_mapa_x = poz_ludek_x -( szerokosc_ekranu / 2 );

if( scroll_mapa_x > KONIEC_MAPY_X ) scroll_mapa_x = KONIEC_MAPY_X;

if( poz_ludek_x > KONIEC_MAPY_X + szerokosc_ekranu ) poz_ludek_x = KONIEC_MAPY_X + szerokosc_ekranu;

P-778
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-05-23 19:20:12
To scrollmapa to jest mapa_x i mapa2_x???
I zupełnie nie wiem jak to wpleść w kod.
Tutaj masz mój folder data: http://www.speedyshare.com/274913850.html
P-782
DejaVu
Scrolling mapy - platformówka
» 2008-05-23 20:47:37
Scrolling mapy - platformówka:
C/C++
bool kolizja( float x1, float y1, float s1, float w1, float x2, float y2, float s2, float w2 )
{
    if( x1 + s1 >= x2 && x1 <= x2 + s2 && y1 + w1 >= y2 && y1 <= y2 + w2 ) return( true );
   
    return( false );
};

#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 );
int przycisk_x = 50, przycisk_y = 300;

int mx = 0, my = 0, mb = 0;
void myszka()
{
    if( mx != mouse_x || my != mouse_y || mb != mouse_b )
    {
        mx = mouse_x;
        my = mouse_y;
        mb = mouse_b;
    }
};


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 ) );
    install_mouse();
    show_mouse( screen );
    unscare_mouse();
   
    //clear_to_color(screen, makecol(300,300,300));
   
    BITMAP * klocki = NULL;
    BITMAP * niebo = NULL;
    BITMAP * ludekb = NULL;
    BITMAP * bufor = NULL;
    BITMAP * platfa = NULL;
    BITMAP * drzewo = NULL;
   
   
   
    int zycie = 100;
   
    bufor = load_bmp( "data/gfx/bufor.bmp", default_palette );
   
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyc bufora !" );
        allegro_exit();
        return 0;
    }
    klocki = load_bmp( "data/gfx/klocki.bmp", default_palette );
    ludekb = load_bmp( "data/gfx/ludek.bmp", default_palette );
    niebo = load_bmp( "data/gfx/niebo.bmp", default_palette );
    platfa = load_bmp( "data/gfx/platforma.bmp", default_palette );
    drzewo = load_bmp( "data/gfx/drzewo.bmp", default_palette );
   
    if( !ludekb )
    {
       
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge zaladowac obrazka Ludek !" );
        allegro_exit();
        return 0;
    }
    int klocki_x = 0, klocki_y = 370;
    int klocki2_x = 0, klocki2_y = 370;
    int platfa_x = 350, platfa_y = 250;
    int drzewo_x = 800, drzewo_y = 80;
    float ludek_ruch_y = 8;
    int niebo_x = 0, niebo_y = 0;
    int niebo2_x = 0, niebo2_y = 0;
    ludek.y = 0;
    ludek.x = 100;
    int frame = 0;
    ludek.klatka = 0;
    ludek.kierunek = 0;
    int mapa_x = 0, mapa2_x = 0;
    int ekran_x = 640;
    int obraz_x = ekran_x;
    int scrolling_x = 0;
    long int koniec = 640;
    while( !key[ KEY_ESC ] )
    {
        niebo_x = - mapa2_x % ekran_x;
        niebo2_x = ekran_x - mapa2_x % ekran_x;
        klocki_x = - mapa_x % ekran_x;
        klocki2_x = ekran_x - mapa_x % ekran_x;
        //mapa_x++;
        while( speed > 0 )
        {
           
            if( key[ KEY_RIGHT ] )
            {
                ludek.x += 2;
                ludek.kierunek = 2;
            } else
            if( key[ KEY_LEFT ] )
            {
                ludek.x -= 2;
                ludek.kierunek = 3;
            } else
            {
                ludek.kierunek = 0;
            }
            if( ludek.x < 0 ) ludek.x = 0;
           
            if( ludek.x > koniec + ekran_x - 60 ) ludek.x = koniec + ekran_x - 60;
           
            scrolling_x = ludek.x - ekran_x / 2;
            if( scrolling_x < 0 ) scrolling_x = 0;
           
            if( scrolling_x > koniec ) scrolling_x = koniec;
           
            myszka();
            if( ludek.y != klocki_y - 53 && kolizja( ludek.x, ludek.y, 60, 60, platfa_x, platfa_y, platfa->w, platfa->h ) == false )
                 ludek.kierunek = 1;
            //obsługa osi Y
            if(( key[ KEY_UP ] ) &&( ludek_ruch_y == 0 ) &&( ludek.y == klocki_y - 53 || ludek.y == platfa_y - 52 ) ) {
                ludek_ruch_y =- 8;
            }
            ludek.y += ludek_ruch_y;
            if(( ludek.y + ludek_ruch_y >= klocki_y - 53 ) &&( ludek.y <= klocki_y - 53 ) )
            {
                ludek_ruch_y = 0;
                ludek.y = klocki_y - 53;
            } else
            {
                ludek_ruch_y += 0.2;
            }
           
            if( kolizja( ludek.x, ludek.y, 60, 60, platfa_x, platfa_y, platfa->w, platfa->h ) == true )
            {
                if(( ludek_ruch_y > 0 ) &&( ludek.y >= platfa_y - 52 ) &&( ludek.y - ludek_ruch_y <= platfa_y - 52 ) )
                {
                    ludek_ruch_y = 0;
                    ludek.y = platfa_y - 52;
                }
            }
            speed--;
            if( key[ KEY_LEFT ] || key[ KEY_RIGHT ] ||( ludek.y != klocki_y - 53 && kolizja( ludek.x, ludek.y, 60, 60, platfa_x, platfa_y, platfa->w, platfa->h ) == false ) )
                 frame += 1;
           
            if( frame > 40 ) frame = 0;
           
        }
        //  rest(10);
        if( frame < 20 ) { ludek.klatka = 0; }
        else if( frame >= 20 && frame < 40 ) { ludek.klatka = 1; }
        clear_to_color( bufor, makecol( 150, 255, 0 ) );
        blit( niebo, bufor, 0, 0, niebo_x - scrolling_x, niebo_y, niebo->w, niebo->h );
        blit( niebo, bufor, 0, 0, niebo2_x - scrolling_x, niebo2_y, niebo->w, niebo->h );
        masked_blit( platfa, bufor, 0, 0, platfa_x - scrolling_x, platfa_y, platfa->w, platfa->h );
        masked_blit( ludekb, bufor, ludek.kierunek * 60, ludek.klatka * 60, ludek.x - scrolling_x, ludek.y, 60, 60 );
        masked_blit( drzewo, bufor, 0, 0, drzewo_x - scrolling_x, drzewo_y, drzewo->w, drzewo->h );
        blit( klocki, bufor, 0, 0, klocki_x - scrolling_x, klocki_y, klocki->w, klocki->h );
        blit( klocki, bufor, 0, 0, klocki2_x - scrolling_x, klocki2_y, klocki->w, klocki->h );
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
    }
    if( key[ KEY_ESC ] ) {
        allegro_message( "No dobra..." );
    }
    destroy_bitmap( klocki );
    destroy_bitmap( niebo );
    destroy_bitmap( ludekb );
    destroy_bitmap( bufor );
    destroy_bitmap( platfa );
    destroy_bitmap( drzewo );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-783
« 1 » 2
  Strona 1 z 2 Następna strona