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: #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();
|
|
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); |
|
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ć. |
|
DejaVu |
» 2011-10-09 20:42:47 Nie wiem co Ci działa, ale pewne jest, że poniższe linijki się kupy nie trzymają:
if( t > frame ) frame = sqrt((( 2 * s ) / a ) ) * 10;
if( frame == t ) |
|
wojtu111 |
:) » 2011-10-09 21:03:35 Hymm może po prostu spróbuj coś takiego 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 :) |
|
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źć. |
|
« 1 » |