Odpalanie zdarzenia w głównym wątku

0

Witam. Piszę dla zabawy grę Sneak Multiplayer.

Założenia są takie, że:

  • każdy gracz ma swojego węża, który przesuwa się co jakiś odstęp czasu
  • odstęp czasu jest taki sam dla wszystkich graczy i maleje w trakcie rozgrywki
  • przytrzymanie klawisza kierunku powoduje, że wąż przyśpiesza

No i mam takie pytania:

  1. Czy lepiej żeby każdy gracz miał swój wątek, który kontroluje kierunek, przesuwanie i kolizje?
    Czy lepiej żeby takie operacje wykonywane były dla wszystkich graczy po kolei, ale w jednym wątku?

  2. Obiekt gry posiada zdarzenia, w których należy pokazać stan gry na formie. Czy takie zdarzenia powinny być odpalane wątku głównym aplikacji?
    A jeżeli tak, to czy one wymagają jeszcze synchronizacji tzn. czy w ten sposób mogą wykonać się dwa zdarzenia jednocześnie?
    Czy dobrym rozwiązaniem tego będzie w obiekcie gry utworzenie pola ParentControl i wywoływanie zdarzeń poprzez ParentControl.Invoke?

0

WG mnie, Jeden wątek wystarczy.
I nie musisz nic synchronizować.

pętla
{
jeżeli jest zdarzenie -> obsłuż
w przeciwnym wypadku
{
działania
rysowanie
}
}
Wg tego co jest powyżej, działania obsługiwane są niby nie na raz, ale wygląda to tak jakby było jednocześnie, ponieważ wszystko dzieje w jednym obrocie pętli.

w kodzie: głowna pętla gry wyglądaj mniej więcej w taki sposób

//import potrzebnych bibliotek z WinApi

//głowna pętla wygląda mniej "z grubsza" tak...
while (true)
            {
                if (PeekMessage(ref msg, 0, 0, 0, PeekMessageOption.PM_REMOVE))
                {                    
                    TranslateMessage(ref msg);
                    DispatchMessage(ref msg);
                }
                else
                {
                     OBLICZENIA+RENDERING
                     Thread.Sleep(freetime - lenght);
                }
            }

lenght obliczasz:
przed rozpoczeciem obliczen, rysowania pobierasz czas.
po wszystkim pobierasz czas.
Odejmujesz ten pierwszy od drugiego otrzymujesz lenght.
sleep wynosi przykladowo 50 ms.
odejmujesz lenght od freetime, otrzymujemy czas ktory został dla procesora wolny, czyli może odpoczywać.
Nazywają to - pętla czasu rzeczywistego.

PS.
Gra będzie na jedym komputerze czy przez sieć?

0

Dzięki, ten pomysł wydaje mi się ciekawy tylko, że to ma być w C# i nie wiem jak w nim dostać się do tej głównej pętli okna, czy to jest w ogóle możliwe w .NET Framework?
W związku z tym chyba nie obejdzie się bez przynajmniej jednego wątku.

0

to jest w c#, wszystko :)
Tylko musisz importować te trzy tajemnicze funkcje
PeekMessage
TranslateMessage
DispatchMessage

Tutaj nie to, że dostajesz sie do pętli głównej okna jak to nazwałeś.
tylko:
Gdy chodzi pętla while, program nie wykona zdarzeń ktore mają zajść w wyniku wiadomości jakie wysyłamy do programu (mysz/klawiatura), a wysłane wiadomości będą sobie czekać na zakończenie pętli.
i właśnie PeekMessage sprawdza czy jakaś wiadomość czeka na zrealizowanie.

owszem można by to zrobić na tickerze, ale w taki sposob mamy większą przejrzystość i kontrolę. W dodatku timer jest mniej wydajny, a w grach wydajność ważna jest.

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