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
Nie potrafimy wróżyć, pokaż kod.
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();
}
jak nadal za mało to pisz wstawie więcej
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.
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);
}
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.
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?
dziwi mnie tylko to że pod windowsem wszystko działało elegancko i to jak funkcja show_mouse() była tylko na początku programu, więc nawet jak bufor przykrywał kursor to wyświetlało go ok