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

C++ SFML - Fale Zombie - Gra Zombie

VPS Starter Arubacloud
0 głosów
218 wizyt
pytanie zadane 27 sierpnia 2017 w C i C++ przez Artur Koniec Gaduła (3,670 p.)

Witam! mam sobie grę o zombiakach, i pętlę która wykonuje resp przeciwników, zmienne umieściłem w klasie Player,

int Wave = 1;
    int zombieInWave = 10;
    int ZombieLeft = zombieInWave;
    int ZOMBIE = 15;

zombieInWave odpowiada ilością zombie w danej fali, np. jeżeli Wave == 5, wtedy mechanizm mnoży zombieInWave*Wave, więc co fale jest ich więcej, przy zabiciu jednego zombiaka, dekrementuje ZombieLeft która wynosi tyle samo co zombieInWave, if sprawdza czy ZombieLeft nie wynosi 0, jeżeli tak to zwiększ fale i resztę(załączam kod), w sumie to wszystko działa tak jak należy, po 5 fali zombie mają się respić w miejscu podstawowym, i innym na mapie, wszystko okej, do rundy 7, nie mam pojęcia dlaczego, gra poprostu gdy osiągnie Wave == 7, respi zombie milion tak jakby początkowy while nie działał, i to crashuje grę, ktoś ma podejrzenia o co chodzi? (jeszcze raz, ZombieLeft-- następuje przy zabiciu zombiaka).

grę obiecałem koledze na jego urodziny które są jutro, więc nie chciałbym tego spaprać(Gdyby kogoś to interesowało, respy maja być podobne jak w Call od Duty: Black Ops Zombies)

 

while (Player1.zombieInWave != 0)
			{
					enemy1.rect.setPosition(450, 2200);
					enemyArray.push_back(enemy1);
				if (Player1.Wave > 5)
				{
					enemy1.rect.setPosition(1200,1450);
					enemyArray.push_back(enemy1);
					Player1.zombieInWave--;
				}
				if (Player1.Wave > 10)
				{
					enemy1.rect.setPosition(1200, 1450);
					enemyArray.push_back(enemy1);
					Player1.zombieInWave--;
					//&&
					enemy1.rect.setPosition(1850, 1950);
					enemyArray.push_back(enemy1);
					Player1.zombieInWave--;
				}
				if (Player1.Wave > 15)
				{
					enemy1.rect.setPosition(1200, 1450);
					enemyArray.push_back(enemy1);
					Player1.zombieInWave--;
					//&&
					enemy1.rect.setPosition(1850, 1950);
					enemyArray.push_back(enemy1);
					Player1.zombieInWave--;
					//&&
					enemy1.rect.setPosition(1000, 800);
					enemyArray.push_back(enemy1);
					Player1.zombieInWave--;
				}
				Player1.zombieInWave--;
				cout << "Spawn?" << endl;
				
			}
			if (Player1.ZombieLeft == 0) {
				Player1.Wave++;
				if (Player1.Wave >= 11) {
					enemyArray[counter].hp = enemyArray[counter].hp * 1.1;
				}
				Player1.zombieInWave = Player1.ZOMBIE * Player1.Wave;
				Player1.ZombieLeft = Player1.zombieInWave;
			}

 

1 odpowiedź

0 głosów
odpowiedź 27 sierpnia 2017 przez Pajdas Mądrala (5,930 p.)

podejrzewam, że sprawa wygląda tak:

-spełnia się kawałek kodu:

if (Player1.Wave > 5)
                {
                    enemy1.rect.setPosition(1200,1450);
                    enemyArray.push_back(enemy1);
                    Player1.zombieInWave--;
                }

a później ponownie odejmuje się zombieInWave na końcu pętli i zdarza się, że tutaj if (Player1.ZombieLeft == 0) warunek się nie spełnia bo ZombieLeft wynosi -1, dla testu napisz coś takiego: if(Player1.ZombieLeft==0||Player.ZombieLeft==-1)

Nie jestem pewien ale raczej tutaj powinien być błąd.

Takie błędy łatwo szukać, wyświetlaj po prostu przy każdej pętli, wszystkie parametry klasy i zobaczysz kiedy się crash'uje i jaki jest ostatni wynik.

Pozdrawiam, proszę o ocenę odpowiedzi

komentarz 27 sierpnia 2017 przez Pajdas Mądrala (5,930 p.)
poza tym proponuję się zastanowić czy umieszczanie zmiennych takich jak:

-Wave, -ZombieInWave itp. w klasie Player to dobry pomysł

Co powiesz na klasę Wave.

Nie rób wszystkiego w jednej klasie i często sobie zadawaj pytanie przy każdej zmiennej :

Czy gdybym szukał tej wartości i przeczytał gdzieś (nazwa pliku, UML, itp) nazwę tej klasy to pomyślałbym: pewnie tutaj znajdę to co szukam, zajrzę tam?

Wydaje mi się, że przy szukaniu ZombieLeft i natrafieniu na klasę Player nie wejdziesz w kod źródłowy, ale będziesz szukał dalej - bezskutecznie :(
komentarz 27 sierpnia 2017 przez Artur Koniec Gaduła (3,670 p.)
Dobrze, zrobię klasę Wave, spróboję
komentarz 27 sierpnia 2017 przez Artur Koniec Gaduła (3,670 p.)
Jeszcze klasy nie zrobiłem, aczkolwiek tak, raz sie wykona ta pętla:

ale tylko raz, szósta fala respi zombiakow na pozycji A, oraz na pozycji B, w kolejnej chce poprostu zwiększyć ich ilość, juz obojętnie o ile, w kodzie w pytaniu, widzisz cout "Spawn?", on gdy dochodzi do siódmej fali, zamiast pokazac sie te 40 razy, pokazuje sie w nieskonczonosc co swiadczy ze zombie tez sie respi w nieskonczonosc i to crashuje grę, czyli moim rozwiązaniem powinna być klasa dla Wave?

if (Player1.Wave > 5)

                {

                    enemy1.rect.setPosition(1200,1450);

                    enemyArray.push_back(enemy1);

                    Player1.zombieInWave--;

                }

Podobne pytania

+21 głosów
6 odpowiedzi 1,246 wizyt
pytanie zadane 5 lutego 2016 w Nasze projekty przez pietrzakacper Mądrala (7,480 p.)
0 głosów
2 odpowiedzi 282 wizyt
pytanie zadane 25 grudnia 2015 w C i C++ przez pietrzakacper Mądrala (7,480 p.)
+7 głosów
6 odpowiedzi 655 wizyt
pytanie zadane 17 kwietnia 2016 w Nasze projekty przez Paweł Głomski Obywatel (1,650 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...