Bartaz Temat założony przez niniejszego użytkownika |
[Allegro, C++] Wyświetlanie myszki » 2010-07-04 19:53:45 Witam mam taki kod i chodzi mi o to , ze myszka wyswietla sie albo wcale alo na przycisku olowek albo na bitmapie kartka i nie wiem jak zrobic zeby wyswietlalo sie wszedzie: Probowalem zrobic tak ze zrobilem bitmape wielkosci screen'a i dalem jej kolor 255,0,255 zeby jej nie bylo widac tylko ze ja i tak bylo widac co bylo dziwne . To ma byc program podobny do painta. Kod: #include <allegro.h> int main() { allegro_init(); install_keyboard(); install_mouse(); unscare_mouse(); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 1000, 700, 0, 0 ); BITMAP * bufor = NULL; BITMAP * kartka = NULL; BITMAP * przycisk_olowek = NULL; bufor = create_bitmap( 1000, 700 ); kartka = create_bitmap( 790, 600 ); przycisk_olowek = create_bitmap( 70, 30 ); clear_to_color( kartka, makecol( 255, 255, 255 ) ); clear_to_color( przycisk_olowek, makecol( 255, 0, 0 ) ); while( !key[ KEY_ESC ] ) { show_mouse( bufor ); 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" ); masked_blit( bufor, screen, 0, 0, 0, 0, 1000, 700 ); clear_to_color( bufor, makecol( 110, 110, 110 ) ); } allegro_exit(); return( 0 ); } END_OF_MAIN();
|
|
DejaVu |
» 2010-07-04 20:29:43 1) czyść bufor 2) rysuj wszystko na buforze 3) narysuj myszkę na buforze 4) przekopiuj bufor na ekran /edit: show_mouse( bufor ); Nie używaj również powyższej linijki. Na forum wielokrotnie pisałem już, że należy pobierać pozycję myszki i rysować bitmapę w jej miejscu jeżeli używa się buforowania - w przeciwnym wypadku nici z myszy. |
|
Bartaz Temat założony przez niniejszego użytkownika |
... » 2010-07-04 21:39:03 Problem rozwiazany wielkie dzieki ale teraz mam taki problem inny nie chce juz nowego temamu robic . Przez ten problem kiedys porzucilem podobny projekt bo nikt nie wiedzial jak to naprawic... 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:43:44 Jeden problem = jeden temat :)
/edit: W każdym razie problem wynika z tego, że odświeżanie gry masz np. 60 razy na sekundę, a pozycja myszki w systemie Windows jest odświeżana np. 2000 razy na sekundę. Ty rysujesz punkty gdy jest odświeżanie ekranu, a nie odświeżane myszki stąd też to działa jak działa. |
|
ison |
» 2010-07-04 21:50:01 Niestety, aby wyeliminować ten problem musiałbyś przebudować trochę twój kod. Najlepszym rozwiązaniem (według mnie) byłoby rysowanie linii zamiast poszczególnych kropek w miejscach gdzie aktualnie znajduje się mysz. Linia miałaby być rysowana od poprzednio zapamiętanego punktu do aktualnego. W ten sposób nawet po szybkim ruchu myszki i tak narysowana zostałaby kreska a nie same punkty. (oczywiście oprócz tego dobrze byłoby aby rysowanie tych linii i zapamiętywanie nowej pozycji kursora odbywało się w jak najszybszym tempie, nie chcemy przecież przy rysowaniu okręgu zamiast koła mieć n-kąt :)) |
|
Bartaz Temat założony przez niniejszego użytkownika |
... » 2010-07-04 21:50:35 To jak ja mam rysowac to wtedy kiedy jest odswierzanie myszki?
|
|
ison |
» 2010-07-04 21:53:24 przykładowy kawałek kodu: line( bufor, poprzednie_mouse_x, poprzednie_mouse_y, mouse_x, mouse_y, makecol( 255, 0, 0 ) ); poprzednie_mouse_x = mouse_x; poprzednie_mouse_y = mouse_y;
coś takiego załatwiłoby sprawę ;) |
|
DejaVu |
» 2010-07-04 21:53:48 |
|
« 1 » |