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

ALLEGRO Dokładne odbijanie piłki w platformówce

Ostatnio zmodyfikowano 2013-03-02 13:05
Autor Wiadomość
agrere
Temat założony przez niniejszego użytkownika
ALLEGRO Dokładne odbijanie piłki w platformówce
» 2013-03-01 22:51:33
Witam, otóż mam problem, stworzyłem platformówkę z grawitacją tzn. przy odbiciu ustawiam wartosc kierunku.Y na - 20 i z każdym obrotem pętli do jego wartości dodaję 1. Problem polega na tym, że pilka wbija się w platformy. Wiem dlaczego tak się dzieje, ale nie wiem jak to naprawić. Z góry dziękuję za pomoc
Oto fragment kodu:
C/C++
while(...)
{
    ...
   
    draw_sprite( bufor, pilka, x, y );
   
    ...
    y += kierunek.Y;
   
   
    kierunek.Y += 1; //opadanie pilki (grawitacja)
   
   
    if( x + 20 > lewybok[ i ] && x + 10 < lewybok[ i ] + 100 && y + 30 >= yPlatformy[ i ] && y <= yPlatformy[ i ] + 20 && kierunekY > 0 ) //warunek na odbicie pilki
    {
        kierunek.Y = - 20; // nadanie predkosci pilce
        ...
    }
P-77419
ziajek444
» 2013-03-01 23:22:25
if( x + 20 > lewybok[ i ] && x + 10 < lewybok[ i ] + 100 && y + 30 >= yPlatformy[ i ] && y <= yPlatformy[ i ] + 20 && kierunekY > 0 )

piłka nie może spełnić wszystkich tych warunków na raz, więc nie zachodzi żadna interakcja. spróbuj raczej if(x==100) odbicie piłki. //zakładam tu że góra platformy jest na 100 pikselach od góry.
I to samo z resztą ścianek.

aktualizacja 2013-03-02 02:41
Może ten kod ci pomoże (napisałem specjalnie dla ciebie przed snem) :)

C/C++
#include <allegro.h>

int main()
{
    allegro_init();
    install_keyboard();
   
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
   
    BITMAP * tlo = create_bitmap( 800, 600 );
    BITMAP * platforma = create_bitmap( 600, 400 );
    clear_to_color( tlo, makecol( 255, 255, 255 ) );
    clear_to_color( platforma, makecol( 255, 0, 0 ) );
   
   
   
   
    int x = 200, y = 200;
    bool odbicie_x = false;
    bool odbicie_y = false;
    int srednica_pilki = 40;
    int miejsce_x = 100;
    int miejsce_y = 100;
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( platforma, makecol( 255, 0, 0 ) );
        circlefill( platforma, x, y, srednica_pilki, makecol( 64, 64, 64 ) );
        blit( platforma, tlo, 0, 0, miejsce_x, miejsce_y, platforma->w, platforma->h );
        blit( tlo, screen, 0, 0, 0, 0, tlo->w, tlo->h );
       
        if( x == platforma->w - srednica_pilki ) odbicie_x = true;
       
        if( y == platforma->h - srednica_pilki ) odbicie_y = true;
       
        if( x == srednica_pilki ) odbicie_x = false;
       
        if( y == srednica_pilki ) odbicie_y = false;
       
        if( odbicie_x == true ) x--;
       
        if( odbicie_y == true ) y--;
       
        if( odbicie_x == false ) x++;
       
        if( odbicie_y == false ) y++;
       
        rest( 10 );
    }
    readkey();
   
    destroy_bitmap( platforma );
    destroy_bitmap( tlo );
   
    return 0;
}
END_OF_MAIN();
P-77421
agrere
Temat założony przez niniejszego użytkownika
» 2013-03-02 06:44:11
dzieki za kod ale mi zależało na grawitacji, i kiedy ustawiam wartosc kierunekY na wartość 20, to pilka mi skacze co 20pik (y+=kierunekY), potem co 19 itp. i są raczej małe szanse, że trafi dokłanie w punkt 100 czyi gory platformy
P-77425
ziajek444
» 2013-03-02 11:14:40
No to cię nie zrozumiałem, też nad tym pracowałem, zaraz ci podeśle kodzik:

C/C++
#include <allegro.h>

int main()
{
    allegro_init();
    install_keyboard();
   
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 700, 0, 0 );
   
    BITMAP * buffer = create_bitmap( 640, 700 );
    clear_to_color( buffer, 1 );
    int x = 100;
    int y = 400;
    int srednica_pilki = 30;
    bool rzut = false;
    int moc = 0;
    bool spadek = false;
   
    while( !key[ KEY_ESC ] )
    {
        if( key[ KEY_ENTER ] )
        {
            rzut = true;
            moc = 0;
        }
        if( rzut == true )
        {
            x += 10;
            y -= 11;
            moc++;
        }
        if( moc == 20 ) //zwiększ moc do wyzej pleci
        {
            rzut = false;
            spadek = true;
        }
        if( spadek == true )
        {
            x += 10;
            y += 11;
            moc--;
        }
        if( moc == 0 )
        {
            y = 400;
            x = 100;
            spadek = false;
        }
       
       
       
       
        clear_to_color( buffer, 1 );
        rest( 20 );
        circlefill( buffer, x, y, srednica_pilki, makecol( 64, 64, 64 ) );
        blit( buffer, screen, 0, 0, 0, 0, 640, 700 );
    }
    readkey();
   
    destroy_bitmap( buffer );
   
    return 0;
}
END_OF_MAIN();



SPECIALNIE dla ciebie przerobiłem go z Winbgim na allegro 4
P-77439
agrere
Temat założony przez niniejszego użytkownika
» 2013-03-02 13:05:50
dzieki
P-77458
« 1 »
  Strona 1 z 1