Skocz do zawartości

Kolizje ciąg dalszy


Pablo-GM

Rekomendowane odpowiedzi

Witam , powraca odwiecznie nurtujący mnie problem kolizji bohatera ze ścianą . Cholibka player zacina się na nich , chciałbym uzyskać efekt " ślizgania się " . Ktoś jest w stanie mi w tym pomóc ?

Swoją drogą przeczesałem dużą część forum - mimo wszystko żadne z rozwiązań mi nie pomogło .

Odnośnik do komentarza
Udostępnij na innych stronach

Metoda może i prymitywna - najważniejsze , że działa : -D

GML
if keyboard_check(ord('W')) && !keyboard_check(ord('S'))

{

if keyboard_check(ord('A')) && !keyboard_check(ord('D'))

{t

nx = x+lengthdir_x(spd1,135);

ny = y+lengthdir_y(spd1,135);

}

else if keyboard_check(ord('D')) && !keyboard_check(ord('A'))

{

nx = x+lengthdir_x(spd1,45);

ny = y+lengthdir_y(spd1,45);

}

else

{

nx = x+lengthdir_x(spd1,90);

ny = y+lengthdir_y(spd1,90);

}

if place_free(nx,ny) {

x = nx;

y = ny;

}

}

if keyboard_check(ord('S')) && !keyboard_check(ord('W'))

{

if keyboard_check(ord('A')) && !keyboard_check(ord('D'))

{

nx = x+lengthdir_x(spd1,225);

ny = y+lengthdir_y(spd1,225);

}

else if keyboard_check(ord('D')) && !keyboard_check(ord('A'))

{

nx = x+lengthdir_x(spd1,315);

ny = y+lengthdir_y(spd1,315);

}

else

{

nx = x+lengthdir_x(spd1,270);

ny = y+lengthdir_y(spd1,270);

}

if place_free(nx,ny) {

x = nx;

y = ny;

}

}

if keyboard_check(ord('A')) && !keyboard_check(ord('D')) && !keyboard_check(ord('W')) && !keyboard_check(ord('S'))

{

nx = x+lengthdir_x(spd1,180);

ny = y+lengthdir_y(spd1,180);

if place_free(nx,ny) {

x = nx;

y = ny;

}

}

if keyboard_check(ord('D')) && !keyboard_check(ord('A')) && !keyboard_check(ord('W')) && !keyboard_check(ord('S'))

{

nx = x+lengthdir_x(spd1,0);

ny = y+lengthdir_y(spd1,0);

if place_free(nx,ny) {

x = nx;

y = ny;

}

}

if (!keyboard_check(ord('D')) && !keyboard_check(ord('A')) && !keyboard_check(ord('W')) && !keyboard_check(ord('S'))) move_snap(1,1);

Odnośnik do komentarza
Udostępnij na innych stronach

O fuj! Nie wiem po co ci lengthdir'y. Zaraz Ci podeślę sposób jaki użyłem w I accidently made polybius. Wrócę z editem.

GML
stat_speed=10//Prędkość poruszania

if!((keyboard_check(vkey_up) or keyboard_check(vkey_down)) and (keyboard_check(vkey_left) or keyboard_check(vkey_right)))

{ss=stat_speed}

else

{ss=(stat_speed/2)*sqrt(2)}

 

if(keyboard_check(vkey_up)){if(place_free(x,y-32)){y-=ss*dt()}else{move_contact_solid(90,ss*dt())}}

if(keyboard_check(vkey_down)){if(place_free(x,y+32)){y+=ss*dt()}else{move_contact_solid(270,ss*dt())}}

if(keyboard_check(vkey_left)){if(place_free(x-32,y)){x-=ss*dt()}else{move_contact_solid(180,ss*dt())}}

if(keyboard_check(vkey_right)){if(place_free(x+32,y)){x+=ss*dt()}else{move_contact_solid(0,ss*dt())}}

 

Usuń sobie delta_time (dt()) jeśli nie potrzebujesz.

Odnośnik do komentarza
Udostępnij na innych stronach

Ja zawsze robiłem w ten sposób:

GML
sp = liczba    //event create</span>

GML
x += sp    //event strzalka w prawo</span>
 

GML
x -= sp    //event strzalka w lewo</span>

GML
y += sp    //event strzalka w dol</span>
 

GML
y -= sp    //event strzalka w gore</span>

GML
if(!place_free(x,y)) {x = xprevious; y = yprevious}

x = min(room_width,max(0,x)); y = min(room_height,max(0,y))     //event step</span>

Odnośnik do komentarza
Udostępnij na innych stronach

Wszystko opiera się o move_contact_solid. Pomysł ten podsunął Sernat więc to jemu należy dziękować. Ja tylko wykorzystałem wzór na przekątną kwadratu aby poruszanie odbywało się we wszystkich kierunkach z tą samą prędkością.

Odnośnik do komentarza
Udostępnij na innych stronach

Sorry! To jest akurat przykład kodu "zrób i zapomnij". :D To wszytko ma na celu tylko to że nie muszę scrollować kilku stron, a od razu widzę że ten kod odpowiada za poruszanie i mam go nie ruszać, bo wszystko jest z nim ok. Tak, wiem! Mógłbym zrobić skrypt, ale to też wg mnie nie jest czytelne. Wolę używać osobnych klocków execute code. Szczgólnie odkąd możemy nadawać im etykiety (///Movement).

Odnośnik do komentarza
Udostępnij na innych stronach

Tak już ze mną jest. Przykładam wagę tylko do czytelności kodu który jestem pewien że będę w przyszłości edytował.

Tak już lepiej?:

///Other
if(on_fire>0)
{
on_fire-=1
}

if(keyboard_check_released(ord("R")))
{
sc_blood_part()
instance_destroy()
}

if(y>room_height)
{
global.txt="You're unlocked an achievement#There's no exit!!"
o_controler.alpha=1
instance_destroy()
}


if(vspeed>20)
{
vspeed=20
}

if(x>0 and x<64 and y>355)
{
y=40
if(portal=0)
{
global.txt="You're unlocked an achievement#Think with portals!"
o_controler.alpha=1
portal=1
}
}

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ę...