Kolizja AABB - w jaki sposób można napisać mały silnik

0

Witam! Zastanawiam się w jaki sposób mógłbym napisać mały silnik do gry nad którą aktualnie pracuje oraz żeby do późniejszych projektów mógł się przydać. Co chciałbym osiągnąć? Najważniejszym punktem jest nauka, chciałbym już teraz powoli zacząć robić takie rzeczy, żeby później było mi łatwiej ciekawsze kody pisać. Wiem, że można sprawdzić kolizję w taki sposób:

void CheckCollision(Object1, Object2)
{
	if (Object1.x + Object1.w > Object2.x) return true;
	else if (Object1.x < Object2.x + Object2.w) return true;
	else if (Object1.y + Object1.h > Object2.y) return true;
	else if (Object1.y < Object2.y + Object2.h) return true;

	return false;
}

albo w taki sposób screenshot-20171101150239.png

Jednak nadal nie wiem czego powinienem tak naprawdę użyć, żeby moja kolizja była kompatybilna z różnymi rzeczami, np. jak chce zrobić wektor z mapą i sprawdzić kolizję między mapą a graczem, jak chce mieć przeciwnika i sprawdzać kolizję między przeciwnikiem mapą i graczem, itp.

0

Wydaje mi sie, że dokładnie opisałem w tym wątku: https://4programmers.net/Forum/C_i_C++/298059-kolizja_typu_sat_implementacja_w_grze
jak zaimplementować algorytm wykrywający kolizję dwuwymiarowych wieloboków.

0

Widzę dokładnie, zdjęcie numer 1. Tylko w jaki sposób mam zrobić projekcje kiedy mam kwadrat? Bo przy nierówności screenshot-20171101192002.png prosto obliczyć.
Czy to po prostu projekcja na kwadracie jest długością tego kwadratu?

0

No tak, głupie pytanie, raczej na pewno to jest długość boku kwadratu... Teraz pytanie jak tą wiedzę wykorzystać.

0

Projekcję liczy się analitycznie, projekcja to wektor, Prześledź, tp co pisałem w wątku, podlinkowany przeze mnie artykuł i Spróuj napisać kod sprawdzający kolizje, jak sobie nie Poradzisz to Wróć tu.

0

Wiec tak. Przeanalizowałem sobie wszystko z 10 razy. Nadal niestety nie rozumiem. Trudno mi sobie wyobrazić w jaki sposób mam to zrobić w programie.

0

Rzuce na to okiem to nie jest big deal, jak cos to w pytonie moge to skrobnac.

0

Bo może ja źle myślę. Mam kwadrat 32x32 który leży dobrze na osi x I y, więc nasz wektor to jeden z bokow ( weźmy prawy). Wiec nie musimy niczego obliczyć, bo nasz wektor prostopadly to os x o długości 32 piksele

0

Czyli jak mówiłeś w końcowym wyjaśnieniu musimy zrobić metode

int getCorner(int corner, rect)
{
  if (corner == 1) return rect.x;
  else  If (corner ==2) return rect.w + rect.x;
  else if (corner==3) return rect.y;
  else if (corner == 4) return rect.y + rect.h;

 return 0;
}

I wziąć po jedynym z rogów

0

Nie wiem za brdzo co to u ciebie corner czy rect, ale w wypadku gdy uklad jest w rogu kwadratu, projekcjami punktow na os x sa same punkty lub ich wspolrzedne x.

0

Znalazło się już rozwiązanie? Bo jestem ciekawy tego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1