Bartaz Temat założony przez niniejszego użytkownika |
[Allegro, C++] Problem z rysowaniem myszką po ekranie » 2010-07-04 21:47:19 A wiec tak wszystko chodzi rysuje tylko tak jakby allegro nie nadarzala za ruchami myszki jak wolno sie rysuje to jest dobrze a jak szybko ruszy myszka to robi sie tylko pare kropek . Daje screena. http://yfrog.com/6fhhhhhhhhhhhhhhhhhhhhhhhlji kod: #include <allegro.h> bool czy_zaznaczony_olowek = false; BITMAP * bufor = NULL; BITMAP * kartka = NULL; BITMAP * przycisk_olowek = NULL; BITMAP * olowek = NULL; void draw() { if( mouse_x > 7 && mouse_x < 7 + przycisk_olowek->w && mouse_y > 70 && mouse_y < 70 + przycisk_olowek->h ) { clear_to_color( przycisk_olowek, makecol( 3, 100, 3 ) ); } else { clear_to_color( przycisk_olowek, makecol( 255, 0, 0 ) ); } if( mouse_x > 7 && mouse_x < 7 + przycisk_olowek->w && mouse_y > 70 && mouse_y < 70 + przycisk_olowek->h && mouse_b == 1 ) { czy_zaznaczony_olowek = true; clear_to_color( przycisk_olowek, makecol( 110, 7, 30 ) ); } if( czy_zaznaczony_olowek == true && mouse_b == 1 ) { mouse_x = mouse_x; masked_blit( olowek, kartka, 0, 0, mouse_x - 100, mouse_y - 30, olowek->w, olowek->h ); } }; int main() { allegro_init(); install_keyboard(); install_mouse(); unscare_mouse(); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1000, 700, 0, 0 ); bufor = create_bitmap( 1000, 700 ); kartka = create_bitmap( 790, 600 ); przycisk_olowek = create_bitmap( 70, 30 ); olowek = create_bitmap( 3, 3 ); clear_to_color( kartka, makecol( 255, 255, 255 ) ); clear_to_color( przycisk_olowek, makecol( 255, 0, 0 ) ); clear_to_color( olowek, makecol( 255, 0, 0 ) ); while( !key[ KEY_ESC ] ) { draw(); clear_to_color( bufor, makecol( 110, 110, 110 ) ); masked_blit( kartka, bufor, 0, 0, 100, 30, kartka->w, kartka->h ); masked_blit( przycisk_olowek, bufor, 0, 0, 7, 70, przycisk_olowek->w, przycisk_olowek->h ); textprintf_ex( bufor, font, 15, 75, makecol( 0, 0, 0 ), - 1, "OLOWEK" ); show_mouse( bufor ); masked_blit( bufor, screen, 0, 0, 0, 0, 1000, 700 ); } allegro_exit(); return( 0 ); } END_OF_MAIN();
|
|
DejaVu |
» 2010-07-04 21:57:29 Hm... zapewne musiałbyś się podpiąć pod kolejkę komunikatów okna Allegro i na każde OnMouseMove rysować po buforze. Generalnie sprawa do najprostszych nie należy :) |
|
ison |
» 2010-07-04 21:58:24 wg mnie najprostsze rozwiązanie tego problemu to rysowanie linii od poprzednio zapamiętanej pozycji kursora do aktualnej przykładowy kawałek kodu: int mx = mouse_x; int my = mouse_y; if( mouse_b == 1 ) line( bufor, ostatnie_mx, ostatnie_my, mx, my, makecol( 255, 0, 0 ) );
ostatnie_mx = mx; ostatnie_my = my;
//edit tak przy okazji to rozśmieszyła mnie jedna linijka w twoim kodzie: jest zdecydowanie niezbędna do poprawnego funkcjonowania programu :D |
|
Bartaz Temat założony przez niniejszego użytkownika |
... » 2010-07-04 22:19:21 Tak wiem to pozastalosci po probie naprawieniu tego opoznienia. A ogolnie to mi tamto nie dziala... Ale jak sie fajnie to zmodyfikuje to fajny efekt wychodzi no ale to nie na temat xD |
|
ison |
» 2010-07-04 22:55:06 co ci znowu nie działa?? tu masz przykład z użyciem mojej metody #include <allegro.h>
BITMAP * bufor = NULL;
int main() { allegro_init(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); bufor = create_bitmap( 800, 600 ); install_keyboard(); install_mouse(); int ostatnie_mx = 0; int ostatnie_my = 0; while( !key[ KEY_ESC ] ) { int mx = mouse_x; int my = mouse_y; if( mouse_b == 1 ) line( bufor, ostatnie_mx, ostatnie_my, mx, my, makecol( 255, 0, 0 ) ); ostatnie_mx = mx; ostatnie_my = my; blit( bufor, screen, 0, 0, 0, 0, bufor->w, bufor->h ); rectfill( screen, mx - 1, my - 1, mx + 1, my + 1, makecol( 0, 255, 0 ) ); } allegro_exit(); return( 0 ); } END_OF_MAIN();
u mnie działa perfekcyjnie... |
|
« 1 » |