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

Drzwi w SFML

VPS Starter Arubacloud
–1 głos
357 wizyt
pytanie zadane 15 września 2017 w C i C++ przez Artur Koniec Gaduła (3,670 p.)

Witam, kończę już moją grę w SFML, i klasę "wall", która robi po prostu kolizje(kwadraty), mam tez drzwi, i chciałbym by po kupieniu drzwi, kolizja z tych drzwi znikała. Teoretycznie to działa, tylko że jak kupię jedne drzwi, kolizja znika ze wszystkich, jak mam to rozwiązać? (Dodam że drzwi kupuje się pod przyciskiem F)

//PRZED PETLA GLOWNA
wall1.destructable = true;
	wall1.rect.setPosition(GateRect.getPosition().x, GateRect.getPosition().y);
	wall1.rect.setSize(sf::Vector2f(150, 50));
	wallArray.push_back(wall1);

	wall1.rect.setPosition(DoorKFCRect.getPosition().x, DoorKFCRect.getPosition().y);
	wall1.rect.setSize(sf::Vector2f(50, 50));
	wallArray.push_back(wall1);
	
	wall1.rect.setPosition(WideGateRect.getPosition().x, WideGateRect.getPosition().y+50);
	wall1.rect.setSize(sf::Vector2f(150, 50));
	wallArray.push_back(wall1);

	wall1.rect.setPosition(WideGateRect2.getPosition().x, WideGateRect2.getPosition().y + 50);
	wall1.rect.setSize(sf::Vector2f(150, 50));
	wallArray.push_back(wall1);

	wall1.rect.setPosition(WideGateRect3.getPosition().x, WideGateRect3.getPosition().y + 50);
	wall1.rect.setSize(sf::Vector2f(150, 50));
	wallArray.push_back(wall1);

	wall1.rect.setPosition(FurtkaRect.getPosition().x, FurtkaRect.getPosition().y);
	wall1.rect.setSize(sf::Vector2f(150, 50));
	wallArray.push_back(wall1);

	wallArray.push_back(wall1);
	wall1.rect.setPosition(BramaRect.getPosition().x, BramaRect.getPosition().y + 50);
	wall1.rect.setSize(sf::Vector2f(150, 50));
	wallArray.push_back(wall1);
	//kolizja zrobiona, juz na mapie
	//W PETLI GLOWNEJ
		counter2 = 0;
		for (iter15 = wallArray.begin(); iter15 != wallArray.end(); iter15++)
		{
			if (Player1.rect.getGlobalBounds().intersects((wallArray[counter2].rect.getGlobalBounds())), sf::Keyboard::isKeyPressed(sf::Keyboard::F))
			{
				if (wallArray[counter2].destructable == true)
				{
				wallArray[counter2].destroy = true;
				}
			}
			counter2++;
		}

 

2 odpowiedzi

+1 głos
odpowiedź 15 września 2017 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
edycja 15 września 2017 przez criss
 
Najlepsza

Co dokładnie ma robić zmienna counter2? Mam wrażenie, że trochę mieszasz używanie iteratora z używaniem licznika w postaci liczby.

Poza tym staraj się nie pisać warunków takich jak w linii numer 36 - program staje się przez to nieczytelny, przez co łatwiej o pomyłkę! Dlaczego pomiędzy wywołaniem funkcji intersects oraz isKeyPressed dałeś przecinek? Jeżeli oba warunki mają być spełnione jednocześnie, to użyj operatora logicznego "and".

Warto byłoby raczej sprawdzać, czy gracz jest w zasięgu możliwych od odblokowania drzwi, gdy wciśnięty został odpowiedni klawisz. Jeśli klawisz wciśnięty - sprawdzamy, czy jest w zasięgu jakichś drzwi, jeśli nie - nie robimy nic (omijamy pętlę).

Pseudokod:

jeżeli wciśnięty klawisz F, to:
	dla każdego elementu z wallArray:
		jeżeli gracz jest w zasięgu sprawdzanego elementu:
			jeżeli usuwalny:
				usuń rozpatrywany element

Jeżeli programujesz obiektowo, to byłoby warto wykorzystać konstruktor, zamiast zmieniać wielokrotnie jeden element i dodawać jego warianty do tablicy/wektora (mam na myśli fragment "przed pętlą główną").

 

Pozdrawiam!

 

komentarz 15 września 2017 przez Artur Koniec Gaduła (3,670 p.)
Omg, nie ma pojęcia dlaczego tam dałem przecienek, zawsze daje &&, ale dziękuję bardzo za pomysł z najbliższymi drzwiami, w konstruktorze jest podane że default kwadrat kolizji ma 50x50, poprstu na potrzeb tych drzwi przypisywalem kaźdy z osobna dla pewności, jutro zaimplementuje i napisze rezultat :)
+1 głos
odpowiedź 15 września 2017 przez Przemek Gaduła (3,600 p.)
Lecisz pętlą po wszystkich elementach i z każdego zdejmujesz kolizje, więc zawsze zniknie ze wszystkich. Musisz znaleźć sposób, aby kupić poszczególne drzwi. Np. Kupujesz tylko najbliższe drzwi albo te na które klikniesz myszka.

Podobne pytania

0 głosów
0 odpowiedzi 215 wizyt
pytanie zadane 28 listopada 2020 w C i C++ przez Mateusz1223 Bywalec (2,440 p.)
0 głosów
1 odpowiedź 217 wizyt
pytanie zadane 6 sierpnia 2017 w C i C++ przez CPP_Newbie Użytkownik (770 p.)
0 głosów
1 odpowiedź 381 wizyt
pytanie zadane 13 października 2016 w C i C++ przez 10kw10 Pasjonat (22,880 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 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!

...