maniek099 Temat założony przez niniejszego użytkownika |
[Allegro] Mruganie ekranu przy zastosowaniu bufora. » 2010-01-03 17:55:51 Witam wszystkich:) Problem polega na tym, że wszystko ładnie chodzi (identycznie wg. kursu w Code Blocks) lecz gdy generuję program nie na pełnym ekranie tylko w okienku (800x600) to program chodzi płynnie tak jak powinien lecz ikony na pulpicie mrugają (Windows XP Pro SP3). Dlaczego tak się dzieję??
PS A Gdy robię FULLSCREEN 800x600 to z kolei program się uruchamia, wczytuje dobrze bit mapy i myszkę lecz gdy ruszę chwilę myszką program się wiesza i trzeba go zamknąć przez ctrl+alt+del:( |
|
malan |
» 2010-01-03 18:44:27 Może masz jakiś błąd w kodzie. Jeśli możesz to go wklej :). |
|
maniek099 Temat założony przez niniejszego użytkownika |
» 2010-01-04 22:28:37 Proszę o to kod, taki prymitywny ale pisałem wszystkie funkcje z kursu żeby sprawdzić czy chodzą: #include <allegro.h>
inline void init() { allegro_init(); set_color_depth( 16 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0 ); install_timer(); install_keyboard(); install_mouse(); }
int mx = 0, my = 0, mb = 0; void myszka() { if( mx != mouse_x || my != mouse_y || mb != mouse_b ) { mx = mouse_x; my = mouse_y; mb = mouse_b; } }
inline void deinit() { clear_keybuf(); allegro_exit(); }
volatile long speed = 0; void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int main() { init(); textout_ex( screen, font, "Hello World!", 250, 100, makecol( 255, 255, 255 ), 0 ); clear_to_color( screen, makecol( 128, 128, 128 ) ); install_int_ex( increment_speed, BPS_TO_TIMER( 80 ) ); show_mouse( screen ); unscare_mouse(); BITMAP * samochod = NULL; BITMAP * samochod1 = NULL; BITMAP * samochod2 = NULL; BITMAP * samochod3 = NULL; BITMAP * bufor = NULL; samochod1 = load_bmp( "auto1.bmp", default_palette ); samochod2 = load_bmp( "auto2.bmp", default_palette ); samochod3 = load_bmp( "auto3.bmp", default_palette ); samochod = load_bmp( "auto.bmp", default_palette ); if( !samochod ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka!" ); allegro_exit(); return 0; } bufor = create_bitmap( 640, 480 ); if( !bufor ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować bufora!" ); allegro_exit(); return 0; } floodfill( samochod, 1, 1, makecol( 255, 0, 255 ) ); floodfill( samochod1, 1, 1, makecol( 255, 0, 255 ) ); floodfill( samochod2, 1, 1, makecol( 255, 0, 255 ) ); floodfill( samochod3, 1, 1, makecol( 255, 0, 255 ) ); int obraz_x = 40, obraz_y = 40; int frame = 0; while( !key[ KEY_ESC ] ) { while( speed > 0 ) { if( key[ KEY_LEFT ] ) obraz_x--; if( key[ KEY_RIGHT ] ) obraz_x++; if( key[ KEY_UP ] ) obraz_y--; if( key[ KEY_DOWN ] ) obraz_y++; speed--; frame++; if( frame > 80 ) frame = 0; } clear_to_color( bufor, makecol( 128, 128, 128 ) ); if( frame < 20 ) { draw_sprite( bufor, samochod, obraz_x, obraz_y ); } else if( frame >= 20 && frame < 40 ) { draw_sprite( bufor, samochod1, obraz_x, obraz_y ); } else if( frame >= 40 && frame < 60 ) { draw_sprite( bufor, samochod2, obraz_x, obraz_y ); } else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, samochod3, obraz_x, obraz_y ); } else if( frame >= 60 && frame < 80 ) { draw_sprite( bufor, samochod3, obraz_x, obraz_y ); } myszka(); textprintf_ex( bufor, font, 20, 20, makecol( 200, 200, 200 ), - 1, "Myszka x = %d, y = %d, klawisz = %d !", mx, my, mb ); blit( bufor, screen, 0, 0, 0, 0, 640, 480 ); } readkey(); destroy_bitmap( samochod ); destroy_bitmap( samochod1 ); destroy_bitmap( samochod2 ); destroy_bitmap( samochod3 ); destroy_bitmap( bufor ); remove_int( increment_speed ); deinit(); return 0; } END_OF_MAIN()
Mam również inny program bez animacji, timera tylko bufor i myszka i robi się tak samo, ikony pulpitu mrugają a jak się zrobi fullscreen to się program po sekundzie zacina... |
|
malan |
» 2010-01-05 17:48:42 Spróbuj najpierw wczytać wszystkie bitmapy, a potem to: textout_ex( bufor, font, "Hello World!", 250, 100, makecol( 255, 255, 255 ), 0 ); clear_to_color( bufor, makecol( 128, 128, 128 ) );
...wyświetlić na buforze. |
|
maniek099 Temat założony przez niniejszego użytkownika |
» 2010-01-08 12:03:20 Nie bardzo rozumiem, bo u mnie najpierw czyszczony jest bufor, potem rysowane są na nim obrazki w zalezlnosci od wcisnietego klawisza i czasu(animacja) i potem sczytywana jest pozycja myszki, wypisana jest ona na buforze i potem cały bufor przerzucany jest na screen'a. A Ty napisałeś, żeby najpierw wszystko wyświetlić na buforze, potem go wyczyścić (clear to color) i potem wyświetlić bufor, to przecież jednolity ekran mi się wyświetli (czysty bufor). Jak zamieniłem tylko clear to color(bufor) z przed tymi wszystkimi frame, myszka() itd. na sam koniec pętli, po wyświetleniu już bufora, to już mniej mrugają ikony na pulpicie ale jednak nadal mrugają... |
|
malan |
» 2010-01-08 14:44:49 Mi chodziło tylko o to, żebyś nic nie wyświetlał na ekranie (screen) tylko wszystko na buforze. |
|
maniek099 Temat założony przez niniejszego użytkownika |
» 2010-01-08 21:41:13 Ale tam na screen'ie jest tylko wyświetlony tekst hello world i wyczyszczony jest ekran na siwo, ale potem i tak czyszczenie byfora i reszta funkcji jest w pętli while, wiec tak czy siak niczego to nie zmienia:/
Ma ktoś inny pomysł?? |
|
KrQ |
» 2010-01-08 23:11:31 oczywiscie że mam, blokujesz sobie pentlą while speed>0 caly program, umiesc w niej wszystko razem z wyświetlaniem i powinno ruszyć.
dlaczego wypełniasz bitmapy z obrazkami? czysci sie tylko bufor nie obrazki, chyba że chcesz by ci sie bitmapa wypełniała na podany kolor, i by powstawał piękny prostokąt. |
|
« 1 » 2 |