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

[Allegro5, C] Tworzenie bitmap przy pomocy myszki

Ostatnio zmodyfikowano 2021-05-04 20:52
Autor Wiadomość
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:
C/C++
#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 ) );
           
//al_play_sample(dzwiek, 0.1, 0, 1, ALLEGRO_PLAYMODE_LOOP, NULL);
           
           
            // miejsce w którym występuje problem
           
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();
}
P-178530
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.
P-178531
kacperszef
Temat założony przez niniejszego użytkownika
» 2021-05-04 20:07:27
Dobrze dziękuje za pomoc.
P-178532
DejaVu
» 2021-05-04 20:13:27
C/C++
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'.
P-178533
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.
P-178534
DejaVu
» 2021-05-04 20:32:57
No to możesz zrobić dwie tablice:
C/C++
char plansza[ 9 ][ 9 ];
bool odslonietePola[ 9 ][ 9 ];

W miejscu wyświetlania planszy:
C/C++
if( odlonietePola[ y ][ x ] == true )
{
   
//wyświetl numer lub bombę
} else
{
   
// wyświetl zasłonięte pole
}

Natomiast w miejscu w którym wykrywasz kliknięcie:
C/C++
if( tu_warunek_klikniecia )
{
   
odslonietePola[ y ][ x ] = true;
}
P-178535
kacperszef
Temat założony przez niniejszego użytkownika
» 2021-05-04 20:52:21
Jasne spróbuje tym sposobem.
P-178536
« 1 »
  Strona 1 z 1