Skocz do zawartości

chodzenie po nie równym terenie


lew_leo

Rekomendowane odpowiedzi

witam ostatnio robię platformówkę z nierównym terenem tak by jak schodzi z górki postać nie zeskakiwała tylko schodziła,

 

stworzyłem już na to kod lecz wydaje mi się mało optymalny i zastanawiam się czy istnieją jakieś lepsze metody na uzyskanie podobnego efektu

 

untitled_by_lionxdagger-db600pv.png

if keyboard_check(vk_right)
{
for (i=10;i>=-10;i-=1)
{
if place_free(x+spx,y+i)
{

image_xscale=1
x+=spx

y+=i
break;
}}}

}

 

najlepszym przykładem o co mi chodzi tutaj chyba była by gra przygodowa Fantastic Adventures of Dizzy

Odnośnik do komentarza
Udostępnij na innych stronach

zrób pętle for w której podnosisz od y do y-(max wysokość kroku) i wyjdź z niej break'iem jak tylko znajdziesz odpowiednią wysokość. Szybciej nie będzie..

Edit: Zawsze mozesz uzywac collision_point, ktore powinno byc szybsze od place_free.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie jest źle. Jedyne kroki optymalizacyjne jakie mogę zaproponować to:

 

1. Pozbycie się place_free(x+spx,y+i) i zastąpienie tego czystą matematyką. Masz bloki wyrównane do siatki. x mod SZEROKOSCSIATKI = Pozycja relatywnie do bloku. Jeżeli boczki masz tylko w kilku wariantach i powierzchnia jest linią prostą to możesz zapamiętać ich punty y1 i y2 a potem interpolacją liniową określać pozycję ;) Pseudokod będzie wyglądał mniej więcej tak:

 

Ustalmy że szerokość siatki to stałe 32px i bloczki mają origin na [0,0] Dla czerwonego bloczku najbardziej z prawej strony na twoim screenie wartości będą.

GML
y1=16

y2=0

Jeżeli gracz stoi gdzieś na tym bloku to jego pozycja y wyniesie:

GML
//b to blok

b=instance_position(x, y, obj)

if(instance_exists(b)) {

y=b.y+lerp(b.y1,b.y2,(x%32)/32)

}

Jedyny problem to wykrycie z którym blokiem zachodzi kolizja.

 

2. Kolejny prostszy sposób, ale wykluczający pierwszy, to zmniejszenie ilości instance. W room editor możesz rozciągnąć prostokątne bloczki by zajmowały więcej pól ale było ich mniej. Spójrz na swój screen. postać stoi na 8 identycznych bloczkach. Wystarczyłby tam jeden rozciągnięty.

Odnośnik do komentarza
Udostępnij na innych stronach

zrób pętle for w której podnosisz od y do y-(max wysokość kroku) i wyjdź z niej break'iem jak tylko znajdziesz odpowiednią wysokość. Szybciej nie będzie..

Edit: Zawsze mozesz uzywac collision_point, ktore powinno byc szybsze od place_free.

ta pętla for mniej więcej na tej samej zasadzie mi działa jak opisałeś jest jakaś różnica miedzy tymi pętlami?

z collision_point to może być nawet ciekawy pomysł dzięki

 

Nie jest źle. Jedyne kroki optymalizacyjne jakie mogę zaproponować to:

 

1. Pozbycie się place_free(x+spx,y+i) i zastąpienie tego czystą matematyką. Masz bloki wyrównane do siatki. x mod SZEROKOSCSIATKI = Pozycja relatywnie do bloku. Jeżeli boczki masz tylko w kilku wariantach i powierzchnia jest linią prostą to możesz zapamiętać ich punty y1 i y2 a potem interpolacją liniową określać pozycję ;) Pseudokod będzie wyglądał mniej więcej tak:

 

Ustalmy że szerokość siatki to stałe 32px i bloczki mają origin na [0,0] Dla czerwonego bloczku najbardziej z prawej strony na twoim screenie wartości będą.

GML
y1=16

y2=0

Jeżeli gracz stoi gdzieś na tym bloku to jego pozycja y wyniesie:

GML
//b to blok

b=instance_position(x, y, obj)

if(instance_exists(b)) {

y=b.y+lerp(b.y1,b.y2,(x%32)/32)

}

Jedyny problem to wykrycie z którym blokiem zachodzi kolizja.

 

2. Kolejny prostszy sposób, ale wykluczający pierwszy, to zmniejszenie ilości instance. W room editor możesz rozciągnąć prostokątne bloczki by zajmowały więcej pól ale było ich mniej. Spójrz na swój screen. postać stoi na 8 identycznych bloczkach. Wystarczyłby tam jeden rozciągnięty.

ten pierwszy pomysł brzmi nawet ciekawie może przetestuje go

co do 2 to fakt tu tego nie zrobiłem ale normalnie bym rozciągał te collision block

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 tygodnie później...

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