lew_leo Opublikowano 16 Kwietnia 2017 Udostępnij Opublikowano 16 Kwietnia 2017 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 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 Więcej opcji udostępniania...
I am vader Opublikowano 16 Kwietnia 2017 Udostępnij Opublikowano 16 Kwietnia 2017 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 Więcej opcji udostępniania...
Threef Opublikowano 16 Kwietnia 2017 Udostępnij Opublikowano 16 Kwietnia 2017 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 Więcej opcji udostępniania...
lew_leo Opublikowano 16 Kwietnia 2017 Autor Udostępnij Opublikowano 16 Kwietnia 2017 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 Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 17 Kwietnia 2017 Administratorzy Udostępnij Opublikowano 17 Kwietnia 2017 move_contact_solid / move_outside_solid ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
pablo1517 Opublikowano 7 Maja 2017 Udostępnij Opublikowano 7 Maja 2017 Gnysek mnie uprzedził, ale tak, move_contact_solid robi robotę w tym wypadku. 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ę