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

C++ SFML - Ograniczenie czasowe Power-Upa

Object Storage Arubacloud
0 głosów
393 wizyt
pytanie zadane 14 sierpnia 2017 w C i C++ przez Artur Koniec Gaduła (3,670 p.)

Witam! robię grę typu CoD: BO Zombies, za trafienie pociskiem w przeciwnika gracz dostaje 10 punktów, po podniesieniu "Double Points", wartość zmienia się na 20 punktów za trafienie przeciwnika, i wszystko narazię działa, ale za chiny nie mogę wymyśleć jak po 10 sekundach wrócić do wartości wyjściowej, w Player.h mam zmienną "point" (default = 10), i to ją zmieniamy na dwa razy większą, mogłby ktoś poprawić kod albo podpowiedzieć?

counter = 0;
		for (iter12 = pickupArray.begin(); iter12 != pickupArray.end(); iter12++)
		{
			if (Player1.rect.getGlobalBounds().intersects(pickupArray[counter].rect.getGlobalBounds()))
			{
				if (pickupArray[counter].isdbpoints == true) 
				{ //pierwsze dwie linki dzialajo
						cout << "DOUBLE POINTS" << endl;
						Player1.point = 20; //PO PODNIESIENIU DOUBLE POINTS DAJEMY 20 PUNKTOW ZA TRAFIENIE NA 10 SEK(DEFAULT = 10)
						//TU MUSI BYC ODLICZENIE 10 SEKUND
						Player1.point = 10; //PO 10 SEKUNDACH ZNOWU DAJEMY GRACZOWI 10 PUNKTOW ZA TRAFIENIE, AZ NIE PODNIESIE KOLEJNEGO DOUBLE POINTS
				}
                                 //inny if
                                 //inny if
                                }
				pickupArray[counter].destroy = true;
			}
			counter++;
		}

 

1 odpowiedź

+1 głos
odpowiedź 14 sierpnia 2017 przez Munvik Dyskutant (9,350 p.)
wybrane 15 sierpnia 2017 przez Artur Koniec
 
Najlepsza

Zwykły timer

sf::Time timer = sf::Time::Zero;
 sf::Time accumulator = sf::Time::Zero;
 sf::Clock clock;
 bool isdbpoints = false; //nie dawaj każdego takiego boola dla każdego pickUpa tylko 1 dla ogółu
//^ to dajesz w jakąs klasę



if (Player1.rect.getGlobalBounds().intersects(pickupArray[counter].rect.getGlobalBounds()))
         {
                        isdbpoints = true
                        clock.restart();
                        timer = sf::Time::Zero;
                        accumulator = sf::Time::Zero;
                        cout << "DOUBLE POINTS" << endl;

                        Player1.point = 20; //PO PODNIESIENIU DOUBLE POINTS DAJEMY 20 PUNKTOW ZA TRAFIENIE NA 10 SEK(DEFAULT = 10)
                 
         }

//Teraz za tą całą pętlą iterującą
if(isdbpoints)
{

 timer = clock.restart();
 accumulator += timer;

 if(accumulator >= 10.f)
 {
    Player1.point = 10;
    isdbpoints = false;

 }
}
         

 

Teraz to działa w ten sposób, że kiedy zbierzesz te doublePointsy to licznik zaczyna od nowa liczyć.

P.S robię edycję co 15 sekund więc zmian było już z 20 ale to już chyba finalna wersja ;)

komentarz 15 sierpnia 2017 przez Munvik Dyskutant (9,350 p.)
Zbadaj timer (Player1.timer i Player1.accumulator), najlepiej debuggerem.

Zacznij od badania ich i napisz czy wogóle wykonują swoją robotę i czy liczą cokolwiek.
komentarz 15 sierpnia 2017 przez Artur Koniec Gaduła (3,670 p.)
Okej sprawdze, a powiedz, myślałem też nad alternatywą, i czy zmienną globalną int counterDb = 0, i gdy isDbpoints == true, i poprostu w pętli głównej co klatke inkrementować, (jest window.setFrameLimit(100)), i dac if counterDB == 1000(w sekunde counterDB osiągnie 100, więc 1k dla 10 sekund) Player1.point =10 oraz isbpoint = false, tylko nie wiem jak by to zapisac w kodzie, mam nadzieję że rozumiesz
komentarz 15 sierpnia 2017 przez Munvik Dyskutant (9,350 p.)
Rozumiem, to jest zły pomysł, bo gdy będziesz chciał zmienić fps to będziesz musiał zmienić też kod. Utrzymanie kodu jest ważne. Po to są timery, żeby ich używać.
komentarz 16 sierpnia 2017 przez Artur Koniec Gaduła (3,670 p.)
Okej, więc spróboję to jakoś rozwiązać, jak narazie w konsoli są takie couty:

Punkty:10 //trafienie przeciwnika

Double points //podnosze db points

Punkty :30 //trafienie przeciwnika, sb points dzialaja

Punkty: 50 //trafienie przeciwnika 15 sekund po podniesienu dbpoints, timer poprostu nie dziala

Rozumiem ze majsterkowac z tym bo inaczej sie poprostu nie da tak?
komentarz 16 sierpnia 2017 przez Artur Koniec Gaduła (3,670 p.)

Okej Ziomek to działa! Wszystko jest okej, jestem poprostu idiotą i if z cout db points dałem clock.restart(), zamiast clockDB.restart, daje kod jeszcze raz, wielkie dzięki za pomoc!

//pickup collides with Player
		counter = 0;
		for (iter12 = pickupArray.begin(); iter12 != pickupArray.end(); iter12++)
		{
			if (Player1.rect.getGlobalBounds().intersects(pickupArray[counter].rect.getGlobalBounds()))
			{
				if (pickupArray[counter].isdbpoints == true) 
				{ //Działa! Dzięki!
					clockDB.restart();
					Player1.timer = sf::Time::Zero;
					Player1.accumulator = sf::Time::Zero;
					cout << "DOUBLE POINTS" << endl;

					Player1.point = 20;
				}
				if (pickupArray[counter].ismaxammo == true) { //dziala
					Player1.fullammo = Player1.FULLAMMO;
					Player1.ammoLeft = true;
					cout << Player1.fullammo << endl;
					cout << "MAX AMMO" << endl;
					
				}
				if (pickupArray[counter].isinstakill == true) { //dziala
					projectile1.attackDamage = Player1.INSTAKILL;
					cout << "INSTAKILL" << endl;
				
				}
				pickupArray[counter].destroy = true;
			}
			counter++;
		}
		

		//Poza iterem
		if (pickup1.isdbpoints == true) {
			Player1.timer = clockDB.restart();
			Player1.accumulator += Player1.timer;

			if (Player1.accumulator.asSeconds() >= 10.f)
			{
				Player1.point = 10;
				pickup1.isdbpoints = false;
				cout << "Normal Ammo";
			}
		}

 

Podobne pytania

0 głosów
2 odpowiedzi 690 wizyt
pytanie zadane 23 marca 2016 w C i C++ przez Akiz521 Początkujący (480 p.)
0 głosów
1 odpowiedź 236 wizyt
pytanie zadane 16 października 2021 w JavaScript przez MFFC Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 823 wizyt
pytanie zadane 10 stycznia 2019 w C i C++ przez Ramona Okrzykińska Nowicjusz (120 p.)

92,556 zapytań

141,403 odpowiedzi

319,559 komentarzy

61,942 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!

...