[C, ncurses, pthread] Problem z poruszaniem piłki

0

Witam Wszystkich!!!

Piszę grę ping-pong na zaliczenie kursu, lecz napotkałem na mały problem z wyświetlaniem piłki. Ogólnie rzecz biorąc program ma się składać z dwóch wątków.
Pierwszy wątek odpowiada za rysowanie planszy natomiast drugi za obliczanie gdzie ma znajdować się piłka.
Na początek napisałem wersje w ncurses bez wątków i wszystko świetnie działało(płynne przejście piłki przez plansze) dopiero gdy spróbowałem wykorzystać watki pthread zaczęły się schody. Mianowicie piłeczka jest ale nie przechodzi płynnie tylko widać ją co jakiś czas.

0

Robisz jedną rzecz źle, pętla while(1) w metodzie ball wykonuje się bez sleep'a co za tym idzie: 100% zużycia CPU i piłka szaleje.
Jakimś cudem refresh() w pętli głównego procesu da radę narysować coś na ekranie co zobaczysz.

Polecam zrobić kilka rzeczy:
Do współrzędnych int x,y dopisz sobie volatile. (Program za każdym razem będzie sprawdzał co jest w zmiennej i dopiero wtedy będzie robił coś z tą wartością. Do wątków warto tego użyć).

Dodatkowo polecam dodatkową zmienną np. int msec, która będzie określać czas na jaki usleepujesz dany wątek.
Przydatna rzecz biorąc pod uwagę późniejsze modyfikacje programu. Dokładniej rzecz biorąc nie będziesz musiał ręcznie zmieniać każdej wartości w danej pętli, tylko zmieniasz jedną zmienną ;)
Możesz w ten sposób zwiększać szybkość gry. Przykładowo dodać wątek sprawdzający ilość punktów i w zależności od ilości zmniejszać czas odświeżania. Więcej akcji w pongu ;P

0

Dzięki bieniomajster!!! Podziałało.
Niestety napotkałem na następny problem. Piłka odbijając się od paletki zamiast odbić się od krawędzi ekranu odbija się od środka. Wygląda to tak jak na zamieszczonym zdjęciu w załączniku:

0

Ogólnie przy pisaniu takich gierek ( innych również ) najlepiej dobrze podzielić sobie kod. Zacznij od pętli czasu rzeczywistego, w tej grze nie musi być ona bardzo złożona:

while ( !Koniec() )
{
   if ( JakiesZdarzenie ) //sprawdzasz czy np. przycisk wcisnieto
       ObsluzJe(); //jesli wcisnieto co się ma stac
   else
   {
      UpdateGry(); //uaktualniasz gre, np. pozycje piłki
      RysujObiekty(); //na koniec rysujesz
   }
}

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