Ju1ian Temat założony przez niniejszego użytkownika |
[Allegro] Scrolling mapy w samochodówce » 2008-10-30 18:40:43 Witam! Piszę sobię samochodówkę 2d i nie wiem jak zrobić przewijanie mapy. Chciałbym, aby szło to tak: jest się na samym dole, jest start i jedzie się do góry i przy końcu jest zakręt i wraca się na miejsce startu (takie kółeczko). Jak to zrobić. Umieszczam swój kod, ludek to jest samochód: #include <allegro.h> #include <math.h> int main() { allegro_init(); install_keyboard(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 ); clear_to_color( screen, makecol( 128, 128, 128 ) ); BITMAP * bufor = NULL; BITMAP * ludek = NULL; BITMAP * ziemia = NULL; 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; } ludek = load_bmp( "ludekk.bmp", default_palette ); ziemia = load_bmp( "ziemia.bmp", default_palette ); if( !ludek ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka Ludek !" ); allegro_exit(); return 0; } double predkosc = 0; double kat = 90.0; double pozycja_x = 150.0; double pozycja_y = 100.0; while( !key[ KEY_ESC ] ) { if( key[ KEY_LEFT ] && predkosc != 0 ) kat -= 0.4; if( key[ KEY_RIGHT ] && predkosc != 0 ) kat += 0.4; if( key[ KEY_UP ] ) predkosc += 0.03; if( key[ KEY_DOWN ] ) predkosc -= 0.01; if( predkosc > 20 ) predkosc = 20; if( predkosc <- 10 ) predkosc =- 10; if( key[ KEY_SPACE ] ) predkosc -= 0.04; if( key[ KEY_SPACE ] && predkosc <= 0 ) predkosc = 0; predkosc *= 0.99; pozycja_x += predkosc * cos(( kat * M_PI ) / 180.0 ); pozycja_y += predkosc * sin(( kat * M_PI ) / 180.0 ); clear_to_color( bufor, makecol( 150, 150, 150 ) ); blit( ziemia, bufor, 0, 0, 0, 0, 640, 480 ); rotate_sprite( bufor, ludek,( int ) round( pozycja_x ),( int ) round( pozycja_y ), ftofix(( kat * 256 ) / 360.0 ) ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } destroy_bitmap( ludek ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
Z góry dziękuję. |
|
lynx |
» 2008-10-30 19:11:00 Nie będę się wgłębiał kod, bo nie mam na tyle czasu i chęci, jednak podam Ci linka do dobrego tutka o scrollingu w allegro: http://www.easykoder.yoyo.pl/index.php?mm=mapaJak byś coś nie rozumiał to pytaj. Mam nadzieję, że Ci coś pomogłem. ;) |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-10-30 19:45:26 Wiem już tamto czytałem i już zrobiłem kiedyś w platformówce scrolling, ale teraz nie wiem jak zrobić tak jak napisałem. Na rysunku to będzie coś takiego: ___ |......| |......| |___| oczywiście z przewijaniem |
|
DejaVu |
» 2008-10-30 23:23:40 Przewijanie mapy możesz zrobić za pomocą operacji modulo, czyli wyświetlanie klocka jak miałeś wcześniej przykładowo: PokazKlocek( nrx, nry ); możesz zrobić tak: PokazKlocek( nrx % maxx, nry % maxy ); W ten sposób licznik nigdy nie wykroczy poza zakres tablicy, a co więcej wróci na początek, czyli uzyskasz scrolling. To jest oczywiście przedstawienie toku rozumowania, a przełożyć na własny kod musisz sobie sam. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-11-03 18:44:30 Za cholerę nie mogę tego zrobić... Próbowałem przełożyć to z mojej starej platformówki, ale nic się nie działo. |
|
DejaVu |
» 2008-11-03 18:48:52 Zapodaj więc kodem. |
|
Ju1ian Temat założony przez niniejszego użytkownika |
» 2008-11-03 19:00:24 Podałem go na początku, ale jesli chodzi ci o scrolling to: int mapa_y = 0, mapa2_y = 0; int ekran_y = 480; int obraz_y = ekran_y; int scrolling_y = 0; long int koniec = 640;
ziemia_y = - mapa2_y % ekran_y; ziemia2_y = ekran_y - mapa2_y % ekran_y; if( pozycja_y < 0 ) pozycja_y = 0;
if( pozycja_y > koniec + ekran_y - 60 ) pozycja_y = koniec + ekran_y - 60;
scrolling_y = pozycja_y - ekran_y / 2; if( scrolling_y < 0 ) scrolling_y = 0;
if( scrolling_y > koniec ) scrolling_y = koniec;
I przy wyświetlaniu odejmuje od pozycji_y, ziemia_y i ziemia2_y - scrolling_y |
|
DejaVu |
» 2008-11-03 20:12:10 Hm... czy mapa to będzie jeden plik bmp, czy też będzie składana z klocków? Bo jeśli ma się mapa scrollować jako jedna bitmapa to: void RysujKlocekMapy( int f_ix, int f_iy ) { blit( ziemia, bufor, 0, 0, f_ix, f_iy, 640, 480 ); }
void RysujMape( double f_dx, double f_dy ) { int t_ix = static_cast < int >( f_dx ) % mapa_x; int t_iy = static_cast < int >( f_dy ) % mapa_y; RysujKlocekMapy( t_ix, t_iy ); RysujKlocekMapy( t_ix - mapa_x, t_iy ); RysujKlocekMapy( t_ix, t_iy - mapa_x ); RysujKlocekMapy( t_ix - mapa_x, t_iy - mapa_x ); }
Przedstawiony kod nie należy do najwydajniejszych, jednak jeśli zajdzie taka potrzeba można go zoptymalizować w razie potrzeby. |
|
« 1 » 2 |