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

Kolizje w grze 2d

Object Storage Arubacloud
0 głosów
552 wizyt
pytanie zadane 11 stycznia 2017 w C i C++ przez devi Początkujący (320 p.)

Jestem w trakcie tworzenia gry 2d w której mają zachodzić kolizje pomiędzy różnymi ścianami, problem polega w tym obiekt gracza nie zatrzymuje się na ścianach..

oto tablica ścian na planszy: 

Box wall[]{		{-43.0f,43.0f,-34.0f,36.0f},	{-27.0f,43.0f,-10.0f,36.0f},	{10.0f,43.0f,27.0f,36.0f},
				{ 34.0f,43.0f,43.0f,36.0f },	{-43.0f,28.0f,-34.0f,23.0f},	{-27.0f,28.0f,-23.0f,3.50f},
				{-27.0f,15.0f,-10.0f,11.25f},	{-14.0f,28.0f,14.0f,23.0f},		{-2.0f,28.0f,2.0f,11.30f},
				{23.0f,28.0f,27.0f,3.50f},		{10.0f,15.0f,27.0f,11.30f},		{43.0f,23.0f,34.0f,28.0f},
				{-14.5f,3.5f,-14.0f,-3.5f},		{-14.5f,3.5f,-4.0f,3.0f},		{-14.5f,-3.0f,14.5f,-3.5f},
				{14.0f,3.5f,14.5f,-3.5f},		{4.0f,3.5f,14.5f,3.0f},			{-27.0f,-3.50f,-23.0f,-15.0f},
				{-2.0f,-11.30f,2.0f,-26.70f},	{-14.5f,-3.50f,27.0f,-15.0f},	{-43.0f,-21.70f,-35.0f,-24.70f},
				{-38.0f,-21.70f,-35.0f,-34.0f},	{-27.0f,-21.70f,-10.0f,-26.70f},{10.0f,-21.70f,27.0f,-26.70f},
				{35.0f,-21.70f,38.0f,-34.0f},	{35.0f,-21.70f,43.0f,-24.70f},	{-43.0f,-41.0f,-10.0f, -43.0f},
				{-27.0f,-33.70f,-23.0f,-43.0f},	{-14.5f,-33.70f,14.5f,-34.70f},	{-2.0f,-33.70f,2.0f,-43.0f},
				{10.0f,-41.0f,43.0f,-43.0f},	{23.0f,-33.70f,27.0f,-43.0f},	{-52.0f,6.0f,-3.5f,3.5f},
				{-37.0f,15.0f,-3.5f,3.5f},		{-52.0f,15.0f,-3.5f,13.0f},		{-52.0f,52.0f,-50.0f,13.0f},
				{-52.0f,52.0f,52.0f,50.0f},		{-2.0f,52.0f,2.0f,36.0f},		{50.0f,52.0f,52.0f,13.0f},
				{35.0f,15.0f,52.0f,13.0f},		{35.0f,15.0f,37.0f,3.5f},		{35.0f,6.0f,52.0f,3.5f},
				{-52.0f,-3.5f,35.0f,-6.0f},		{-37.0f,-3.5f,-35.0f,-15.0f},	{-52.0f,-13.0f,-35.0f,-15.0f},
				{-52.0f,-13.0f,-50.0f,-52.0f},	{-5.0f,-32.0f,-4.5f,-34.0f},	{-52.0f,-50.0f,52.0f,-52.0f},
				{50.0f,-13.0f,52.0f,-52.0f},	{45.0f,-32.0f,52.0f,-34.0f},	{35.0f,-13.0f,52.0f,-15.0f},
				{35.0f,-3.5f,37.0f,-15.0f},		{35.0f,-3.5f,52.0f,-6.0f}
																													};

a oto algorytm na wyszukiwanie kolizji oraz funkcja ktora sprawdza czy w danym momencie postać gracza nie koliduje z żadną ściana.

 

bool is_colliding(Box A, Box B)
{
	if (A.left < B.left + B.width &&
	A.left + A.width > B.left &&
	A.top < B.top + B.height &&
	A.height + A.top > B.top)
	{
		return true;
	}
	else return false;
}

 

bool isCollision(Box box[], Box Pac)
{
	for (int i = 0; i < 53; i++)
	{
		if (is_colliding(box[i], Pac) == true)
			return true;

		else return false;
	}
}

obiekt gracza jest okręgiem który w kodzie opisuję jako Box,

okrąg ma promień 2.5f, i pozycja startowa to : Posx = 0.0f, Posy = -30.0f
(Posx,Posy)

jego współrzędne są ustawione (Posx-r, Posy+r, Posx+r, Posy-r)

if (_key == GLUT_KEY_RIGHT && !isCollision(wall,Pacman))
        {
                Posx += 0.5f;
        }

tak wyglada konstruktor obiektu Box

Bo(x,y,X,Y)
x - wspolrzedna x lewego gornego wierzcholka

y - wspolrzedna y lewego gornego wierzcholka

X - wspolrzedna x prawego dolnego wierzcholka

Y - wspolrzedna Y prawego dolnego wierzcholka

width = X - x

height = y - Y

 

gdyby był ktoś kto jest w stanie mi pomóc byłbym bardzo wdzięczny.

1 odpowiedź

0 głosów
odpowiedź 11 stycznia 2017 przez playerony Pasjonat (15,240 p.)
Wydaje mi się, że w funkcji is_colliding należy zamienić iloczyn logiczny(&&) na sume logiczną(||), gdzyż np. kolizja z lewej i prawej strony nie wystąpi jednocześnie w tym samym czasie.

Podobne pytania

0 głosów
0 odpowiedzi 255 wizyt
pytanie zadane 19 czerwca 2022 w C i C++ przez hicodyn Początkujący (420 p.)
0 głosów
3 odpowiedzi 968 wizyt
pytanie zadane 3 lipca 2017 w C i C++ przez Programista3 Gaduła (3,390 p.)
+2 głosów
3 odpowiedzi 760 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez Nekronomik Użytkownik (600 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...