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

[Allegro] Kolizje w platformówce ;)

Ostatnio zmodyfikowano 2008-04-19 16:20
Autor Wiadomość
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-04-19 12:46:49
I w dodatku (mogłeś tego nie zauważyć) grawitacja jest tak mocna, że jak stoję na krawędzi platformy to ciągle ciągnie mnie na ziemię, a:
if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( kolizja( ludek_x, ludek_y, ludek->w, ludek->h, platfa_x, platfa_y, platfa->h, platfa->w ) == true ) ) ludek_ruch_y =- 10;
powinno wszystkie problemy rozwiązać (jeśli chodzi o grawitację)...
P-560
DejaVu
Rozwiązanie
» 2008-04-19 13:35:26
To powinno rozwiązywać wszystkie wymienione wcześniej problemy
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>

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(300,300,300));
   
    BITMAP * klocki = NULL;
    BITMAP * niebo = NULL;
    BITMAP * ludek = 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 );
    ludek = 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( !ludek )
    {
       
        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 = 50, platfa_y = 250;
    float ludek_ruch_y = 0;
    int niebo_x = 0, niebo_y = 0;
    float ludek_y = 370, ludek_x = 100;
    textprintf_ex( klocki, font, 20, 20, makecol( 0, 0, 0 ), - 1, "Zycie: %d", zycie );
    while( !key[ KEY_ESC ] )
    {
        if( zycie == 0 ) {
            allegro_message( "Przegrałes! Walnales sie o przeszkode i masz 0 punktow zycia ;)" );
            allegro_exit();
            return 0;
        }
       
        //obsluga klawiszy;
        if( key[ KEY_RIGHT ] )
        {
            ludek_x += 2;
        }
        if( key[ KEY_LEFT ] )
        {
            ludek_x -= 2;
        }
       
        //obsługa osi Y
        if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( ludek_ruch_y == 0 ) &&( ludek_y == klocki_y || ludek_y == platfa_y ) ) ludek_ruch_y =- 10;
       
        ludek_y += ludek_ruch_y;
        if(( ludek_y + ludek_ruch_y >= klocki_y ) &&( ludek_y <= klocki_y ) )
        {
            ludek_ruch_y = 0;
            ludek_y = klocki_y;
        } else
        {
            ludek_ruch_y += 0.3;
        }
       
        if( kolizja( ludek_x, ludek_y - ludek->h, ludek->w, ludek->h, platfa_x, platfa_y, platfa->w, platfa->h ) == true )
        {
            if(( ludek_ruch_y > 0 ) &&( ludek_y >= platfa_y ) &&( ludek_y - ludek_ruch_y <= platfa_y ) )
            {
                ludek_ruch_y = 0;
                ludek_y = platfa_y;
            }
        }
        rest( 10 );
       
        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( ludek, bufor, 0, 0, ludek_x, ludek_y - ludek->h, ludek->w, ludek->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( ludek );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}

END_OF_MAIN();
P-561
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-04-19 14:29:25
Dzięki ;) Co ja bym bez ciebie zrobił... ;D
P-563
DejaVu
» 2008-04-19 14:33:24
Byś walczył sam lub gdzieś indziej :)
/edit:
Zamykam śluzę :p
P-564
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-04-19 14:44:47
Ojć, wykryłem poważnego buga. Gdy skoczy się z "ziemi na ziemię", to ludzik "zapada się pod ziemię", czyli po prostu nie wykrywa kolizji z podłożem.
@up Co racja, to racja ;P
P-565
DejaVu
» 2008-04-19 15:52:26
W tym kodzie co wkleiłem ludek nie zapada się pod ziemię.
P-568
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-04-19 15:55:06
Aha, no tak, bo cośtam grzebałem z wysokością skoku ;)
P-569
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-04-19 16:04:42
Hmmm... A co jeśli chcę mieć kilka platform??
P-570
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona