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

Znajdowanie najbliższego obiektu

VPS Starter Arubacloud
0 głosów
162 wizyt
pytanie zadane 1 października 2015 w C i C++ przez patryk16 Obywatel (1,080 p.)

Witam pisze platformówke mam algorytm na kolizje bloków ale nie działa po prawnie jeśli obiektów jest więcej niż 1.

Więc wpadłem na pomysł że działać będzie kolizja bloku njabliższemu obiektowi classy Player.

Napisałem do tego funkcjie typu bool która sprawdza położenie obiektu i sprawdza czy jest najbiżej obiektu classy Player.

Ale niedziała nie wiem czemu?

 bool Near(Player *play,int poz)//play gracz poz pozycja obiektu głównego
    {
int u[plan1.size()];
int y=abs(plan1[poz]->GetBody().getPosition().y-play->GetBody().getPosition().y);
for(int i=0;i<plan1.size();i++)
{
if(i!=poz){u[i]=abs(plan1[poz]->GetBody().getPosition().y-plan1[i]->GetBody().getPosition().y);}
}
int o;
for(int i=0;i<plan1.size();i++)
{
    if(i!=poz){if(y<u[i])o++;}
}
if(o>=plan1.size()-1)return true;
else return false;

}

 

Ps.Na razie sprawdza tylko pozycje y.

2 odpowiedzi

0 głosów
odpowiedź 1 października 2015 przez Patrycjerz Mędrzec (192,340 p.)
edycja 1 października 2015 przez Patrycjerz

Radzę ci stworzyć jedną klasę bazową dla wszystkich kolidujących obiektów (np. Object) i kontener (np. std::vector). Dzięki niemu będziesz mógł sprawdzać kolizję jedną pętlą, np.:

std::vector<Object*> objects;
objects.push_back(new Player);
objects.push_back(new Enemy);

for(std::vector<Object*>::iterator it = objects.begin(); it != objects.end(); it++)
{
	if((*it)->checkCollision())
	{
		//kolizja występuje
	}
	else
	{
		//kolizja nie występuje
	}
}

Oczywiście kontener może zawierac coś innego, niż wskaźniki, ale później łatwiej śledzić dany obiekt.

W pętli zastosowałem tzw. iterator, czyli wskaźnik na elementy kontenera (ułatwia to bardzo automatyzację kodu).

komentarz 1 października 2015 przez patryk16 Obywatel (1,080 p.)
plan1 jest właśnie vectorerm wskaźników classy abstrakcyjnej Object.
komentarz 1 października 2015 przez Patrycjerz Mędrzec (192,340 p.)

A nie lepiej zrobić metodę dla klasy Object, która przyjmuje, jako argument, kontener, a zwraca wskaźnik na obiekt, z którym występuje kolizja?

Jeszcze jedno... z jakiej biblioteki graficznej korzystasz? Z SFML?

0 głosów
odpowiedź 2 października 2015 przez criss Mędrzec (172,590 p.)
Możliwe, że nie działa wlasnie dlatego, że sprawdza tylko Y :|
Poza tym nie wiem dlaczego to tak rozwklekłeś. Zrób to w jednej pętli. Najpierw pobierz sobie odległość między graczem a obiektem, a potem przeleć przez cały vector sprawdzając w każdej iteracji czy odleglosc miedzy graczem a obiektem jest mniejsza od odleglosci miedzy graczem a aktualnie sprawdzanym w petli obiektem. Jesli tak, return false i koniec, nie mam pojęcia po co to tak rozciągnąłeś.

Popracuj nad czytelnością kodu i nazewnictem zmiennych bo dłuższą chwile mi zajęło dojście o co tu chodzi.

Swoją drogą - chyba większy sens miałaby funkcja wyszukująca najbliższą przeszkode i zwracającą np wskaźnik na nią?

Podobne pytania

0 głosów
0 odpowiedzi 66 wizyt
pytanie zadane 16 maja 2017 w PHP przez Marduczek Użytkownik (520 p.)
0 głosów
3 odpowiedzi 357 wizyt
0 głosów
5 odpowiedzi 724 wizyt

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!

...