Skocz do zawartości

Kolizja - sterowanie padem


Rekomendowane odpowiedzi

Dzień Dobry, 
Aż wstyd mi jest zakładać wątek w tej sprawie, bo po takim czasie, powinienem wiedzieć jak to robić, aczkolwiek nie chce znowu porzucić gm'a poprzez zniechęcenie się, także pytam. Sterowanie jest napisane pod pada, pod analog. Nie mogę sobie poradzić z napisaniem dobrej kolizji. Nasmarowałem coś takiego:

Maska kolizji + origin + wymiary bohatera:
fq_colmask.png

Maska kamienia jest na precise, a origin ustawiony w środku sprita

Kod:

axisY = gamepad_axis_value(0, gp_axislv); //zczytaj ustawienie lewego analogu vertykalnie
axisX = gamepad_axis_value(0, gp_axislh); //zczytaj ustawienie lewego analogu horyzontalnie
if(gamepad_button_check(0, gp_face1)) game_restart();

if(scr_gp_treshold(0, 0.2)) //martwa strefa gałki
{
    dir = point_direction(0, 0, axisX, axisY); //oblicz kierunek
	spd = (abs(axisX) + abs(axisY))*max_spd; //oblicz spd wraz z przyspieszeniem 
}
else
{
	spd = 0; 
}

motion_set(dir, spd); //nadaj ruch

//kolizja
if(!place_free(x, y))
{
	var _id = instance_place(x, y, oRock);
	var _dirOpposite = point_direction(_id.x, _id.y, x, y);
	//motion_set(_dirOpposite, spd);
	while(!place_free(x, y)) 
	{
		x+=lengthdir_x(.1, _dirOpposite);
		y+=lengthdir_y(.1, _dirOpposite);
		
	}
	
}


Efekty tego są takie
Przy jednej przeszkodzie, wygląda świetnie:
fq_work.gif


Ale przy kilku mniejszych, osadzonych obok siebie, postać teleportuje się na drugą stronę:
fq_niework.gif

Pytania:
a) jakieś pomysły, co tu zmienić?
b ) mam pooglądać poradniki na YT, bo ten kod do niczego się nie nadaje?
c) Czy można skorzystać wbudowanej fizyki w gm:s2 czy lepiej tego nie używać?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

a próbowałeś z move_outside_solid zamiast tego while ? Jak dla mnie, to tam gdzieś jest kolizja z dwoma kamieniami na raz i wtedy kierunek od nie tego jest brany, dlatego ten skok.

Odnośnik do komentarza
Udostępnij na innych stronach

To wyraźnie wygląda jakby wyjście z kolizji z jednego kamienia wrzuca cię w kolizję z drugim. Dodaj sobie
 

var _id = instance_place(x, y, oRock);
show_debug_message(_id)

I zobacz czy ID jest wciąż jedno czy więcej. 

 

Ogólnie wydaje mi się że wystarczy przy wykryciu kolizji cofnąć do ostatniej pozycji

if(!place_free(x, y)) {
	speed = 0 // moze nie być potrzebne
	x = xprevious
	y = yprevious
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Niestety, move_outside_solid powodował, że postać wchodziła w ścianę i poruszała się wolniej(?) Natomiast co mnie zdziwiło bardziej, to to, że przykład Threefa, brzmiał w teorii bardzo prosto i wydawałoby się, że powinien zadziałać stu procentowo, czyli "uderzyłeś w ścianę, cofnij się o jeden pixel", co w zupełności nie przełożyło się na praktykę :o Kod zadziałał tak... jakby go nie było :o Niemniej dzięki za podpowiedzi inaczej pewnie bym porzucił temat i odłożył GM'a na kolejne miesiące.

 

Poczytałem trochę, pomyszkowałem, poszperałem i mam! Znalazłem i działa bardzo dobrze! 
https://www.yoyogames.com/blog/432/buttery-smooth-tech-tips-movement

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...