kacperszef Temat założony przez niniejszego użytkownika |
[Allegro5, C] Tworzenie bitmap przy pomocy myszki » 2021-05-04 19:57:24 Witam, potrzebuje pomocy, próbuje stworzyć grę saper, sam algorytm gry działa jak najbardziej prawidłowo, problem pojawia się w ładowaniu obrazków za pomocą kliknięcia myszki w określonym miejscu, mianowicie występuje brak jakiekolwiek reakcji. Kod programu: #include <stdio.h> #include <time.h> #include <allegro5/allegro.h> #include <allegro5/allegro_font.h> #include <allegro5/allegro_ttf.h> #include <allegro5/allegro_image.h> #include <allegro5/allegro_acodec.h> #include <allegro5/allegro_audio.h> #include <allegro5/mouse.h> #include <allegro5/allegro_native_dialog.h>
void gra() { ALLEGRO_DISPLAY * ekran; ALLEGRO_EVENT_QUEUE * kolejka; ALLEGRO_TIMER * zegarek; ALLEGRO_BITMAP * tlo = NULL; ALLEGRO_BITMAP * title = NULL; ALLEGRO_SAMPLE * dzwiek = NULL; ALLEGRO_BITMAP * mina = NULL; ALLEGRO_BITMAP * jeden = NULL; ALLEGRO_BITMAP * dwa = NULL; ALLEGRO_BITMAP * trzy = NULL; ALLEGRO_BITMAP * piec = NULL; ALLEGRO_BITMAP * szesc = NULL; ALLEGRO_BITMAP * siedem = NULL; ALLEGRO_BITMAP * cztery = NULL; ALLEGRO_BITMAP * osiem = NULL; ALLEGRO_FONT * czcionka; ALLEGRO_BITMAP * puste = NULL; ALLEGRO_BITMAP * kafelek = NULL; ALLEGRO_MOUSE_STATE myszka; al_init(); ekran = al_create_display( 800, 535 ); kolejka = al_create_event_queue(); zegarek = al_create_timer( 0.5 / 60 ); czcionka = al_load_ttf_font( "YARDSALE.ttf", 64, 0 ); al_install_mouse(); al_init_image_addon(); al_install_audio(); al_init_font_addon(); al_init_ttf_addon(); al_init_acodec_addon(); al_install_keyboard(); al_register_event_source( kolejka, al_get_keyboard_event_source() ); al_register_event_source( kolejka, al_get_display_event_source( ekran ) ); al_register_event_source( kolejka, al_get_timer_event_source( zegarek ) ); al_register_event_source( kolejka, al_get_mouse_event_source() ); al_reserve_samples( 1 ); dzwiek = al_load_sample( "war_sound.wav" ); mina = al_load_bitmap( "mina_ikona.png" ); jeden = al_load_bitmap( "jeden.png" ); dwa = al_load_bitmap( "dwa.png" ); trzy = al_load_bitmap( "trzy.png" ); cztery = al_load_bitmap( "cztery.png" ); piec = al_load_bitmap( "piec.png" ); szesc = al_load_bitmap( "szesc.png" ); siedem = al_load_bitmap( "siedem.png" ); osiem = al_load_bitmap( "osiem.png" ); puste = al_load_bitmap( "puste.png" ); kafelek = al_load_bitmap( "kafelek.png" ); srand( time( NULL ) ); char plansza[ 9 ][ 9 ]; int i = 0, j, z, g = 0, f = 0, m = 0, h = 0, licznik = 0; for( i = 0; i < 20; i++ ) { j = rand() % 7; z = rand() % 7; plansza[ j ][ z ] = 6; } bool dziala = true; al_init_image_addon(); al_get_mouse_state( & myszka ); al_start_timer( zegarek ); while( dziala ) { ALLEGRO_EVENT akcja; al_wait_for_event( kolejka, & akcja ); if( akcja.type == ALLEGRO_EVENT_TIMER ) { al_clear_to_color( al_map_rgba_f( 1, 1, 1, 1 ) ); for( g = 0; g < 8; g++ ) { for( f = 0; f < 8; f++ ) { if( plansza[ g ][ f ] == 6 ) { al_draw_bitmap( kafelek, g * 67, f * 67, 0 ); if( myszka.buttons == 1 ) { if( myszka.x <=( 67 * g ) && myszka.x >=( 67 * g + 64 ) ) { if( myszka.y <=( 67 * f ) && myszka.y >=( 67 * f + 64 ) ) { al_draw_bitmap( mina, g * 67, f * 67, 0 ); } } } } } } for( h = 0; h < 8; h++ ) { for( m = 0; m < 8; m++ ) { licznik = 0; if( plansza[ h ][ m ] != 6 ) { if( plansza[ h - 1 ][ m - 1 ] == 6 ) { licznik++; } if( plansza[ h - 1 ][ m ] == 6 ) { licznik++; } if( plansza[ h - 1 ][ m + 1 ] == 6 ) { licznik++; } if( plansza[ h ][ m - 1 ] == 6 ) { licznik++; } if( plansza[ h ][ m + 1 ] == 6 ) { licznik++; } if( plansza[ h + 1 ][ m - 1 ] == 6 ) { licznik++; } if( plansza[ h + 1 ][ m ] == 6 ) { licznik++; } if( plansza[ h + 1 ][ m + 1 ] == 6 ) { licznik++; } switch( licznik ) { case 0: plansza[ h ][ m ] = 0; al_draw_bitmap( puste, h * 67, m * 67, 0 ); break; case 1: plansza[ h ][ m ] = 1; al_draw_bitmap( jeden, h * 67, m * 67, 0 ); al_draw_bitmap( kafelek, h * 67, m * 67, 0 ); break; case 2: plansza[ h ][ m ] = 2; al_draw_bitmap( dwa, h * 67, m * 67, 0 ); al_draw_bitmap( kafelek, h * 67, m * 67, 0 ); break; case 3: plansza[ h ][ m ] = 3; al_draw_bitmap( trzy, h * 67, m * 67, 0 ); al_draw_bitmap( kafelek, h * 67, m * 67, 0 ); break; case 4: plansza[ h ][ m ] = 4; al_draw_bitmap( cztery, h * 67, m * 67, 0 ); al_draw_bitmap( kafelek, h * 67, m * 67, 0 ); break; case 5: plansza[ h ][ m ] = 5; al_draw_bitmap( piec, h * 67, m * 67, 0 ); al_draw_bitmap( kafelek, h * 67, m * 67, 0 ); break; case 6: plansza[ h ][ m ] = 7; al_draw_bitmap( szesc, h * 67, m * 67, 0 ); al_draw_bitmap( kafelek, h * 67, m * 67, 0 ); break; case 7: plansza[ h ][ m ] = 8; al_draw_bitmap( siedem, h * 67, m * 67, 0 ); al_draw_bitmap( kafelek, h * 67, m * 67, 0 ); break; case 8: plansza[ h ][ m ] = 9; al_draw_bitmap( osiem, h * 67, m * 67, 0 ); al_draw_bitmap( kafelek, h * 67, m * 67, 0 ); break; } } } } al_flip_display(); } } al_destroy_display( ekran ); al_uninstall_keyboard(); al_destroy_timer( zegarek ); al_destroy_bitmap( title ); al_destroy_sample( dzwiek ); al_destroy_font( czcionka ); al_uninstall_mouse(); }
|
|
DejaVu |
» 2021-05-04 20:02:11 Kliknięcie myszką nie powinno powodować wyświetlania czegokolwiek. Powinno tylko modyfikować stan tablicy plansza tj. oznaczać, że podane pole zostało odsłonięte. |
|
kacperszef Temat założony przez niniejszego użytkownika |
» 2021-05-04 20:07:27 Dobrze dziękuje za pomoc.
|
|
DejaVu |
» 2021-05-04 20:13:27 enum class StanPola { Bomba, Pusto, Wartosc1, Wartosc2, Wartosc3, Wartosc4, Wartosc5, Wartosc6, Wartosc7, Wartosc8, Wartosc9 };
struct Pole { bool czyOdsloniete = false; StanPola wartosc = StanPola::Pusto; };
Pole plansza[ 9 ][ 9 ];
Mając taką tablicę zrób pętlę, która wyświetla planszę. Kliknięcie w pole planszy zmienia flagę 'czyOdsloniete'. |
|
kacperszef Temat założony przez niniejszego użytkownika |
» 2021-05-04 20:28:26 Niestety struktury póki co są mi obce dlatego też chciałem zrobic to w taki sposób że, kliknięcie w minę powodowałoby wyświetlenie tej miny, a kliknięcie w cyferkę pokazywałoby ją, gra kończyła by się porażką w przypadku naciśniecia na mine lub zwycięstwem gdy liczba kliknięć będzie równa wielkości planszy minus ilosc min stąd moje pytanie o wyświetlanie obrazków poprzez kliknięcia. |
|
DejaVu |
» 2021-05-04 20:32:57 No to możesz zrobić dwie tablice: char plansza[ 9 ][ 9 ]; bool odslonietePola[ 9 ][ 9 ];
W miejscu wyświetlania planszy: if( odlonietePola[ y ][ x ] == true ) { } else { }
Natomiast w miejscu w którym wykrywasz kliknięcie: if( tu_warunek_klikniecia ) { odslonietePola[ y ][ x ] = true; }
|
|
kacperszef Temat założony przez niniejszego użytkownika |
» 2021-05-04 20:52:21 Jasne spróbuje tym sposobem. |
|
« 1 » |