Ślizganie się w mapie kafelkowej

0

Zrobiłem funkcję do wykrywania kolizji dla mojej mapy kafelkowej. Funkcja działa poprawnie z jednym tylko błędem, którego nie jestem wstanie sam rozwiązać. Chodzi o to, że kolizja blokuje ślizganie się po ścianach tej mapy. Jeżeli gracz dotknie ściany górnym wierzchołkiem to jedyny ruch jaki może zrobić to pójście w duł.
Obraz z mojej gry w załączniku.

A to kod sprawdzający kolizję lewego górnego wierzchołka.

// Lewy gorny wierzchołek /////////////////////////////////

	// Sprawdzanie na którym kafelku znajduje się wierzchołek ///////
	liczba_x1 = player_x / BlockSize;
	liczba_y1 = player_y / BlockSize;
	liczba_x1 = ceil(liczba_x1);
	liczba_y1 = ceil(liczba_y1);
	liczba_x2 = liczba_x1;
	liczba_y2 = liczba_y1;

	// Kolizja - lewo ////////////////////////////
	if (ColMapFile[liczba_x2][liczba_y2] == 2)
	{
		if (player_x <= liczba_x2*BlockSize+BlockSize)
		{
			player_kolizja_left = true;
		}
	}
	else
	{
		player_kolizja_left = false;
	}

	// Kolizja - gora ////////////////////////////
	if (ColMapFile[liczba_x2][liczba_y2] == 2)
	{
		if (player_y <= liczba_y2*BlockSize+BlockSize)
		{
			player_kolizja_up = true;
		}
	}
	else
	{
		player_kolizja_up = false;
	}

A to kod poruszania:

	if (key[KEY_LEFT] && player_kolizja_left == false)
	{
		player_x -= 1;
	}	
	if (key[KEY_RIGHT] && player_kolizja_right == false)
	{
		player_x += 1;
	} 
	if (key[KEY_DOWN] && player_kolizja_down == false)
	{
		player_y += 1;
	}
	if (key[KEY_UP] && player_kolizja_up == false)
	{
		player_y -= 1;
	}
0

Po pierwsze w dół a nie w duł.
To dlatego, że kolizje z lewej i prawej też zachodzą. Klocek tak naprawdę nachodzi na ścianę, bo krok nigdy nie będzie idealny, dlatego, jak sprwadzisz czy nastała kolizja, to musisz cofnąć klocek do wspólrzędnych równych ścianie, dlatego też ważne jest sprawdzenie < a nie <= i > a nie >=

0

Nic nie dało zmienienie >= na > i <= na <.

0
MJay napisał(a)

jak sprwadzisz czy nastała kolizja, to musisz cofnąć klocek do wspólrzędnych równych ścianie
Tego nie zrobiłeś. Po wykonaniu kolidującego przesunięcia element już nachodzi na ścianę i "Sprawdzanie na którym kafelku znajduje się wierzchołek" zwraca ci współrzędne kafelka ściany.

0

powinieneś sprawdzić czy kolizja nie nastąpi przed wykonaniem ruchu wtedy nie będziesz musiał nic cofać.

0
blee napisał(a)

powinieneś sprawdzić czy kolizja nie nastąpi przed wykonaniem ruchu wtedy nie będziesz musiał nic cofać.
Takie podejście sprawdzi się pod warunkiem małego kroku przesunięcia. Jeśli krok będzie większy (gdy przedmiot porusza się szybko) to może się okazać, że zatrzyma się jeszcze kawałek przed ścianą.

0

@up, Można też tak, z tym, że takie zastosowanie, jeżeli krok jest za duży, nie pozwoli Ci "przytulić" się do ściany, tylko iść w pewnym odstępie od niej.
@autor, Kolizje masz z trzech stron, musisz temu zapobiec:
user image

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