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

Problem z: Przesuwaniem grafiki [allegro]

Ostatnio zmodyfikowano 2011-10-15 09:56
Autor Wiadomość
Tymianek
Temat założony przez niniejszego użytkownika
Problem z: Przesuwaniem grafiki [allegro]
» 2011-10-09 12:32:06
Mam problem ze zrobieniem ruchu jednostajnie przyspieszonego obiektu,
chciałbym aby 'obiekt.bmp' przesuwał się co piksel przyspieszając (czas pomiędzy kolejnymi wyświetleniami ma się zmniejszać  czas = pierwiastek( 2 * numer piksela / przyspieszenie) ), jednak obiekt ten zatrzymuje się co chwilę.
Jak temu zaradzić?
oto mój kod:

C/C++
#include <allegro.h>
#include <math.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, 800, 600, 0, 0 );
    install_timer();
    install_int_ex( increment_speed, BPS_TO_TIMER( 10 ) );
    BITMAP * bufor = NULL;
    BITMAP * obiekt = NULL;
   
    bufor = create_bitmap( 800, 600 );
    if( !bufor )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge utworzyz bufora !" );
        allegro_exit();
        return 0;
    }
   
    obiekt = load_bmp( "obiekt.bmp", default_palette );
    if( !obiekt )
    {
        set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
        allegro_message( "Nie moge zaladowac obrazka obiekt !" );
        allegro_exit();
        return 0;
    }
   
    int x = 400
    , y = 30
    , s = 1
    , a = 10
    , t = 0
    , frame = 0;
   
   
    while( !key[ KEY_ESC ] )
    {
       
        while( speed > 0 )
        {
            t++;
            speed--;
        }
       
        if( t > frame )
             frame = sqrt((( 2 * s ) / a ) ) * 10;
       
        if( frame == t )
        {
            y++;
            clear_to_color( bufor, makecol( 150, 150, 150 ) );
            masked_blit( obiekt, bufor, 0, 0, x, y, obiekt->w, obiekt->h );
            blit( bufor, screen, 0, 0, 0, 0, 800, 600 );
            s++;
            if( y > 600 ) y = 0;
           
        }
    }
    remove_int( increment_speed );
    destroy_bitmap( obiekt );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();
P-41875
pekfos
» 2011-10-09 18:38:23
a może realizuj przyspieszenie ze wzorów fizycznych zamiast swoimi metodami ze zwiększaniem fps (co ci jak widać nie wychodzi);
P-41882
Tymianek
Temat założony przez niniejszego użytkownika
» 2011-10-09 19:36:16
Czyli że jak?
Przecież zwiększam drogę zgodnie ze wzorami fizycznymi.
A jeśli się mylę to proszę mnie poprawić.
P-41888
DejaVu
» 2011-10-09 20:42:47
Nie wiem co Ci działa, ale pewne jest, że poniższe linijki się kupy nie trzymają:
C/C++
if( t > frame )
     frame = sqrt((( 2 * s ) / a ) ) * 10;

if( frame == t )
P-41891
wojtu111
:)
» 2011-10-09 21:03:35
Hymm może po prostu spróbuj coś takiego
C/C++
a = 1;
t = 0;
...
...
if( key[ KEY_RIGHT ] && xd < 50 )
{
    xd = a * t;
    t++;
}
...
...
...
masced_blit( rysunek, buffor, xd, yd, 0, 0,...,...)
Nie wiem czy będzie działać bo nie testowałem ale pokombinuj coś powinno być dobrze :)
P-41892
Tymianek
Temat założony przez niniejszego użytkownika
» 2011-10-15 09:56:28
Dzięki za wskazówki, mój obrazek pięknie już śmiga po ekranie.
Wielkim błędem, jaki zrobiłem było zwiększanie częstości wyświetlania obrazka, zamiast tego wyświetlam go co równe odstępy czasu, licząc przy tym miejsce w którym ma się znaleźć.
P-42122
« 1 »
  Strona 1 z 1