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-17 19:18:11
1. Nie wiem, bo to kod EasyKodera:
C/C++
bool kolizja( float x1, float y1, float s1, float w1, int x2, int y2, int s2, int w2 )
{
    if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true;
    else return false;
   
};

if( kolizja( ludek_x, ludek_y, ludek->w, ludek->h, platfa_x, platfa_y, platfa->h,
platfa->w ) == true )
{
    ludek_y = platfa_y - 110;
}
 2. Oto kod:
C/C++
if( key[ KEY_UP ] || key[ KEY_SPACE ] )
     if( ludek_y == klocki_y ) ludek_ruch_y =- 10;

ludek_x += ludek_ruch_x;
ludek_y += ludek_ruch_y;

if( ludek_ruch_x > 0.1 ) ludek_ruch_x -= 0.5; else
if( ludek_ruch_x <- 0.1 ) ludek_ruch_x += 0.5; else ludek_ruch_x = 0;
if( ludek_y < 270 ) { ludek_ruch_y += 0.3; }
if( ludek_y > klocki_y ) {
    ludek_y = klocki_y;
}
3. Nie, tego problemu nie mam rozwiązanego.
Dziękuję za odpowiedź.
P-548
DejaVu
» 2008-04-17 20:07:46
Ad 1. Ostatnie dwa parametry funkcji są w złej kolejności
Ad 3.
C/C++
//obsługa osi Y
if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( ludek_y == klocki_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;
}

Nie wiem jak masz cały program zbudowany i jak masz zapewnioną obsługę klocków na różnej wysokości... w każdym razie może to wyglądać mniej więcej tak, jak napisałem to powyżej.
P-549
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-04-17 21:35:02
Niestety to nie działa ;/
P-550
DejaVu
» 2008-04-18 00:15:52
To daj pełny kod - koło 18 zobaczę co trzeba poprawić.
P-551
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-04-18 14:02:13
Oto kod:
C/C++
bool kolizja( float x1, float y1, float s1, float w1, int x2, int y2, int w2, int s2 )
{
    if( x2 <= x1 + s1 && x2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 <= x1 + s1 && x2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 >= y1 && y2 <= y1 + w1 ) return true; else
    if( x2 + s2 <= x1 + s1 && x2 + s2 > x1 && y2 + w2 >= y1 && y2 + w2 <= y1 + w1 ) return true;
    else 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 = 270;
    int platfa_x = 50, platfa_y = 250;
    float ludek_ruch_y;
    float a = 5, b = 2;
    int drzewko_x = 620, drzewko_y = 240;
    int niebo_x = 0, niebo_y = 0;
    float ludek_y = 270, ludek_x = 100;
   
    textprintf_ex( klocki, font, 20, 20, makecol( 0, 0, 0 ), - 1, "Zycie: %d", zycie );
    while( !key[ KEY_ESC ] )
    {
        //if (ludek_x==130) {
        //                 zycie-=20;
        //}
        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;
        }
        if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( ludek_y == klocki_y || ludek_y == platfa_y - 110 ) ) 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 if( key[ KEY_UP ] )
        {
            ludek_ruch_y += 0.3;
            ludek_y += ludek_ruch_y;
        }
       
       
        if( ludek_y < 270 &&( kolizja( ludek_x, ludek_y, ludek->w, ludek->h, platfa_x, platfa_y, platfa->h, platfa->w ) == true ) )
        {
            ludek_y = platfa_y - 110;
        }
       
        if( ludek_x == 640 ) {
            ludek_x = 0;
        }
        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->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();
Dziękuję Ci bardzo, że poświęcasz dla mnie swój czas.
P-553
DejaVu
» 2008-04-18 17:44:33
Poprawienie inicjacji:
C/C++
float ludek_ruch_y = 0;
Poprawić obsługę osi Y w pętli:
C/C++
//obsługa osi X

//obsługa osi Y
if(( key[ KEY_UP ] || key[ KEY_SPACE ] ) &&( ludek_y == klocki_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;
}
P-556
Ju1ian
Temat założony przez niniejszego użytkownika
» 2008-04-18 19:48:34
Moje problemy z kolizją znajdziesz na tym filmiku. Trochę zarywa i nie interesuj się napisem "Zycie: 100" ;)
http://www.youtube.com/watch?v=CFRETYO1SLQ
P-558
DejaVu
» 2008-04-19 12:29:47
Tak... ten algorytm kolizji co obecnie masz coś dziwnie działa. Zaraz go poprawię.
P-559
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona