Skocz do zawartości

Zablokowane Stała prędkość grawitacji


Piedro

Rekomendowane odpowiedzi

Witam. mam problem z grawitacją w moim remake NSMB (New Super Mario Bros.). Od jakiegoś czasu przestała mi się podobać grawitacja "domyślna" typu

GML
if place_free(x,y+1)

{gravity = 1}

else

{gravity = 0}

Czy dało by radę zrobić tak aby wartość grawitacji była stała?

Za pomoc wielkie DZIĘKI :)

Odnośnik do komentarza
Udostępnij na innych stronach

W tym wypadku wartość grawitacji jest stała. :| Chodzi ci chyba o prędkość spadania (to co innego jest). Zamiast gravity użyj zmiennej vspeed.

 

ED: Tylko kod nie rób tan sam. Musiz to zrobić w trochę inny sposób

O to mi chodziło ZeroXbot.

Tylko ja sam próbowałem coś takiego zrobić już parę dni temu ale mi nie idzie <_<

Proszę o jakąkolwiek pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli on chciał zrobić ogranicznik prędkości tylko do jakiegoś maxa to można to było inaczej. Zostawiając te grawitację itp.

 

Ale on chce chyba by zawsze z tą samą prędkością spadał.

GML
if place_free(x,y+1)

{vspeed= 10}

else

{vspeed= 0}

Odnośnik do komentarza
Udostępnij na innych stronach

Dajesz sobie jakiś kodzik typu:

GML
vspd += grav;

hspd = min(maxhspd, max(hspd, minhspd));

vspd = min(maxvspd, max(vspd, minvspd));

 

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; }

}

}

}

W Create zadeklaruj odpowiednie zmienne.

 

Ogólny bajerek jest taki, że te jeśli sobie ustawisz np. hspd (odpowiednik hspeed) na 100, to postać zatrzyma się i tak co do piksela na przeszkodzie.

Inaczej mówiąc - nawet, jeśli postać cały czas będzie miała np. vspd równy 10, to i tak zatrzyma się na "podłodze". No.

 

Zrobienie ruchu platformowego na tym to aż ustawienie grav, i manipulacja hspd/vspd, dla poruszania się i skoków.

 

PS: Wiem, że kod zarypiście niezoptymalizowany i długi - mam go na kompie od chyba 2 lat, ale jakoś nie chce mi się go poprawiać... xd

 

Ed: Jakbyś się nie skapnął - to na końcu Stepa albo w End Stepie, jak Ci bardziej pasuje.

Odnośnik do komentarza
Udostępnij na innych stronach

heh, tylko widzisz, jeżeli spełni warunek place free to mu ustawi vspeed na 10, czyli jeśli podskoczy, to w następnym stepie już spełni warunek i zrzuci go na ziemię ;/

 

Ach przepraszam. Wiedziałem, że coś będzie be, ale jakoś już dzisiaj mi się nie chciało myśleć. Po odrabianiu prac domowych Mimka :P

Odnośnik do komentarza
Udostępnij na innych stronach

O LOL.

Nie mam pojęcia co mną kierowało podczas pisania tego kodu :>

 

Musiałem nie wiedzieć o istnieniu funkcji ceil, czy coś... xd

 

W każdym razie, to musi działać (korzystam z tego w moim aktualnym projekcie) :P

 

Ed: Eh.

Napisałem ten post nie patrząc na sam kod... :x

 

Tak MA być.

floor(x)+1 != ceil(x) dla całkowitego x.

Odnośnik do komentarza
Udostępnij na innych stronach

W evencie Step napisz:

 

GML
var grav_max,grav_przys;

 

grav_max = 5 //Maksymalna prędkość spadania

grav_przys = 0.1 //Przyspieszenie spadania

if(place_free(x,y+1))

 

{

 

if(vspeed < grav_max)

 

{

 

vspeed += grav_przys

 

}

 

}

 

else vspeed = 0

 

 

 

Proste i czytelne :)

Odnośnik do komentarza
Udostępnij na innych stronach

