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

Kolizje w grze 2d

VPS Starter Arubacloud
0 głosów
550 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 232 wizyt
pytanie zadane 19 czerwca 2022 w C i C++ przez hicodyn Początkujący (420 p.)
0 głosów
3 odpowiedzi 923 wizyt
pytanie zadane 3 lipca 2017 w C i C++ przez Programista3 Gaduła (3,390 p.)
+2 głosów
3 odpowiedzi 747 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez Nekronomik Użytkownik (600 p.)

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!

...