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

C++ SFML - Przeładowanie bronii w grze

Object Storage Arubacloud
+1 głos
345 wizyt
pytanie zadane 11 sierpnia 2017 w C i C++ przez Artur Koniec Gaduła (3,670 p.)

Witam! Mam pewien problem w mojej grze "Rpg", otóż po naciśnięciu spacji, nasza postać strzela takim kwadratem jeszcze bez tekstury, w pliku player.h, dodałem zmienne bool reloading = false; , oraz int ammo = 10, strzelanie odbywa się w pętli głównej programu, więc co strzał ammo jest dekrementowane, linijkę poniżej jest if który sprawdza czy ammo nie ma w sobie zera, jeżeli ma, musi przestawić reloading na true, przez co nie będzie dało się strzelać, po przestawieniu, if ma odliczyć dwie sekundy na "zmianę magazynka", i po odczekaniu dwóch sekund dać ammo spowrotem zawartość = 10, oraz ponownie wznowić możliwość strzelania zmieniając reload spowrotem na false, i czy ktos mi podpowie jak mam zrobić te uprzykrzające mi od trzech dni życie odliczanie? próbowałem na wiele sposobów, nie poszło...(w konsoli, 10 razy wyświetli się cout strzal i odrazu reload).

if (Player1.reload == false)
		{
			// Fires projectile (Space bar)
			if (elapsed1.asSeconds() >= 0.1)
			{
				clock.restart();

				if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
				{
					projectile1.rect.setPosition(Player1.rect.getPosition().x + Player1.rect.getSize().x / 2 - projectile1.rect.getSize().x / 2, Player1.rect.getPosition().y + Player1.rect.getSize().y / 2 - projectile1.rect.getSize().y / 2);
					projectile1.direction = Player1.direction;
					projectileArray.push_back(projectile1);
					Player1.ammo--;
					cout << "strzal"<<endl;
					if (Player1.ammo == 0)
					{
						Player1.reload = true;
						cout << "reloading!" << endl;
						//Tu musi byc odliczenie dwóch sekund
						Player1.ammo = 10;
						Player1.reload = false;
						
					}
					
				}
				
				}
				
			
		 }

 

2 odpowiedzi

+1 głos
odpowiedź 11 sierpnia 2017 przez Przemek Gaduła (3,600 p.)
wybrane 12 sierpnia 2017 przez Artur Koniec
 
Najlepsza
sf::Clock clock; //uruchamiasz zegar
 
sf::Time t1 = clock.getElapsedTime(); //pobierasz czas
std::cout << t1.asSeconds() << std::endl;

//jakis if jestli t1 będzie większe od 2 sek

clock.restart(); //jakbys chcial zresetowac zegar

 

komentarz 11 sierpnia 2017 przez Artur Koniec Gaduła (3,670 p.)
edycja 12 sierpnia 2017 przez Artur Koniec

Poprawiłem na takie coś i teoretycznie działa, ale niestety gry zrobię "full auto", i nie puszczam spacji, wszystko jest okej, ale gdy już spamuje spacją, to timer nie działa i można strzelać w nieskończoność

	//Reload
		if (Player1.reload == true)
		{
			sf::Time t1 = clock4.getElapsedTime();
			cout << "Start Timera" << endl;
			cout << t1.asSeconds() << endl;
			if (t1.asSeconds() > 5)
			{

				Player1.ammo = 10;
				clock4.restart();
				Player1.reload = false;


			}

		}
		if (Player1.reload == false && Player1.ammo >0)
		{
			// Fires projectile (Space bar)
			if (elapsed1.asSeconds() >= 0.1)
			{
				clock.restart();

				if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space))
				{
					projectile1.rect.setPosition(Player1.rect.getPosition().x + Player1.rect.getSize().x / 2 - projectile1.rect.getSize().x / 2, Player1.rect.getPosition().y + Player1.rect.getSize().y / 2 - projectile1.rect.getSize().y / 2);
					projectile1.direction = Player1.direction;
					projectileArray.push_back(projectile1);
					Player1.ammo--;
					cout << Player1.ammo << endl;
					BulletCounter++;
					//If out of ammo
					if (Player1.ammo <= 0)
					{
						cout << "reloading!" << endl;
						ReloadSound.play();
						Player1.reload = true;
					}
					
				}
				
				}
		 }
0 głosów
odpowiedź 12 sierpnia 2017 przez Artur Koniec Gaduła (3,670 p.)

Udało mi się rozwiązać problem, gdyby ktoś potrzebował, daje kod. Dziękuję.

//Reload

		if (Player1.reload == false && Player1.ammo >0)
		{
			// Fires projectile (Space bar)
			if (elapsed1.asSeconds() >= 0.1)
			{
				clock.restart();

				if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
				{
					projectile1.rect.setPosition(Player1.rect.getPosition().x + Player1.rect.getSize().x / 2 - projectile1.rect.getSize().x / 2, Player1.rect.getPosition().y + Player1.rect.getSize().y / 2 - projectile1.rect.getSize().y / 2);
					projectile1.direction = Player1.direction;
					projectileArray.push_back(projectile1);
					Player1.ammo--;
					cout << Player1.ammo << endl;
					//If out of ammo
					if (Player1.ammo <= 0)
					{
						cout << "reloading!" << endl;
						ReloadSound.play();
						Player1.reload = true;
					}
					
				}
				
				}
		 }
		if (sf::Keyboard::isKeyPressed(sf::Keyboard::R))
		{
			sf::Time t1 = clock4.getElapsedTime();
			//cout << t1.asSeconds() << endl;
			if (t1.asSeconds() > 2.03)
			{

				Player1.ammo = 10;
				clock4.restart();
				Player1.reload = false;


			}
		}

 

Podobne pytania

0 głosów
1 odpowiedź 250 wizyt
0 głosów
1 odpowiedź 40 wizyt
+3 głosów
1 odpowiedź 218 wizyt

92,555 zapytań

141,402 odpowiedzi

319,540 komentarzy

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

...