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

[Allegro] Scrolling mapy w samochodówce

Ostatnio zmodyfikowano 2008-11-03 21:14
Autor Wiadomość
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:
C/C++
#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ę.

P-2370
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=mapa

Jak byś coś nie rozumiał to pytaj. Mam nadzieję, że Ci coś pomogłem. ;)
P-2374
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
P-2382
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.
P-2386
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.
P-2422
DejaVu
» 2008-11-03 18:48:52
Zapodaj więc kodem.
P-2423
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:
C/C++
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
P-2424
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:
C/C++
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.
P-2425
« 1 » 2
  Strona 1 z 2 Następna strona