Skocz do zawartości

Górki w beatemupie


Adriann
Przejdź do rozwiązania Rozwiązane przez Threef,

Rekomendowane odpowiedzi

Witam serdecznie, produkuję obecnie beat em upa i dodałem różne wysokości:
20yWizV.gif
Mam taki oto prosty kod na kolizje z blokami z tym że owe górki również traktuję jako bloki i próbuję dodać do nich warunek niemożliwości chodzenia po nich kiedy jesteśmy niżej.
Kod obrazujący wysokości to tylko to yy>yy_high
yy to obecna wysokość a yy_high to wartość wysokości obiektu z którym kolidujemy.
Ogólnie problem polega na tym że kiedy ustawię blok jako solidny nie da się na niego wchodzić a kiedy solidny nie jest wszystko działa ale często postać utyka w ścianie.
ps: nie chcę wyłączać i włączać solida boo pojawi się problem z większą ilością przeciwników spacerujących po mapce
//Kolizje horyzontalne
if place_meeting(x+hspd_,y,objSLOPE) && yy>yy_high
{
while !place_meeting
(x+sign(hspd_),y,objSLOPE)
    {
    x+=sign(hspd_)
    }
    hspd_=0
}


//Kolizje vertykalne

///To samo co wyżej tylko dla kolizji vertykalnych
if place_meeting(x,y+vspd_,objSLOPE) && yy>yy_high
{
while !place_meeting
(x,y+sign(vspd_),objSLOPE)
    {
    y+=sign(vspd_)
    }
    vspd_=0
}

Odnośnik do komentarza
Udostępnij na innych stronach

No bez przesady, maski umiem ogarniać po tylu latach:D
Chodzi o to że nie da się chodzić po tym obiekcie mimo iż spełnia opisany wyżej warunek.
Przy solidnej masce wcale a przy niesolidnej da się ale czasem utyka w ścianie.

Odnośnik do komentarza
Udostępnij na innych stronach

Po połączeniu w ogóle nie działa jak powinno

//Kolizje horyzontalne
if place_meeting(x+hspd_,y,objBLOK) && yy>yy_high
{
while !place_meeting(x+sign(hspd_),y,objBLOK)
    {
    x+=sign(hspd_)
    }
    hspd_=0
}
x+=hspd_;


//Kolizje vertykalne
if place_meeting(x,y+vspd_,objBLOK) && yy>yy_high
{
while !place_meeting(x,y+sign(vspd_),objBLOK)
    {
    y+=sign(vspd_)
    }
    vspd_=0
}
y+=vspd_;

Jak wywalę ten kod: yy>yy_high to kolizje działają normalnie(bez solida) ale znowu nie da się chodzić po górkach;p
Więc powstaje pytanie, macie pomysł jak wstawić warunek że jeśli cośtam to po tym konkretnym klocku można chodzić?

 

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

objBLOK jest parentem ścian, górek i ogólnie wszystkich przeszkód, pokażę w załączniku.
Te bloki z numerami to maski pagórków. Skakanie i chodzenie po nich jest zabiegiem czysto wizualnym.
Jak mówię, szukam możliwości wstawienia wyjątków że jeśli jakaś zmienna to kolizja nie dotyczy tego bloku i można na niego wejść

1.png

A to efekt który chcę uzyskać: a9Bpbpr.gif
Oczywiście maska gracza to mniej więcej wielkość cienia

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
23 godziny temu, I am Lord napisał:

A tak poza tym to dziwię się że solid/unsolid ma jakieś znaczenie, w końcu nie używasz wbudowanych zamiennych od prędkości.

 

Ostatnio to przerabiałem i odkryłem, że...

masz obiekt A - gracza

masz obiekt B - przeszkodę solid

 

robisz A.x += 5,

na koniec stepa GM sam sprawdza, czy jest kolizja z tym solidem, jeśli tak, to x = xprevious!

 

nawet jak nie używasz speeda czy nie masz eventu kolizji z tą rzeczą. Jedyne rozwiazanie to napisać A.x +=5, A.xprevious = A.x;

 

 

Co do samego problemu, to źle zrozumiałem perspektywę i myślałem, że to ma być widok jak w platformówce. Tak jak masz wymaga faktycznie więcej pokombinowania. Jak znajdę wolny czas może sklecę jakiś przykład, bo za dużo pisania, ale ogólnie bym chyba z solidów zrezygnował na rzecz place_free / position_free (nigdy nie pamietam które przesuwa maskę obecnego obiektu na podaną pozycję, a które sprawdza, czy pixel x,y jest wolny).

Odnośnik do komentarza
Udostępnij na innych stronach

Ja takie rzeczy robię w bardzo prosty sposób. Tak samo jak 3D w GM. Zrób płaską maskę która jest na ziemi i wygląda jak kałuża. Stojąc na ziemi gracz nie może na nią wejść. Teraz ten obiekt ma swoją wysokość np 20.

 

Następnie gracz skacząc manipuluje jakąś zmienną tak? Nazwijmy ją teraz H. Jeżeli H < wysokości obiektu to gracz nie może z nim kolidować. Jeżeli H jest większe to nie bierz pod uwagę kolizji. Ale teraz jeżeli H < wysokości oraz aktualnie spadałeś (coś jak vspeed tylko twój) to ustaw graczowi wartość wysokości obiektu jako aktualną wysokość podłoża i pozwól graczowi się poruszać jakby nie było kolizji z tym obiektem. Ostatnia sprawa to jeżeli wykryjesz ze kolizji znów nie ma to gracz ma znów spaść niżej.

Odnośnik do komentarza
Udostępnij na innych stronach

Właśnie mniej więcej w ten sposób psuje się kolizja, tylko robiłem nieco odwrotnie
//Kolizje horyzontalne
if place_meeting(x+hspd_,y,objBLOK) && yy_jump>yy_high // yy jump wysokosc skakania uwzględniająca to gdzie stoimy a yy_high to wysokość bloczku z którym kolidujemy
{
while !place_meeting(x+sign(hspd_),y,objBLOK)
    {
    x+=sign(hspd_)
    }
    hspd_=0
}
x+=hspd_;

Odnośnik do komentarza
Udostępnij na innych stronach

  • Rozwiązanie

To rozumiem że yy_jump było w zakresach -coś do 0? Skacząc robisz tę wartość na minus?

Może coś takiego?

var col=instance_place(x+hspd_,y,objBLOK);
if col && yy_jump>=col.yy_high // yy jump wysokosc skakania uwzględniająca to gdzie stoimy a yy_high to wysokość bloczku z którym kolidujemy
{
while !place_meeting(x+sign(hspd_),y,col)
    {
    x+=sign(hspd_)
    }
    hspd_=0
} else {
	// funkcja spadania
}
x+=hspd_;

 

Odnośnik do komentarza
Udostępnij na innych stronach

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