Skocz do zawartości

Problem ze przełączaniem animacji przy kolizji z podłożem.


Xender

Rekomendowane odpowiedzi

Tworzę platformową grę, na razie jestem na etapie dodawania animacji, osobno dla biegu, stania i spadania. Kolizja i poruszanie działa bez błędnie.

Oto kod:

 

Jest to kod dla postaci gracza dla eventu Create:

GML
vsp = 0; //vertical speed initialization

hsp = 0; //horizontal speed initalization

grounded = 0; //1 - object touch ground, 0 - not touching

grav = 0.5;

 

Natomiast to dla eventu Step:

GML
Key_W = keyboard_check_direct(ord("W"));

Key_S = keyboard_check_direct(ord("S"));

Key_A = keyboard_check_direct(ord("A"));

Key_D = keyboard_check_direct(ord("D"));

 

 

 

//Move left and right

if(Key_A)

{

hsp = -4;

image_xscale = -1;

}

 

if(Key_D)

{

hsp = 4;

image_xscale = 1;

}

 

if((Key_A && Key_D) or (!Key_A && !Key_D))

{

hsp = 0;

anim = 0;

}

 

 

//Jumping

if(Key_W)

{

if(grounded)

{

vsp = -12;

grounded = 0;

}

}

vsp += grav;

 

 

//Vertical Collision

if (place_meeting(x, y + vsp, par_wall) and vsp > 0)

{

while (!place_meeting(x, y+1, par_wall))

y += 1;

vsp = 0

grounded = 1;

}

 

 

//Ceiling Collision

if (place_meeting(x, y + vsp, par_wall) and vsp < 0)

{

while(!place_meeting(x, y-1, par_wall))

y -= 1;

vsp =0

}

 

 

//Horizontal Collision

if (place_meeting(x + hsp, y, par_wall))

{

while (!place_meeting(x + sign(hsp), y, par_wall))

x += sign(hsp);

hsp = 0;

}

 

 

//Commit to movement

x += hsp;

y += vsp;

 

 

//Animation

if(grounded)

{

if (hsp != 0)

{

sprite_index = run;

}

else

{

sprite_index = stand;

}

}

else

{

if (vsp < 0)

{

sprite_index = jump;

}

else

{

sprite_index = fall;

}

}

 

Wszystkie sprite'y zmieniają się poprawnie poza sytuacją gdy swobodnie spadam bez wcześniejszego podskoczenia. Na przykład: gdy podejdę do krawędzi i nie wykonując skoku po prostu z niej spadnę.

Dzieje się tak ponieważ zmienna grounded (określa czy znajduję się na ziemi czy nie) nie przestawia się na 0 (czyli jestem w powietrzu) przez co nie wchodzi do bloku który zmienia animacje na jump lub fall.

 

Niestety gdy blok odpowiedzialny za zmianę jump i fall zrobię jako niezależny od grounded, to podczas lądowania na ziemi animacja zmienia się kilka razy między animacją stand i fall przez co postać wygląda jak by się telepała. Jak to rozwiązać?

Odnośnik do komentarza
Udostępnij na innych stronach

nieczytalem teraz dokladnie, dlatego napisze tylko tak bylejak, wiec moze byc blad

 

sproboj do vertical colision dodac ustawienia zmiennej grounded na 0

GML
//Vertical Collision

if (place_meeting(x, y + vsp, par_wall) and vsp > 0)

{

while (!place_meeting(x, y+1, par_wall))

y += 1;

vsp = 0

grounded = 1;

}

else {grounded = 0; };

Odnośnik do komentarza
Udostępnij na innych stronach

Sprawdzałem już tą opcję niestety nic to nie dało. Zasadniczo w takiej sytuacji w momencie gdy postać jest kilka pxieli nad gruntem to sprite zmienia się kilkukrotnie między staniem w miejscu a opdaniem.

Jak wywalam to else grounded = 0; to wszystko działa poprawnie, z tym że w sytuacji gdy swobodnie opadam to niestety nie ma animacji opadania, tylko gdy wcześniej skoczę.

Odnośnik do komentarza
Udostępnij na innych stronach

w

GML
//Jumping

if(Key_W)

{

if(grounded)

{

vsp = -12;

grounded = 0;

}

}

vsp += grav;

 

wywal

GML
grounded = 0;

 

a w

GML
//Vertical Collision

if (place_meeting(x, y + vsp, par_wall) and vsp > 0)

{

while (!place_meeting(x, y+1, par_wall))

y += 1;

vsp = 0

grounded = 1;

}

usun

GML
grounded = 1

 

Na poczatku kodu(zaraz pod przypisaniem klawiszy) daj

GML
if place_meeting(x, y+1, par_wall) then grounded = 1; else grounded = 0;
Odnośnik do komentarza
Udostępnij na innych stronach

Działa, dzięki :D

 

mam jeszcze jedno pytanie co do spriteów, czy różne sprite'y ruchu dla jednego obiektu muszą mieć ten sam rozmiar czy mogą być różne? Problem jest taki że gdy mam sprite od stania w miejscu i biegania to gdy uaktywnia się stanie to postać się blokuje. Jak poprawnie ustawić Origin żeby nie było z tym problemu?

Odnośnik do komentarza
Udostępnij na innych stronach

Ustal jakich wymiarów ma być bounding box i we wszystkich spritach ustaw na manual i zrób tych samych wymiarów ( typ box, NIE PRECISE )

Jeżeli sprite'y są różnych wymiarów ustaw wszędzie origin w tym samym punkcie na postaci, np. na środku twarzy lub między stopami pod kroczem(jakkolwiek to brzmi to krocze zawsze będzie na środkowej szerokości postaci więc jest dobrym punktem odniesienia dla pozycji X)

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