Allegro - problem z migającą myszką

Allegro - problem z migającą myszką
PI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:46
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

satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
0

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

PI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:46
0

Kodu jest trochę sporo więc może zamieszcze tylko funkcje init która odpowiada za instalacje myszki

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

}
PI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:46
0

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

xxx_xx_x
  • Rejestracja:około 13 lat
  • Ostatnio:2 dni
  • Postów:365
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.

PI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:46
0

a więc funkcja main wygląda tak:

Kopiuj
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ą:

Kopiuj
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);
}
edytowany 1x, ostatnio: piechos
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:13 dni
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
PI
czyli opóźnić to funkcją rest?
_13th_Dragon
Można i tak, ale lepiej zapamiętać pozycje myszki i jeżeli się nie zmieniła i użytkownik nie wcisnął klawisza to nic nie rysować.
Hixohe
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 12 lat
  • Postów:27
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?


Jeśli potrzebujesz pomocy, śmiało pisz GG#27355
Realizuje zlecenia w C/C++/C#, JAVA, Pascal, JS
Kurs ABAP Programista ABAP
edytowany 1x, ostatnio: Hixohe
PI
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 8 lat
  • Postów:46
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

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.