• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

c++ czas, programowanie obiektowe

Object Storage Arubacloud
0 głosów
675 wizyt
pytanie zadane 7 maja 2017 w C i C++ przez heros22pt Użytkownik (950 p.)
witam, mam mały problem. Tworzę grę w czołgi (w open GL, w razie potrzeby mogę udostępnić kod) i chcę, by przeciwnicy - czyli wrogie czołgi pojawiały się (dodawały do wektora "elementy") synchronicznie co jakiś czas... Ty właśnie tkwi problem, ponieważ nie mam pojęcia jak to zrobić. Jeśli użyję funkcji sleep, cała gra mi się zatrzymuję przez dany czas. A jak zrobić, żeby gra toczyła się dalej i bym mógł jeździć czołgiem bez obaw, a w tym czasie pojawiały się nowi przeciwnicy?

3 odpowiedzi

+1 głos
odpowiedź 7 maja 2017 przez rafal.budzis Szeryf (85,260 p.)
wybrane 7 maja 2017 przez heros22pt
 
Najlepsza

Słowo klucz pętla czasu rzeczywistego ;)

W uproszczeniu gra działa w kółko cały czas uruchamiając w petli jedną lub dwie funkcje (zazwyczaj przyjmuje sie rozdzielenie na 2 funkcje update i draw) Specyfika działania takiej pętli wymusza na nas rozwiązania czasowe z licznikiem. Potrzebujesz zmiennych licznik oraz poprzedni_czas. i teraz za każdym wywołaniem funkcji
1) liczysz różnice obecnego czasu do zmiennej poprzedniego czasu
2) dodajesz do licznika obliczony czas
3) zapisujesz do zmiennej poprzedni_czas obecny czas
4) sprawdzasz czy licznik ma wartość 2 sekund
4 JEŚLI TAK)odejmujesz od licznika 2 sekundy i wykonujesz skrypt
5) gra robi inne obliczenia renderuje klatke i wraca do 1 punktu i tak w kółko

komentarz 7 maja 2017 przez heros22pt Użytkownik (950 p.)
pomysł jest świetny, spróbuję go wykorzystać, dzięki
komentarz 7 maja 2017 przez d0n Mądrala (6,440 p.)
A to nie jest tak, że istotą problemu jest to jak liczyc uplywający czas? W sensie, czy to rozwiązanie zaklada, ze kazdy obieg tej glownej petli, czyli jedna klatka, to jedna jednostka czasu dodana do licznika? W sensie jaką informację mamy o czasie jaki upłynął od ostatniego obiegu petli, oprocz tego ze zostal wykonany jeden obieg petli? Przepraszam, jesli mi cos umknelo, ale chce dobrze zrozumiec.
1
komentarz 7 maja 2017 przez rafal.budzis Szeryf (85,260 p.)

@d0n Pobierasz czas z systemowego zegarka za każdym razem ;) przykładowo 
 

CZAS: 19 godzina 23 minuta 12 sekunda 127 milisekunda
-1) start programu obecny czas jest zapisywany do zmiennej poprzedni_czas
0) zerujemy zmienna licznik

CZAS: 19 godzina 23 minuta 12 sekunda 137 milisekunda
1) Liczymy różnice (10 milisekund)
2) dodajemy do licznika 10
3) zapisujemy do zmiennej poprzedni_czas obecny czas

CZAS: 19 godzina 23 minuta 12 sekunda 140 milisekunda
1) Liczymy różnice (3 milisekund)
2) dodajemy do licznika 3 (razem mamy 13)
3) zapisujemy do zmiennej poprzedni_czas obecny czas

 

I tak w kółko ;)

0 głosów
odpowiedź 7 maja 2017 przez d0n Mądrala (6,440 p.)
Frameworki do tworzenia gier często udostępniają klasę pozwalającą stworzyć timer, wtedy w każdym obejściu głównej pętli przetwarzającej klatki możesz sprawdzać wartość timera i jeśli przekroczył okres po jakim ma pojawić się czołg, to go resetujesz i dorzucasz czolg do vectora. Samo "odliczanie" timera dziala jakby w innym watku i nie powoduje zatrzymania gry. W SFML jest klasa sf::Time, niestety nie moge pomoc z OpenGL.
komentarz 7 maja 2017 przez heros22pt Użytkownik (950 p.)
to byłoby by spoko, ale niestety mam przygotować bazę pod jutrzejsze kolokwium i nie mogę tego zrobić w ten sposób, musi być czysty c++ do tego
komentarz 7 maja 2017 przez rafal.budzis Szeryf (85,260 p.)
Nie trzeba działania osobnego wątka do tego ;) implementowałem takie timery w C++ konsolowym ;) Jesli jesteś ciekaw zapraszam do odpowiedzi na dole ;)
komentarz 7 maja 2017 przez d0n Mądrala (6,440 p.)
Taki timer mozna tez zaimplementowac czystym c++, bo od c++11 mozna tworzyc watki ( naglowek <thread> ), i wtedy funkcja w nowym watku miala by sleep na 2 sek a potem ustawiala by flage, a w glownej petli mozna by bylo sprawdzac za kazdym obejsciem, czy flaga nie jest ustawiona, jak jest, to dorzucac czolg i tworzyc nowy watek znow, ale to chyba niewarte zachodu. Ostatecznie jesli mamy jakis framerate np. 60 klatek na sekunde, to co 120 klatek mozna dorzucac czolg =)
0 głosów
odpowiedź 7 maja 2017 przez Evelek Nałogowiec (28,960 p.)
Rozwiązanie dosyć proste w implementacji, ale wymagające znajomości współbieżności.

Tworzysz nowy wątek, który odpowiada za dodawanie nowego czołgu i to jego usypiasz na np. 1 minutę. Co minutę dodaje on nowy czołg. Usypianie wątku może być zresztą losowe.

Podobne pytania

0 głosów
0 odpowiedzi 294 wizyt
pytanie zadane 27 listopada 2017 w C i C++ przez bomboor Nowicjusz (120 p.)
0 głosów
2 odpowiedzi 369 wizyt

92,555 zapytań

141,403 odpowiedzi

319,554 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...