Allegro - problem z migającą myszką

0

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

0

Nie potrafimy wróżyć, pokaż kod.

0

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();

}
0

jak nadal za mało to pisz wstawie więcej

1

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.

0

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);
}
1

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.

1

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?

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1