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

[C++, Allegro] Problem ze skokiem

Ostatnio zmodyfikowano 2014-04-28 09:53
Autor Wiadomość
Ethril
Temat założony przez niniejszego użytkownika
[C++, Allegro] Problem ze skokiem
» 2014-04-27 17:39:04
Witam o to mój kod
C/C++
#include <allegro.h>
volatile long speed = 0;
void increment_speed()
{
    speed++;
}
END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed );
LOCK_FUNCTION( increment_speed );
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 16 );
    set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 100 ) );
    BITMAP * bufor = NULL;
    BITMAP * ludek = 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( "ludek.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;
    }
    int x = 1; int y = 1;
    const int gravity = 1;
    int groundheight = 400;
    int ludek_x = 0;
    int ludek_y = 400;
   
    while( !key[ KEY_ESC ] )
    {
        if( key[ KEY_LEFT ] ) ludek_x--;
        else
             if( key[ KEY_RIGHT ] ) ludek_x++;
       
        if( key[ KEY_UP ] && ludek_y >= groundheight )
       
             ludek_y -= 100;
        else
        {
            ludek_y += gravity;
           
        }
        if( ludek_y >= groundheight )
             ludek_y = groundheight;
       
       
        speed--;
       
       
       
       
       
       
       
       
       
       
       
       
        clear_to_color( bufor, makecol( 150, 150, 150 ) );
       
        masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h );
        blit( bufor, screen, 0, 0, 0, 0, 640, 480 );
        rest( 1 );
    }
    remove_int( increment_speed );
   
   
   
    destroy_bitmap( ludek );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
Problem jest w tym, że moment spadania jest strasznie szybki i próbowałem różnych metod, żeby zwolnić to, ale nic.
P-108805
pekfos
» 2014-04-27 17:41:23
Masz kod timera, ale go nie używasz.
P-108806
Ethril
Temat założony przez niniejszego użytkownika
» 2014-04-27 20:42:45
Dodałem ten kod timera i teraz odwrotnie jest, że szybko leci do góry, ale prawidłowo leci do dołu

C/C++
int x = 1; int y = 1;
const int gravity = 1;
int groundheight = 400;
int ludek_x = 0;
int ludek_y = 400;

while( !key[ KEY_ESC ] )
while( speed > 0 ) {
    {
        if( key[ KEY_LEFT ] ) ludek_x--;
        else
             if( key[ KEY_RIGHT ] ) ludek_x++;
       
        if( key[ KEY_UP ] && ludek_y >= groundheight )
       
             ludek_y -= 100;
       
       
        else
        {
            ludek_y += gravity;
           
        }
        if( ludek_y >= groundheight )
             ludek_y = groundheight;
       
       
        speed--;
       
    }
P-108815
pekfos
» 2014-04-27 21:15:39
A masz jakiekolwiek spowalnianie lotu do góry?
C/C++
ludek_y -= 100;
P-108816
Ethril
Temat założony przez niniejszego użytkownika
» 2014-04-27 21:17:54
Nie mam, ale na jakiej zasadzie to ma działać ?
P-108817
pekfos
» 2014-04-27 21:19:54
Zapewne jako tako zgodnie z fizyką:
C/C++
if( skok )
     predkosc = - 200;

y += predkosc * czas;

predkosc += grawitacja * czas;
P-108818
Ethril
Temat założony przez niniejszego użytkownika
» 2014-04-27 21:35:08
Ta zmienna "czas" co ma przedstawiać ? Pytam tak, bo dopiero zaczynam z allegro.
P-108820
pekfos
» 2014-04-28 09:53:08
To nie wynika ani z allegro, ani nawet z programowania ogólnie, tylko z podstawowej fizyki. No czas, no.. Jak coś spada sekundę, to podstawiasz sekundę. Jak taką aktualizację wykonujesz co klatkę, to podstawiasz czas od ostatniej klatki, by jedna sekunda gry złożyła się na jedną sekundę ruchu. Jak już masz timer, który jako tako przybliża ten czas do jednej stałej wartości, to podstawiasz, w tym przypadku, jakieś 1./80
P-108837
« 1 »
  Strona 1 z 1