Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[ALLEGRO5] Wykrywanie kolizji myszki z grafikami PNG i unikanie kolizji na przezroczystej powierzchni.

Ostatnio zmodyfikowano 2017-10-01 22:59
Autor Wiadomość
Ambitny16
Temat założony przez niniejszego użytkownika
[ALLEGRO5] Wykrywanie kolizji myszki z grafikami PNG i unikanie kolizji na przezroczystej powierzchni.
» 2017-09-28 18:33:25
Jak w temacie, chciałbym aby program po najechaniu myszką na grafikę png coś robił, a po kliknieciu robił coś innego. Jak szukałem w internecie to w większości trafiałem na rozwiązania działające na prostokątach, a ja chcę zrobić przyciski z grafik z zaokrąglonymi rogami oraz z grafik całkowicie nieregularnych. Jak jest to proste to nie bijcie, tylko wytłumaczcie, z góry dzięki :)
Oczywiście nie chcę aby ktoś za mnie pisał kod, ale za jakieś fragmenty z objaśnieniami bedę wdzięczny.
P-165298
Gabes
» 2017-09-30 00:54:10
musisz odebrać zdarzenia z myszki,
powinieneś zastosować:
unsigned char r, g, b, a;
...
al_set_target_bitmap;
al_unmap_rgba( al_get_pixel (bitmap,myszka.x,myszka.y),&r,&g,&b,&a);

postaram się zarzucić kodem :)
P-165352
marianekA
» 2017-09-30 18:05:10
Tak jak napisał Gabes.
Napisałem taki przykładzik - na pewno Ci pomoże:
 
C/C++
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>

int main()
{
    al_init(); // Allegro 5
    al_install_mouse(); // myszka
    al_init_primitives_addon(); // kreski,kwadraciki itp.
    ALLEGRO_DISPLAY * okno = al_create_display( 800, 600 );
    ALLEGRO_BITMAP * obrazek = al_create_bitmap( 800, 600 );
    ALLEGRO_MOUSE_STATE myszka;
    // rysowanie przykładowego obrazka
    al_set_target_bitmap( obrazek );
    al_draw_circle( 400, 200, 80, al_map_rgb( 20, 122, 122 ), 20 );
    al_draw_rectangle( 400 - 50, 200 - 50, 400 + 50, 200 + 50, al_map_rgb( 200, 22, 122 ), 10 );
    al_set_target_bitmap( al_get_backbuffer( okno ) ); // powrót do okna
    //
    unsigned char r, g, b;
    while( 1 )
    {
        al_get_mouse_state( & myszka ); // czy? wcisniety klawisz myszki
        al_clear_to_color( al_map_rgb( 20, 60, 60 ) ); //tło ekranu
        al_draw_bitmap( obrazek, 0, 0, 0 ); //tło obrazka
       
        // obszar obrazka jako przycisk
        ALLEGRO_COLOR kk = al_get_pixel( obrazek, myszka.x, myszka.y );
        al_unmap_rgb( kk, & r, & g, & b );
        //rozjaśnianie obrazka przy najeczaniu wskaźnikiem myszki
        if( r + g + b > 0 ) al_draw_tinted_bitmap_region
            ( obrazek, al_map_rgba( 50, 50, 50, 0 ), 300, 100, 600, 200, 300, 100, 0 );
        // wyjście po kliknięciu na obrazku
        if( r + g + b > 0 && myszka.buttons != 0 ) break;
        //
        al_flip_display();
        al_rest( 0.001 );
    }
    return 0;
}
P-165367
Gabes
» 2017-10-01 22:59:50
Troszeczkę bym to usprawnił, zmieniał tylko same składowe kolorów(R,G,B) i dodał zmienne pozycji bmp. "obrazek" odejmował od poz. myszki:)

  
C/C++
#include <allegro5/allegro.h>
#include <allegro5/allegro_primitives.h>
int main()
{
    al_init(); // Allegro 5
    al_install_mouse(); // myszka
    al_init_primitives_addon(); // kreski,kwadraciki itp.
    ALLEGRO_DISPLAY * okno = al_create_display( 800, 600 );
    ALLEGRO_BITMAP * obrazek = al_create_bitmap( 180, 180 );
    ALLEGRO_MOUSE_STATE myszka;
    // rysowanie przyk³adowego obrazka
    al_set_target_bitmap( obrazek );
    al_draw_circle( 90, 90, 80, al_map_rgb( 255, 255, 255 ), 20 );
    al_draw_rectangle( 40, 40, 140, 140, al_map_rgb( 200, 22, 122 ), 10 );
    al_set_target_bitmap( al_get_backbuffer( okno ) ); // powrót do okna
    int poz_X = 222, poz_Y = 111; /// poz. obrazka na ekranie
    unsigned char r, g, b, kol_R, kol_G, kol_B; // zmienne kolorów
    while( 1 )
    {
        al_get_mouse_state( & myszka ); // czy? wcisniety klawisz myszki
        al_clear_to_color( al_map_rgb( 120, 160, 160 ) ); //t³o ekranu
        // obszar obrazka jako przycisk
        ALLEGRO_COLOR kk = al_get_pixel( obrazek, myszka.x - poz_X, myszka.y - poz_Y );
        al_unmap_rgb( kk, & r, & g, & b );
        //rozjaœnianie obrazka przy najeczaniu wskaŸnikiem myszki
        if( r + g + b > 0 ) { kol_R = 255, kol_G = 255, kol_B = 255; }
        else kol_R = 200, kol_G = 200, kol_B = 200;
       
        al_draw_tinted_bitmap_region( obrazek, al_map_rgb( kol_R, kol_G, kol_B ), 0, 0, 180, 180, poz_X, poz_Y, 0 );
        //lub
        ///al_draw_tinted_bitmap(obrazek,al_map_rgb(kol_R,kol_G,kol_B),poz_X, poz_Y, 0 );
        // wyjœcie po klikniêciu na obrazku
        if( r + g + b > 0 && myszka.buttons != 0 ) break;
        //
        al_flip_display();
        al_rest( 0.001 );
    }
    return 0;
}
P-165395
« 1 »
  Strona 1 z 1