Autor Wątek: sprawa czasu  (Przeczytany 3112 razy)

Offline Microprocek

  • Użytkownik

# Styczeń 27, 2009, 02:32:50
sluchajcie moze to i glupie ale caly czas probioje zainicjowac pewna funkcje ktoa by 'spowalniala' czas na np 2, 3 sekundy...
mam na mysli dokladnie to ze chce aby przeciwnik mnie nie zabil od razu ale w odstepie czasu 2, 3 sekund zadawal mi cios... (animacja w tym momencie nie wazna...) zna ktos moze takowowa funkcje
pisze na silniku irrlicht w C#

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline pawelek

  • Użytkownik

# Styczeń 27, 2009, 09:31:29
Zachowanie przeciwnika w osobny wątku i zrobic w tej funkcji sleep?

Thread th = new Thread(new ThreadStart(funkcja));
th.Start();

Thread.Sleep(2000);

O to chodziło?


Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 27, 2009, 10:43:26
Cytuj
Zachowanie przeciwnika w osobny wątku i zrobic w tej funkcji sleep?
Definitywnie nie będzie to dobre rozwiązanie. Dobrym rozwiązaniem będzie zapamiętanie, że chcesz tą funkcję sobie wywołać i co klatkę sprawdzanie, czy jest już odpowiedni na to moment. :)

Offline Microprocek

  • Użytkownik

# Styczeń 27, 2009, 11:42:09
a jak by mozna zrobic to sprawdzanie co klatke ???
bo nie bardzo wiem jaka jest do tego funkcja w irrlicht...

Offline Riddlemaster

  • Użytkownik
    • Moja strona domowa

# Styczeń 27, 2009, 11:50:53
Ogólnie musisz sobie napisać task schedulera, albo coś podobnego. Trzymasz w nim wszystkie zadania które chcesz wykonać wraz z czasami wykonania (lub klatkami, bo to też czasem się może przydać). Co klatkę sprawdzasz tak jak powiedział Krzysiek, czy już nastąpił czas wykonania poszczególnych zadań.

Offline Microprocek

  • Użytkownik

# Styczeń 27, 2009, 11:59:29
ten task ma byc jako oddzielna funkcja tak? zastanawiam sie tylko jak wlasnie zrobic to usypianie na jakis czas???
w C++ takie cos robilem a zauwazylem ze C# do konca tak nie ma albo calkowicie inaczej... poza tym irrlicht zauwazylem i nie wiem czemu ze nie uznaje czasem niektorych funkcji z czystego jezyka C#

Offline Erdraug

  • Użytkownik

# Styczeń 27, 2009, 12:00:27
Jeżeli piszesz w C# to chyba najłatwiej będzie użyć klasy Timer z System.Timers. Nastawiasz co jaki czas ma być jakiś Event odpalany i po kłopocie.

Chyba że źle zrozumiałem o co chodzi...

Offline Microprocek

  • Użytkownik

# Styczeń 27, 2009, 12:11:13
chodzi o to dokladnie ze...
przeciwnik podchodzi do mnie na 50 jednostek i atakuje... kazdy atak zadaje mi 10 damage... ale jesli wrzuce to zadawanie ciosow w petle while i dam zeby odejmowalo no to przeciez mnie od razu zabije...
chce aby w tej petli wlasnie dac jakis timer dzieki ktoremu kazdy atak odbywal sie w odstepie np 3s. co daloby mi czas na ucieczke...

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 27, 2009, 12:29:42
Takie rzeczy się zwykle rozwiązuje licznikiem czasu w strukturze przeciwnika. W momencie, gdy przeciwnik atakuje, ustawiamy mu, że przez następne 3s nie może atakować i co klatkę zmniejszamy odpowiednio tą wartość.

Offline Microprocek

  • Użytkownik

# Styczeń 27, 2009, 12:37:07
hm, takiej wbudowanej struktury to ja za bardzo nie znam, napisalem cos takiego i wydaje mi sie ze to nie chodzi jak nalezy:

while (zycie != 0)
                                    {
                                        zycie -= 10;
                                        czas.Interval = 1000;
                                        przeciwnik.SetFrameLoop(320, 369);
                                    }

dobrze czy nie bardzo?

Offline Krolik

  • Użytkownik

# Styczeń 27, 2009, 12:55:28
Możesz także zrobić animacje 3-sekundową i sprawdzać czy przy twoim warunku jest dodatkowo odtwarzana któraś klatka animacji. Ja tak zrobiłem, że gracza ganiał krokodyl, a gdy już atakował, życie bylo odejmowane gdy zachodził warunek np, kolizji z graczem + klatka ataku ( gryzienia )  ;)

Offline Microprocek

  • Użytkownik

# Styczeń 27, 2009, 13:08:08
ten sposob zwiesza mi gre ;P hehe
mysle caly czas nad tym co napisalem ino ten interval = 1000 chyba nie za bardzo dziala - albo zla wartosc podalem...
wie ktos ?

poopa

  • Gość
# Styczeń 27, 2009, 14:20:22
Takie rzeczy się zwykle rozwiązuje licznikiem czasu w strukturze przeciwnika. W momencie, gdy przeciwnik atakuje, ustawiamy mu, że przez następne 3s nie może atakować i co klatkę zmniejszamy odpowiednio tą wartość.
Mozna by wlozyc w kolejke zdarzen. Nie trzeba wtedy sprawdzac co klatke. wkladasz raz w odpowiednie miejsce na uszeregowanej wg. czasu liscie laczonej jednostronnej.

Z drugiej strony w tym wypadku wydajnosc wkladania by zalezala od ilosci wezlow.

Offline vashpan

  • Użytkownik
    • Strona

# Styczeń 27, 2009, 15:28:15
Mozna tez miec jakis licznik czasu w petli glownej gry i liczyc oraz sumowac czas kazdego przebiegu tej petli, potem przekazywac wartosc do twojego przeciwnika i on juz tam bedzie wiedzial co z tym zrobic ( co 3 sekundy zaatakuje )

Offline Koshmaar

  • Użytkownik
    • Homepage

# Styczeń 28, 2009, 08:51:35
Proste rozwiązanie: wpierw musisz znać delta_time, czyli czas jaki upłynął od początku wykonania poprzedniej klatki. Zakładając 30 fps, delta_time ~ 33 ms. W klasie przeciwnika tworzysz dodatkową zmienną TimeBeforeNextAttack, którą ustawiasz na te 3000 ms po każdym ataku. Następnie w każdej pętli, przy update tego przeciwnika sprawdzasz czy TimeBeforeNextAttack > 0, jeśli nie to atakujesz, else TimeBeforeNextAttack -= delta_time. W ten sposób możesz pisać proste eventy oparte na czasie :-)