Cekol Opublikowano 15 Maja 2009 Udostępnij Opublikowano 15 Maja 2009 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 Więcej opcji udostępniania...
Dawidds Opublikowano 15 Maja 2009 Udostępnij Opublikowano 15 Maja 2009 Nie wiem do końca, o co Ci chodzi, ale spróbuj po prostu napisać własny system direction/speed/hspeed/vspeed/motion_x(). Taki, który automatycznie będzie się zatrzymywał na solidach. Choć pewnie źle zrozumiałem... :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Cekol Opublikowano 15 Maja 2009 Autor Udostępnij Opublikowano 15 Maja 2009 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 Więcej opcji udostępniania...
Dawidds Opublikowano 15 Maja 2009 Udostępnij Opublikowano 15 Maja 2009 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 Więcej opcji udostępniania...
Cekol Opublikowano 15 Maja 2009 Autor Udostępnij Opublikowano 15 Maja 2009 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 Więcej opcji udostępniania...
Konrad-GM Opublikowano 15 Maja 2009 Udostępnij Opublikowano 15 Maja 2009 Stare, ale jare :3 https://gmclan.org/up1717_11_Platformowka.html Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę