Penguin Opublikowano 1 Marca 2018 Udostępnij Opublikowano 1 Marca 2018 Witam, tak jak w tytule tematu mam problem z ukośnymi platformami. Mam 4 objekty, -oPlayer (gracz) -oBlock (rodzic dalszych objektów)-oBlock1 (trójkąt prostopadły, który ma kąt prosty przy wierzchołku, który jest po prawej stronie na dole sprite'a, który ma pole 32x32, a dwa kąty najbliższe tego wierzchołka są równej długości(trochę to długie)),- oBlock2 ( to samo, tylko że po lewej stronie na dole). Gracz nie ma problemu z przesuwaniem się po oBlock1, i przesuwa się, tak jak powinien, lecz z oBlock2 gdy oPlayer próbuje po nim przejść, objekt się blokuje i nie potrafi zrobić byle jakiego ruchu w byle jakim kierunku. Jak to naprawić? Kody oPlayer: Create: v=1 max_y=5 Step: if place_free(x,y+1) vspeed+=1; Kolizja z oBlock: move_contact_solid (270,4) vspeed = 0 Keyboard <Left>: yy=0; ok=0; while (yy<=max_y&&ok=0) { if (place_free(x-v,y-yy)) { x-=v; if (!place_free(x,y+1)&&vspeed=0) y-=yy; ok=1; } } if(!place_free(x,y+max_y)&&vspeed=0) move_contact_solid(270,max_y); Keyboard <Right>: yy=0; ok=0; while(yy<=max_y&&ok=0) { if(place_free(x+v,y-yy)) { x+=v; if(!place_free(x,y+1)&&vspeed=0) y-=yy; ok=1; } yy+=1; } if(!place_free(x,y+max_y)&&vspeed=0) move_contact_solid(270,max_y);yy=0; Press <Up> if(!place_free(x,y+1)) vspeed=-15; Kody w oBlock: Kolizja z oPlayer: with(oPlayer) { if (vspeed>0&&!place_free(x,y+vspeed)) move_contact_solid(270,vspeed); vspeed=0; } W sprite oBlock1 i oBlock2 mam zaznaczone: -Precise collision checking -Separate collision mask oBlock nie ma sprite. Dziękuję i pozdrawiam Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Penguin Opublikowano 1 Marca 2018 Autor Udostępnij Opublikowano 1 Marca 2018 Tutaj projekt, w którym jest ten "problem". https://gmclan.org/up10010_4_Pixel_Game.html Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 1 Marca 2018 Udostępnij Opublikowano 1 Marca 2018 Widzisz, są dwa sposoby na kolizje: 1. Wszystko sie rusza jak chce, a jesli wykryje ze cos w cos wlazlo, to wypycha jedna z rzeczy zeby sie juz nie stykaly. 2. Wszystko sprawdza czy moze sie ruszyc bez kolidowania z innymi obiektami. Jezeli nie ma kolizji, ruch jest dozwolony. Ty korzystasz z metody 1szej, która jest...słaba, żeby się nie wyrażać, a w każdym razie ja nie jestem jej fanem. Proponuję Ci zrobić ruszanie się i kolizje na nowo, używając metody #2, a ruszanie się po skosach wyjdzie Ci automagicznie samo z siebie po dodaniu drobnych poprawek. do kodu poruszania się. Przykładowo, ruch w prawo może wyglądać na jeden z dwóch poniższych sposobów: if place_free(x+5,y) x+=5; //Metoda 1sza, dziala na wszystkie obiekty SOLID if !place_meeting(x+5,y,Parent_Obiektow_Solidnych) x+=5; //Metoda 2ga, dziala na obiekt Parent_Obiektow_Solidnych i ich wszystkie dzieci Dla płynnego poruszania się możemy użyć pętli for: for(var i=0;i<5;i++){ if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1; } Nastepnym krokiem jest dodanie "co jeśli jednak jest kolizja" czyli: for(var i=0;i<5;i++){ if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1; else{ //Co jeśli jest kolizja na x+1 } } Ten kod musimy wypełnić sprawdzeniem czy jeżeli podniesiemy się o Y pikseli do góry czy nie będzie kolizji. W ten sposób powstaje ruch po skosie! for(var i=0;i<5;i++){ if !place_meeting(x+1,y,Parent_Obiektow_Solidnych) x+=1; else{ var _max = 4; //Maksymalny skos to 4 piksele do gory i 1 piksel w bok. Zamien na dowolna liczbe ktora Ci pasuje. for(var j=0;j<_max;j++){ if !place_meeting(x+1,y-j-1,Parent_Obiektow_Solidnych) //Jezeli znalazlo wolna przestrzen { x+=1; y+=j-1; break; //Przerwij te petle bo juz znalezlismy skos. } } } } Takie ostrzezenie, pisze to 100% z głowy więc może nie działać, w najgorszym wypadku po małych poprawkach powinno działać. Edit: Ciagle zapominam ze nie ma juz tagu gml. Edit2: Poprawiono kod na dzialajacy i poprawiono czytelnosc kodu dla potomnych i inncyh zagubionych duszyczek szukajacych rozwiazania. Uzjel i Penguin 2 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Penguin Opublikowano 1 Marca 2018 Autor Udostępnij Opublikowano 1 Marca 2018 @I am vader Dziękuję, zaraz sprawdzę czy działa Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 1 Marca 2018 Udostępnij Opublikowano 1 Marca 2018 Nie działa, bo dałem y+j+1 zamiast y-j-1. W edicie wrzuce dzialajacy przyklad. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Penguin Opublikowano 1 Marca 2018 Autor Udostępnij Opublikowano 1 Marca 2018 Ok, dzięki. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
I am vader Opublikowano 1 Marca 2018 Udostępnij Opublikowano 1 Marca 2018 Masz tu absolutnie minimalny przyklad, bo chce zebys tez sam pomyslal. Postaraj sie zastosowac ten kod do zrobienia grawitacji oraz poruszania w lewo. https://led.feen.us/kbc1gliz.zip Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Penguin Opublikowano 1 Marca 2018 Autor Udostępnij Opublikowano 1 Marca 2018 Dziękuję Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Penguin Opublikowano 1 Marca 2018 Autor Udostępnij Opublikowano 1 Marca 2018 Ok, już wszystko ogarnąłem, dziękuję ci vader Uzjel 1 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ę