Skocz do zawartości
  • 0
Adriann

Górki w beatemupie

Pytanie

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
}

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

18 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 2

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

 

  • Super (+1) 1

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

zrób maskę tylko na ciemno szare :) (albo przez edycję maski w sprite, albo zrób drugi sprite o połowie wysokości i ustaw origin Y na -wysokość).

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Właśnie z jakiegoś powodu utyka w ścianie, przy normalnych blokach z takim samym kodem ale oddzielnie nie ma tego problemu

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

No a jak masz zrobioną kolizję z podłożem? Po co rodzieliłeś osobno kolizję podłoża i tego bloczku? Zrób to na jedno kopyto i po problemie, chyba że w twojej grze chodzi się w głąb ekranu?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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ć?

 

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

"A to efekt który chcę uzyskać"

To w takim razie jak go uzyskałeś skoro nie wiesz jak to osiągnąć :)?

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Jejuuu:D Tak że wyłączyłem kolizje z górką czyli dało się przez nią przechodzić i po niej skakać po czym wstawiłem normalne ściany z jednej strony. Zatem nie działa:d

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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).

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Dokładnie tak próbuję to zrobić:) Nie wiem wciąż tylko w jaki sposób gracz ma nie brać pod uwagę kolizji z tym jednym blokiem:D
Bo całe skakanie itp jak na gifach już działa, jedynie wykluczanie kolizji

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Bardzo proste. Sprawdzasz z jakim obiektem kolidujesz a potem jeżeli moja H (czy cokolwiek używasz dla wysokości) jest >= wysokości bloku to pozawalasz się poruszać. 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

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

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×