Skocz do zawartości

Najlepsza fizyka do gry platformowej.


Cekol

Rekomendowane odpowiedzi

Otóż robię grę (to co w sygnie) i nie mogę uporać się z fizyką w niej.

W grze postacie osiągają duże prędkości do 125px na klatkę + dochodzi timing (jeżeli fps spadnie do 30 a normalnie jest 60 to postać leci 2 razy szybciej)

maksymalnie może występować 10 graczy z taką samą fizyką, więc też trzeba na to patrzyć.

Murki to bloczki 32x32.

Na początku był problem w tym , że przy niskich fpsach, postać przelatywała przez ściany :P

Potem gdy zmieniłem fizykę opartą na "Promieniach" działało poprawnie, lecz strasznie muliło ;<

 

Tu moja wielka prośba, o zrobienie dobrej fizyki do gry tego typu (można używać wszystkich sposobów Byle by nie muliło) , w zamian będzie wpis do twórców (Creditsy) xd

Gra jest miodzio ładna i grywalna , tak więc do boju!

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi o to , aby klocek o rozmiarze 16x32 przy prędkości 66604k nie przeleciał przez ścianę :P

Znacie może jakąś bibliotekę na takie sprawy? ;< (nie chodzi tu o fizykę supa realistic havoc uber 500k) tylko o zwykłą kolizję

Odnośnik do komentarza
Udostępnij na innych stronach

vspd += grav;

 

if(vspd > 0)

{

vspd_round += vspd-floor(vspd);

if(vspd_round >= 1)

{

repeat(floor(vspd)+1)

{

if(place_free(x, y+1)){ y += 1; }else{ vspd = 0; }

}

 

vspd_round -= 1;

}

else

{

repeat(floor(vspd))

{

if(place_free(x, y+1)){ y += 1; }else{ vspd = 0; }

}

}

 

}

else if(vspd < 0)

{

vspd_round += abs(vspd)-floor(abs(vspd));

if(vspd_round >= 1)

{

repeat(floor(abs(vspd))+1)

{

if(place_free(x, y-1)){ y -= 1; }else{ vspd = 0; }

}

 

vspd_round -= 1;

}

else

{

repeat(floor(abs(vspd)))

{

if(place_free(x, y-1)){ y -= 1; }else{ vspd = 0; }

}

}

}

 

if(hspd > 0)

{

hspd_round += hspd-floor(hspd);

if(hspd_round >= 1)

{

repeat(floor(hspd)+1)

{

if(place_free(x+1, y)){ x += 1; }else{ hspd = 0; }

}

 

hspd_round -= 1;

}

else

{

repeat(floor(hspd))

{

if(place_free(x+1, y)){ x += 1; }else{ hspd = 0; }

}

}

 

}

else if(hspd < 0)

{

hspd_round += abs(hspd)-floor(abs(hspd));

if(hspd_round >= 1)

{

repeat(floor(abs(hspd))+1)

{

if(place_free(x-1, y)){ x -= 1; }else{ hspd = 0; }

}

 

hspd_round -= 1;

}

else

{

repeat(floor(abs(hspd)))

{

if(place_free(x-1, y)){ x -= 1; }else{ hspd = 0; }

}

}

}

 

UWAGA: Skopiowane z jakiegoś starego projektu, możliwe, że da się to zrobić wydajniej.

Nie chce mi sie tego teraz sprawdzać ;d

Edit: Lol, ale to żalowo napisane ;[

Odnośnik do komentarza
Udostępnij na innych stronach

yyyy, wiesz ... raczej nie skorzystam :P

GML
a= x- Ray_distance(x,y-15,180, 1000 )+8

b= x- Ray_distance(x,y+7,180, 1000 )+8

if abs(a) > abs(b) left_dyst=a else left_dyst=b

 

 

 

a= x+ Ray_distance(x,y-15,0,1000)-8

b= x+ Ray_distance(x,y+7,0,1000)-8

if abs(a) < abs(b) right_dyst=a else right_dyst=b

 

 

a= y - Ray_distance(x+7,y,90,1000)+16

b= y - Ray_distance(x-7,y,90,1000)+16

if abs(a) > abs(b) up_dyst=a else up_dyst=b

 

a= y + Ray_distance(x-7,y,270,1000)-16

b= y + Ray_distance(x+7,y,270,1000)-16

if abs(a) < abs(b) down_dyst=a else down_dyst=b

 

 

yspeed+=ygravity*global.lag

 

x+=xspeed*global.lag

y+=yspeed*global.lag

 

 

if y>down_dyst { y=down_dyst yspeed=0}

if y<up_dyst {y=up_dyst yspeed=0}

 

if x>right_dyst { x=right_dyst xspeed=0}

if x<left_dyst {x=left_dyst xspeed=0}

 

 

if abs(down_dyst-y)<1.5

{

leggrot-=xspeed*2.25*global.lag

if xspeed>0 {xspeed-=2*global.lag if xspeed<0 xspeed=0}

if xspeed<0 {xspeed+=2*global.lag if xspeed>0 xspeed=0}

}

Tak wygląda mój kod grawitacji.

Skrypt "Ray_distance" to funkcja "create_ray(argument0,argument1,argument2,argument3)" w której uzyskujemy dystans promienia. create_ray jest użyty z biblioteki gmphysx.

Lecz to wszystko muli!! ale nie wiem czemu 8 razy użyte "create_ray" nie powinno mulić ;<

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