Poza tym, w evencie Create zaśmieca pamięć, więc lepiej zrobić to jako "var" w Stepie.
Teraz to dowaliłeś... =|

 

Pusty room, bez żadnego obiektu - 10,304K pamięci

Room z obj_test, w którym w Create deklarujemy tablicę posiadającą 10 tysięcy elementów - 10,556K pamięci.

 

252K różnicy.

A dodam, że chyba żaden idiota nie będzie deklarował tak dużej tablicy - my tu mówimy max 10 zmiennych, a nie 10 tysiącach.

 

Ale niech będzie.

1 instancja obj_test w roomie, która ma w stepie kod: "var test; test = sin(sqrt(2))" - 10,324K

To samo, ale zmienna test deklarowana w Create - 10,320K.

Ten sam test dla 575 instancji obj_test w roomie:

Deklarowane w Create - 10,324K

W stepie jako tymczasowa - 10,348K

 

Przynajmniej u mnie, jak nie wierzysz to sobie sprawdź.

 

Zresztą, nawet jeśli dla Twojego sposobu wyjdzie mniej pamięci - czytelność kodu i tak jest ważniejsza.

A poza tym - Twoje rozwiązanie jest napewno mniej wydajne (znaczy pod względem użycia procesora). Otóż po kija CO STEPA tworzyć zmienną tymczasową i nadawać jej nową wartość, jeśli można to zrobić RAZ :X ?

Odnośnik do komentarza
Udostępnij na innych stronach

W evencie Step napisz:

 

GML
var grav_max,grav_przys;

 

grav_max = 5 //Maksymalna prędkość spadania

grav_przys = 0.1 //Przyspieszenie spadania

if(place_free(x,y+1))

 

{

 

if(vspeed < grav_max)

 

{

 

vspeed += grav_przys

 

}

 

}

 

else vspeed = 0

 

 

 

Proste i czytelne :)

Wstawiłem ten kod ale postać nie odrywa się od ziemi. Co zrobiłem źle?

Odnośnik do komentarza
Udostępnij na innych stronach

if (vspeed>10)

{

vspeed=10;

}

facepalm.jpg

 

 

Nie no nie mogłem się powstrzymać... :|

A jak już to vspeed=min(vspeed, 10).

 

Co do tamtego ruchu:

 

GML
//Create

vspd = 0;

hspd = 0;

vspd_round = 0;

hspd_round = 0;

 

grav = 0.16;

minhspd = -5;

maxhspd = 5;

minvspd = -6;

maxvspd = 6;

 

//Step - Motion

if(!place_free(x, y+1)) //Jesli stoje na ziemii

{

if(keyboard_check(vk_up)) //Skok

{

vspd = -5.68;

}

 

if(keyboard_check(vk_left)) //Ruch na ziemii

{

hspd -= 0.5;

}

if(keyboard_check(vk_right))

{

hspd += 0.5;

}

 

if(!keyboard_check(vk_left) && !keyboard_check(vk_right)) //Jesli nie wciskam zadnego klawisza

{

if(hspd>0) //...to zwalniam

{

hspd-=0.5;

if(hspd<0){ hspd=0; }

}

if(hspd<0)

{

hspd+=0.5;

if(hspd>0){ hspd=0; }

}

}

}

else //Jesli jestem w powietrzu

{

if(keyboard_check(vk_left)) //Ruch w powietrzu

{

hspd -= 0.2;

}

if(keyboard_check(vk_right))

{

hspd += 0.2;

}

 

if(!keyboard_check(vk_left) && !keyboard_check(vk_right)) //Tu tez "zwalniam"

{

if(hspd>0)

{

hspd-=0.1;

if(hspd<0){ hspd=0; }

}

if(hspd<0)

{

hspd+=0.1;

if(hspd>0){ hspd=0; }

}

}

}

 

//Step - Physics

vspd += grav;

hspd = min(maxhspd, max(hspd, minhspd));

vspd = min(maxvspd, max(vspd, minvspd));

 

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; }

}

}

}

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...