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

Respienie się przeciwników w RPG, zalezne od czasu, problem

0 głosów
406 wizyt
pytanie zadane 11 maja 2019 w C i C++ przez Padoski Użytkownik (990 p.)

Hejka wszystkim, chcę napisać sobie prostą gierkę w SFML. I nasuwa mi się problem, mianowicie w jaki sposób mogę uzależnić respienie się przeciwników od czasu? Przeglądając jakieś tutoriale na youtube natknąłem się na taki sposób:

Gdzieś deklaruje sobie spawnCounter.

	//Enemies
		if (spawnCounter < 20)
			spawnCounter++;
		if (spawnCounter >= 20 && enemies.size() < 30)
		{
			enemy.setPosition(Vector2f(rand() % int (window.getSize().x-enemy.getSize().x)  , rand() % int (window.getSize().y-enemy.getSize().y)));
			enemies.push_back(RectangleShape(enemy));
			spawnCounter = 0;
		}

I jeśli dobrze rozumiem to działa to w ten sposób, że po prostu program musi "przelecieć" 20 razy przez cały napisany kod, żeby spawnCounter się wyzerował. W takim razie w jakiś sposób daje złudne powstanie czasu pomiędzy respieniem się ich. Tylko czy w takim razie to nie zależy od "wydajności" sprzętu jaki będzie posiadał użytkownik ? albo np. jeśli gra w jakimś momencie będzie potrzebowała większej "wydajności sprzętu" to najzwyczajniej ta przelecenie przez wszystkie linie kodu 20 razy zanim się zinkrementuje do 20 będzie trwało dłużej? Czy jest na to inny sposób ? czy ten jest w miarę dobry? 

Jeśli źle to rozumiem, to proszę o wytłumaczenie i inne uwagi. Z góry dziękuje i serdecznie pozdrawiam!!!

2 odpowiedzi

0 głosów
odpowiedź 11 maja 2019 przez Marcin Siniarski Gaduła (4,420 p.)
Dobrze rozumiesz.
Dla komputera mogącego wyciągnąć 5 FPS (5 klatek na sekundę), ponowny spawn przeciwnika zajmie 4 sekundy natomiast dla 20 FPS ( 20 klatek na sekundę ) zajmie 1 sekundę.

Poczytaj sobie o czymś takim jak delta time.
0 głosów
odpowiedź 12 maja 2019 przez Rzepek Bywalec (2,050 p.)

Wszystko zależy od tego jak działa twój silnik gry, ale rozwiązanie ze zwiększaniem licznika co każe powtórzenie jest co najmniej beznadziejne. SFML ma klasę sf::Clock. Po prostu stworz w zmienna float którą ustawisz na przykład na 2.0f  i na początku pętli pobierzesz czas, który upłynął za pomocą funkcji sf::Clock::getElapsedTime().asSeconds (oczywiście najpierw stworzysz obiekt sf::Clock) i odejmiesz od float'a ten czas. Kiedy wartość float'a będzie mniejsza lub równa 0, ustawiasz ją spowrotem na 2.0f i wykonujesz algorytm respienia przeciwników.

//...........
bool inGame = true;
sf::Clock clock;
float timeToSpawn = 2.0f;

while(inGame)
{
timeToSpawn -= clock.getElapsedTime().asSeconds();
if(timeToSpawn<=0.0f)
{
timeToSpawn = 2.0f;
//Tutaj wykonujesz algorytm respienia przeciwnika
}

//Reszta pętli gry
//............
//............
}

 

Podobne pytania

0 głosów
3 odpowiedzi 776 wizyt
pytanie zadane 16 grudnia 2018 w C# przez Lukas Hajduga Użytkownik (830 p.)
0 głosów
1 odpowiedź 176 wizyt
pytanie zadane 6 listopada 2018 w C i C++ przez GóralGienek Nowicjusz (240 p.)
–1 głos
0 odpowiedzi 1,073 wizyt
pytanie zadane 26 marca 2017 w C i C++ przez WireNess Stary wyjadacz (11,240 p.)

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,785 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...