Pauzowanie wątków.

0

Witam. Mam taki problem:

Mam mapę po której biega sobie kilku jegomościów. Każdy z nich w pewnym ograniczonym stopniu stara się myśleć, nazywam to potocznie sztuczną inteligencją. Myślą oni konkretnie nad tym gdzie w danym momencie się na tej mapie wybrać a następnie siłą rzeczy tam idą.

Jako, że pierwotnie jeden szedł po drugim, w kolejności w jakiej ustawieni byli w strukturze w której akurat zdarzyło mi się ich przechowywać, dodałem obsługę wątków. Teraz każdy z cwaniaczków wystepujących w moim programie uwięziony jest w wątku (a konkretniej metoda "myśl co robisz i to rób").

Natrafiłem jednak na zabawny problem. Idą oni tak szybko, że w zasadzie przestali chodzić i wyglądają jakby się teleportowali. Normalnie przy każdym ruchu robiłem pauzę głównego wątku programu (Thread.Sleep(1000)) i starczało, jednak wątki które utworzyłem nie posiadają tej metody. Nijak nie wiem jak je zatrzymać na chwilę.

Próbowałem użyć Timera i co określoną chwilę w pętli pauzować wszytkie wątki za pomocą Suspend na zmianę z ich ponownym startowaniem za pomocą Resume(). Jednak, jak się można domyślić skoro już tutaj piszę - to nie działa.

Moje cwaniaki wciąż dziarsko teleportują się po mapie.
Ktoś podpowie jak zdjąć im te siedmiomilowe buty?

0

wydaje się, że musisz dodać do klasy wartość "długości kroku" (w jednostce czasu oczywiście)
jeżeli chodzi o "wygląd" to pewnie problem w "przerysowaniu" tego co widzisz...

0

Nie, nie. Mapę odświeżam co minimalną wartość, czyli 1 milisekundę. poza tym w configu mam zdefiniowaną długość pauzy dla wątku. Jednak tego wątku w przeciwieństwie do głównego wątku programu nie mogę zatrzymać w sposób w jaki robiłem to standardowo czyli wspomniane Thread.Sleep( jakis_czas ).

Więc nie w tym rzecz.

0

czyli:

  1. policz położenie
  2. odśwież
    to jakby oczywiste.
    no ale przecież 1ms to bardzo szybko dla ludzkiego oka...
    czyli wracam do długości kroku - gdzie ma się znaleźć obiekt po n odświeżeń...
0

No, ale mapę odświeżam co 1 mlsekundę co oznacza, że szybciej jest aktualizowana, więc powinienem widzieć dajmy na to, płynną animację. A widzę przeskok. Więc mimo, że ma się tak szybko aktualizować, to nie nadąża za ruchem postaci.

Żeby tak się stało, musiałbym przy każdym ruchu każdej postaci, pauzować jej wątek.

Chyba,że coś nie rozumiem, ale byłbym zobowiązany, gdybyś mi to w tym przypadku rozrysował nawet :P

0

Przy założeniu, że coś tam ma ci się przesunąć powiedzmy o 200 pikseli i odświeżasz co 1ms przesunięcie o 1px - całość ruchu (ta twoja animacja) jest wykonywana w czasie 200ms - to jest 1/5 sekundy
Jak dla mnie to za szybko żeby dostrzec ruch - nawet gdybym nie miał kaca :/

1

We wszystkich grach (bo piszesz grę?) robi się tak:

// wywołujesz z parametrem zmiany czasu.
void update(float deltatime)
{
    // ew. this.velocity += this.acceleration;
    this.position += this.velocity * deltatime; // prędkość powiedzmy w sekundach, daltatime to ułamek sekundy.
}

Zresztą w obliczeniach fizcznych też podobnie, chociaż algorytmy są bardziej skomplikowane.

0
stary polak napisał(a)

Normalnie przy każdym ruchu robiłem pauzę głównego wątku programu (Thread.Sleep(1000)) i starczało, jednak wątki które utworzyłem nie posiadają tej metody.

Thread.Sleep() to metoda statyczna klasy Thread, więc Twoje wyjątkowe wątki nie muszą jej "mieć". Wróżę, że w pliku, w którym zdefiniowałeś te wątki, nie masz using System.Threading. Ale mógłbyś łaskawie podać jakiś kod.

0

Trochę spóźniona odpowiedź, ale nie potrafiłem znaleźć swojego postu. Dziękuję za zainteresowanie. Moim błędem była próba dostępu do metody Sleep z miejsca gdzie nie mam dodanego "Using...".

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.