Giedzu Temat założony przez niniejszego użytkownika |
[Allegro]Przesuwanie własnych kontrolek myszką » 2012-04-26 07:12:09 Witam, próbuję napisać sobie jakieś GUI przy pomocy allegro, jakoś idzie, ale doszedłem do momentu gdy mam pomyślmy okienko z informacją i chce je przesuwać swobodnie myszką po ekranie. Doszedłem do czegoś takiego ale wydaje mi się że pozycje tego okienka trzeba jakoś inaczej wyliczyć ale nie mogę już nic wymyślić :P. Tutaj kod, skompilujcie i sami zobaczcie, przesuwanie LPM ofc. Kod jest mało czytelny wiem o tym, bo to jest taki projekcik na boku, i dopiero początek. Prosiłbym o jakąś pomoc, dziękuję ;). Ta część która mnie męczy:P if( unique == 0 ) { winx =( mx * width ) / EkranSzerokosc; winy =( my * height ) / EkranWysokosc; }
A tutaj cały kod. #include <allegro.h>
#define EkranSzerokosc 640 #define EkranWysokosc 480
volatile long speed = 0;
void increment_speed() { speed++; } END_OF_FUNCTION( increment_speed );
LOCK_VARIABLE( speed ); LOCK_FUNCTION( increment_speed );
int mx = 0; int my = 0; int mb = 0;
int winx = 200; int winy = 200;
int flag = 0; bool click = false;
int club = 0; int axe = 0; int sword = 0; int pkt = 500;
void Pause( int zmienna ) { rest( zmienna ); } void DrawCButton( BITMAP * bufor, BITMAP * button, int posx, int posy, int width, int height ) { blit( button, bufor, 0, 0, posx, posy, width, height ); } void OnCButton( BITMAP * button, int posx, int posy, int width, int height, char text[], int unique ) { clear_to_color( button, makecol( 150, 150, 150 ) ); if( mx > posx && mx < posx + width && my > posy && my < posy + height && mb == 1 && flag == 0 ) { flag = 1; click = true; } if( click && flag == 1 ) { clear_to_color( button, makecol( 200, 200, 200 ) ); textout_ex( button, font, text, 2, 2, makecol( 0, 0, 0 ), - 1 ); flag = 0; click = false; if( unique == 0 ) { winx =( mx * width ) / EkranSzerokosc; winy =( my * height ) / EkranWysokosc; } if( unique == 1 ) { if( pkt > 0 ) { club++; pkt--; } else allegro_message( "Niewystarczajaca liczba punktow." ); } if( unique == 2 ) { if( pkt > 0 ) { axe++; pkt--; } else allegro_message( "Niewystarczajaca liczba punktow." ); } if( unique == 3 ) { if( pkt > 0 ) { sword++; pkt--; } else allegro_message( "Niewystarczajace liczba punktow." ); } } else { if( click == false ) { clear_to_color( button, makecol( 150, 150, 150 ) ); textout_ex( button, font, text, 2, 2, makecol( 0, 0, 0 ), - 1 ); } } }
void myszka() { if( mx != mouse_x || my != mouse_y || mb != mouse_b ) { mx = mouse_x; my = mouse_y; mb = mouse_b; } }
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, EkranSzerokosc, EkranWysokosc, 0, 0 ); install_timer(); install_int_ex( increment_speed, BPS_TO_TIMER( 10 ) ); BITMAP * bufor = create_bitmap( EkranSzerokosc, EkranWysokosc ); BITMAP * button = create_bitmap( 100, 15 ); BITMAP * button2 = create_bitmap( 100, 15 ); BITMAP * button3 = create_bitmap( 100, 15 ); BITMAP * window = create_bitmap( 200, 160 ); install_mouse(); show_mouse( screen ); unscare_mouse(); while( !key[ KEY_ESC ] ) { clear_to_color( bufor, makecol( 255, 255, 255 ) ); myszka(); while( speed > 0 ) { OnCButton( button, 50, 100, 100, 15, "Club+", 1 ); OnCButton( button2, 50, 130, 100, 15, "Axe+", 2 ); OnCButton( button3, 50, 160, 100, 15, "Sword+", 3 ); OnCButton( window, winx, winy, 200, 160, "Okienko informacyjne :).", 0 ); speed--; } textprintf_ex( bufor, font, 20, 20, makecol( 200, 200, 200 ), - 1, "mx = %d, my = %d, mb = %d", mx, my, mb ); textprintf_ex( bufor, font, 20, 50, makecol( 200, 200, 200 ), - 1, "Club fighting: %d", club ); textprintf_ex( bufor, font, 20, 65, makecol( 200, 200, 200 ), - 1, "Axe fighting: %d", axe ); textprintf_ex( bufor, font, 20, 80, makecol( 200, 200, 200 ), - 1, "Sword fighting: %d", sword ); textprintf_ex( bufor, font, 200, 50, makecol( 200, 200, 200 ), - 1, "Points: %d", pkt ); DrawCButton( bufor, window, winx, winy, 200, 160 ); DrawCButton( bufor, button, 50, 100, 100, 15 ); DrawCButton( bufor, button2, 50, 130, 100, 15 ); DrawCButton( bufor, button3, 50, 160, 100, 15 ); blit( bufor, screen, 0, 0, 0, 0, EkranSzerokosc, EkranWysokosc ); } remove_int( increment_speed ); destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|