Ju1ian Temat założony przez niniejszego użytkownika |
[Allegro] Scrollowanie mapy » 2008-05-10 10:28:18 Mam 2 pytania: 1) Mam proste scrollowanie mapy (gdy idę tam kwiatki itp. się przewijają), tylko nie wiem jak zrobić żeby niebo i ziemia się przewijały. To znaczy gdy już ziemia się troszeczkę przewinie to ten zasłonięty obszar ziemi przerzuca się na początek (mam nadzieję, że wiesz o co mi chodzi). 2) Nie wiem jak podzielić kod na funkcję menu i granie. Oto mój kod: 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; 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 ); 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 platfa_x = 350, platfa_y = 250; float ludek_ruch_y = 8; int niebo_x = 0, niebo_y = 0; ludek.y = 0; ludek.x = 100; int frame = 0; ludek.klatka = 0; ludek.kierunek = 0; long int poczatek_x = 0; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_RIGHT ] && ludek.x != 570 ) { ludek.x += 2; ludek.kierunek = 2; } else if( key[ KEY_LEFT ] && ludek.x != 0 ) { ludek.x -= 2; ludek.kierunek = 3; } else if( ludek.x == 570 && key[ KEY_RIGHT ] ) { platfa_x -= 2; ludek.x == 570; ludek.kierunek = 2; } else if( ludek.x == 0 && key[ KEY_LEFT ] && poczatek_x != ludek.x ) { platfa_x += 2; ludek.x == 0; ludek.kierunek = 3; } 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 ); masked_blit( platfa, bufor, 0, 0, platfa_x, platfa_y, platfa->w, platfa->h ); masked_blit( klocki, bufor, 0, 0, klocki_x, klocki_y, klocki->w, klocki->h ); masked_blit( ludekb, bufor, ludek.kierunek * 60, ludek.klatka * 60, ludek.x, ludek.y, 60, 60 ); 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 ); allegro_exit(); return 0; }
END_OF_MAIN();
|
|
DejaVu |
Scrollowanie bitmapy (lewo/prawo) » 2008-05-10 11:17:51 Załóżmy że: mapa_x - obecne przesunięcie mapy ekran_x - szerokość ekranu (np. 800px) obraz_x==ekran_x - zakładamy że szerokość obrazu jest taka sama jak ekranu 1. Metoda prosta scrollingu: rysuj 2 tła obok siebie (wzór na początkową współrzędną x dla nieba i ziemii): int tlo1_x = - mapa_x % ekran_x; int tlo2_x = ekran_x - mapa_x % ekran_x;
2. Metoda trudniejsza (chyba): Wycinaj uciętą część obrazu i wklejaj ją w miejscu w którym powinna się znaleźć Jeśli jest funkcja w allegro do rysowania wybranego fragmentu bitmapy, to wyglądałoby to tak: int ekran_x = 800; int obraz_x = 300; int mapa_x = 50;
int i = obraz_x -( mapa_x % obraz_x ); rysuj_fragment_bitmapy( bufor, 0, 0, tlo, mapa_x % obraz_x, 0, i, obraz_y ); for(; i < ekran_x - obraz_x; i += obraz_x ) rysuj_fragment_bitmapy( bufor, i, 0, tlo, 0, 0, obraz_x, obraz_y );
if( i < ekran_x ) rysuj_fragment_bitmapy( bufor, i, 0, tlo, 0, 0, ekran_x - i, obraz_y );
Powyższy kod powinien działać prawidłowo dla dowolnego rozmiaru obrazu. |
|
DejaVu |
Podział kodu » 2008-05-10 11:21:50 Inicjację trybu graficznego i zamykanie zostaw w main'ie, cały kod gry wyciągnij do osobnej funkcji i w niej deklaruj zmienne, rysuj grafikę itp. Menu również wyciągnij do osobnej funkcji. Jak zrobisz grę to dorobisz do niej menu. W menu zrobisz sobie przycisk start, który jeśli bedzie kliknięty to wywoła funkcję gry. Po zakończeniu gry (przegranej/wygranej) gra automatycznie powróci do menu. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-05-10 13:38:25 Rysowanie fragmentu bitmapy w Allegro jest na 100%. W Allegro można zrobić dużo efektów z bitmapami. Dzięki, problem już rozwiązany, ale nie zamykaj tematu, może mi się jeszcze przydać ;) |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-05-10 13:50:37 Oj, coś nie działa z tą 1 metodą. Powinno być dobrze, ale niebo się nie przesuwa: 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; 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 ); 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 platfa_x = 350, platfa_y = 250; 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 poczatek_x = 0; int mapa_x = 0, ekran_x = 640; int obraz_x = ekran_x; niebo_x = - mapa_x % ekran_x; niebo2_x = ekran_x - mapa_x % ekran_x; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_RIGHT ] && ludek.x != 570 ) { ludek.x += 2; ludek.kierunek = 2; } else if( key[ KEY_LEFT ] && ludek.x != 0 ) { ludek.x -= 2; ludek.kierunek = 3; } else if( ludek.x == 570 && key[ KEY_RIGHT ] ) { platfa_x -= 2; ludek.x == 570; ludek.kierunek = 2; mapa_x += 2; } else if( ludek.x == 0 && key[ KEY_LEFT ] && poczatek_x != ludek.x ) { platfa_x += 2; ludek.x == 0; ludek.kierunek = 3; } 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( klocki, bufor, 0, 0, klocki_x, klocki_y, klocki->w, klocki->h ); masked_blit( ludekb, bufor, ludek.kierunek * 60, ludek.klatka * 60, ludek.x, ludek.y, 60, 60 ); 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 ); allegro_exit(); return 0; }
END_OF_MAIN();
|
|
DejaVu |
Rozwiązanie (scrolling nieba) » 2008-05-10 14:03:02 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; 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 ); 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 platfa_x = 350, platfa_y = 250; 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 poczatek_x = 0; int mapa_x = 0, ekran_x = 640; int obraz_x = ekran_x; while( !key[ KEY_ESC ] ) { niebo_x = - mapa_x % ekran_x; niebo2_x = ekran_x - mapa_x % ekran_x; mapa_x++; while( speed > 0 ) { if( key[ KEY_RIGHT ] && ludek.x != 570 ) { ludek.x += 2; ludek.kierunek = 2; } else if( key[ KEY_LEFT ] && ludek.x != 0 ) { ludek.x -= 2; ludek.kierunek = 3; } else if( ludek.x == 570 && key[ KEY_RIGHT ] ) { platfa_x -= 2; ludek.x == 570; ludek.kierunek = 2; mapa_x += 2; } else if( ludek.x == 0 && key[ KEY_LEFT ] && poczatek_x != ludek.x ) { platfa_x += 2; ludek.x == 0; ludek.kierunek = 3; } 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( klocki, bufor, 0, 0, klocki_x, klocki_y, klocki->w, klocki->h ); masked_blit( ludekb, bufor, ludek.kierunek * 60, ludek.klatka * 60, ludek.x, ludek.y, 60, 60 ); 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 ); allegro_exit(); return 0; }
END_OF_MAIN(); |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-05-10 16:13:24 Już prawie wszystko działa, ale gdy dojeżdżam do "początku" mapy, to podłoże i niebo mi zanika. Próbowałem zrobić niewidzalny obiekt, który się przesuwa tak samo jak platforma, ale jeżeli miał współrzędne mniejsze niż 0, to zanikał. Dziwne, bo gdy platforma ma współrzędne mniejsze niż 0 to nie znika, tylko działa tak jak powinno. |
|
DejaVu |
» 2008-05-10 17:08:37 nie rozumiem :) |
|
« 1 » 2 |