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: 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; };
Cpostac ludek;
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(); 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; while( speed > 0 ) { if( key[ KEY_RIGHT ] && koniec <= 570 ) { ludek.x += 2; ludek.kierunek = 2; } if( key[ KEY_LEFT ] && mapa_x == 0 ) { ludek.x -= 2; ludek.kierunek = 3; } 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; } 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; 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; 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; } 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(); |
|
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... :) |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-05-20 16:50:00 |
|
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. |
|
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 |
|
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: 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;
|
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-05-23 19:20:12 |
|
DejaVu |
Scrolling mapy - platformówka » 2008-05-23 20:47:37 Scrolling mapy - platformówka: 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; };
Cpostac ludek;
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(); 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; 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; 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; } 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();
|
|
« 1 » 2 |