[Allegro]Przesuwanie własnych kontrolek myszką
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

[Allegro]Przesuwanie własnych kontrolek myszką

AutorWiadomość
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
C/C++
//window
if( unique == 0 )
{
    //obsluga przesuwania okienka
    winx =( mx * width ) / EkranSzerokosc;
    winy =( my * height ) / EkranWysokosc;
}

A tutaj cały kod.

C/C++
#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 )
    {
       
        //instrukcje
        clear_to_color( button, makecol( 200, 200, 200 ) );
        textout_ex( button, font, text, 2, 2, makecol( 0, 0, 0 ), - 1 );
        flag = 0;
        click = false;
        //instrukcje c.d.
       
       
        //window
        if( unique == 0 )
        {
            //obsluga przesuwania okienka
            winx =( mx * width ) / EkranSzerokosc;
            winy =( my * height ) / EkranWysokosc;
           
        }
       
        //button
        if( unique == 1 )
        {
            if( pkt > 0 )
            {
                club++;
                pkt--;
                //allegro_message("Dodano 1 do cluba.");
                //Pause(100);
            }
            else allegro_message( "Niewystarczajaca liczba punktow." );
           
        }
       
        //button2
        if( unique == 2 )
        {
            if( pkt > 0 )
            {
                axe++;
                pkt--;
                //allegro_message("Dodano 1 do axa.");
                //Pause(100);
            }
            else allegro_message( "Niewystarczajaca liczba punktow." );
           
        }
       
        //button3
        if( unique == 3 )
        {
            if( pkt > 0 )
            {
                sword++;
                pkt--;
                //allegro_message("Dodano 1 do sworda.");
                //Pause(100);
            }
            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 ) );
   
    //Bmp
    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 )
        {
            //Obsluga
            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--;
        }
       
       
       
        //Rysowanie
        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();
P-55360
» 2012-04-26 07:54:01
Bierzesz aktualną pozycję okienka, a potem dodajesz/odejmujesz do niej różnicę między ostatnią a aktualną pozycją myszy :)

Czyli jak myszka trzyma okno które znajduje się np. na współrzędnych 50 i 50, i przesunie się do góry o 20 pikseli, to ty odejmujesz od współrzędnej y okna 20 i otrzymujesz nową pozycję okna :)
P-55362
» 2012-04-26 12:42:27
Masz tutaj przykład, z mojego okienka w GUI:

C/C++
if( mysz.x >= x && mysz.x <= x + w && mysz.y >= y && mysz.y <= y + 16 && mysz.buttons == 1 ) //klikniecie na "tytul" okienka, aby je przesunac
{
    if( !klik )
    {
        roznicaX = mysz.x - x;
        roznicaY = mysz.y - y;
        klik = true;
    }
   
    move = true;
}
if( mysz.buttons != 1 && klik )
     klik = false;

if( move ) //przesuwanie okienka
{
    x = mysz.x - roznicaX;
    y = mysz.y - roznicaY;
}

if( mysz.buttons != 1 && move )
     move = false;


Może Ci pomoże :)
P-55374
Temat założony przez niniejszego użytkownika
» 2012-04-26 14:08:52
Up

Dzięki, wszystko działa. ;)
P-55386
« 1 »
 Strona 1 z 1