Witam
Pisałem grę warcaby na windowsie i wszystko działało ok tyle że dzisiaj coś mi codeblocks przestał działać, więc przelogowałem się na ubuntu i tam odpaliłem gre. Niestety jak się okazało na linuxie kursor myszy mruga jak ruszam myszką, a jak przestaje ruszać to w ogóle znika. Wie ktoś może czemu tak się dzieje? Próbowałem rysować bitmape kursora na buforze ale to też nie wygląda do końca estetycznie i wolałbym żeby działało normalne wyświetlanie tak jak na pod windowsem.
Z góry dzięki za pomoc
Pozdro
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 8 lat
- Postów:46
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 8 lat
- Postów:46
Kodu jest trochę sporo więc może zamieszcze tylko funkcje init która odpowiada za instalacje myszki
void init() //Funckcja otwierająca allegro
{
allegro_init(); //inicjalizacja allegro
install_keyboard(); //instalacja klawiatury
install_mouse(); //instalacja myszki
set_color_depth( 16 ); //ustawienie głębi kolorów
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 600, 400, 0, 0 ); //uruchomienie trybu graficznego
show_mouse(screen);
unscare_mouse();
}

- Rejestracja:około 13 lat
- Ostatnio:2 dni
- Postów:365
dalej za mało, teraz widać tylko że zainstalowałeś myszkę bezpośrednio na screen. Problem MOŻE być taki że rysujesz mysz prosto na screen, następnie resztę rysujesz w jakimś buforze, który przenosisz na screen czyli zamalowujesz swoją myszkę... pojawia sie kolejna klatka i znowu to samo i w ten sposób myszka miga. Niech myszka też będzie rysowana w buforze po narysowaniu całej grafiki.
- Rejestracja:ponad 13 lat
- Ostatnio:ponad 8 lat
- Postów:46
a więc funkcja main wygląda tak:
int main()
{
struct pole **macierz = new struct pole *[8]; //alokowanie pamięci dla tablic
for (int i=0; i<8; i++) macierz[i]= new struct pole [8]; //utworzenie z tablicy 1 wymiarowej tablicę 2 wymiarową
int kolej_ruchu=-1; //czyja kolej ruchu: -1 - białe, 1 - czarne
int mx=0,my=0; //współrzędne komórki nad jaką znajduje się aktualnie myszka
int rpx=-1,rpy=-1,rkx=-1,rky=-1; //współrzędne początku ruchu pionka i końca ruchu pionka
tworz_macierz(macierz);
init();
/*tworzenie wskaźników na bitmapy*/
BITMAP * bufor=NULL;
BITMAP * plansza=NULL;
BITMAP * czarny=NULL;
BITMAP * czarny_damka=NULL;
BITMAP * bialy=NULL;
BITMAP * bialy_damka=NULL;
BITMAP * zaznaczenie=NULL;
BITMAP * menu=NULL;
BITMAP * warcaby=NULL;
BITMAP * nowa_gra=NULL;
BITMAP * kursor=NULL;
tworz_bitmapy(&bufor,&plansza,&czarny,&czarny_damka,&bialy,&bialy_damka,&zaznaczenie,&menu,&warcaby,&nowa_gra,&kursor); //wczytywanie i tworzenie bitmap
while(!key[KEY_ESC])
{
rysuj_menu(menu,bufor,warcaby,nowa_gra,kursor);
if ((mouse_x>400)&&(mouse_x<400+nowa_gra->w)&&(mouse_y>150)&&(mouse_y<150+nowa_gra->h)&&(mouse_b==1))
{
while (!key[KEY_SPACE])
{
wspolrzedne_kursora(&mx,&my); //odczytywanie położenia zaznaczenia w tablicy
wspolrzedne_ruchu(kolej_ruchu,macierz,&rpx,&rpy,&rkx,&rky,mx,my);
rysuj_plansze(bufor,plansza,czarny,czarny_damka,bialy,bialy_damka,zaznaczenie,kursor,macierz,rpx,rpy,kolej_ruchu);
ruch(&kolej_ruchu,macierz,&rpx,&rpy,&rkx,&rky);
show_mouse(screen);
unscare_mouse();
if(key[KEY_0]) tworz_macierz(macierz);
}
}
show_mouse(screen);
unscare_mouse();
}
allegro_exit();
return 0;
}
funkcje, które mogą mieć związek z myszką:
void init() //Funckcja otwierająca allegro
{
allegro_init(); //inicjalizacja allegro
install_keyboard(); //instalacja klawiatury
install_mouse(); //instalacja myszki
set_color_depth( 16 ); //ustawienie głębi kolorów
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 600, 400, 0, 0 ); //uruchomienie trybu graficznego
show_mouse(screen);
unscare_mouse();
}
void rysuj_menu(BITMAP *menu, BITMAP *bufor, BITMAP *warcaby, BITMAP *nowa_gra, BITMAP *kursor)
{
blit(menu,bufor,0,0,0,0,menu->w,menu->h);
masked_blit(warcaby,bufor,0,0,200,5,warcaby->w,warcaby->h);
masked_blit(nowa_gra,bufor,0,0,400,150,nowa_gra->w,nowa_gra->h);
blit(bufor,screen,0,0,0,0,bufor->w,bufor->h);
}
void rysuj_plansze(BITMAP * bufor, BITMAP *plansza, BITMAP *czarny, BITMAP *czarny_damka, BITMAP *bialy, BITMAP *bialy_damka,
BITMAP *zaznaczenie, BITMAP *kursor, struct pole **macierz, int rpx, int rpy, int kolej_ruchu)
{
blit(plansza,bufor,0,0,0,0,plansza->w,plansza->h);
for(int i=0; i<8; i++)
{
for(int j=0; j<8; j++)
{
if(macierz[i][j].pionek==-2)
masked_blit(bialy_damka,bufor,0,0,macierz[i][j].y,macierz[i][j].x,bialy_damka->w,bialy_damka->h);
if(macierz[i][j].pionek==-1)
masked_blit(bialy,bufor,0,0,macierz[i][j].y,macierz[i][j].x,bialy->w,bialy->h);
if(macierz[i][j].pionek==1)
masked_blit(czarny,bufor,0,0,macierz[i][j].y,macierz[i][j].x,czarny->w,czarny->h);
if(macierz[i][j].pionek==2)
masked_blit(czarny_damka,bufor,0,0,macierz[i][j].y,macierz[i][j].x,czarny_damka->w,czarny_damka->h);
}
}
if((rpx!=-1) && (rpy!=-1))
masked_blit(zaznaczenie,bufor,0,0,macierz[rpx][rpy].y,macierz[rpx][rpy].x,zaznaczenie->w,zaznaczenie->h);
blit(bufor,screen,0,0,0,0,bufor->w,bufor->h);
}

- Rejestracja:prawie 20 lat
- Ostatnio:13 dni
Zbyt często przerysowujesz ekran, zauważ że dopóki użytkownik nie poruszył myszą ani nie nacisnął żadnego przycisku NIE MA co przerysowywać ekran.
Jak będziesz miał mniej rysowania to zniknie mruganie.


- Rejestracja:ponad 14 lat
- Ostatnio:około 12 lat
- Postów:27
Już jakiś czas temu przerzuciłem się na Allegro 5, ale z tego co pamiętam to show_mouse() używasz raz i wystarczy. Kursor będzie widoczny aż nie zechcesz inaczej. W Twoim przypadku kursor przykrywany jest przy każdej pętli buforem.
unscare_mouse(); - wiesz do czego to służy?
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.