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ć?