NukeBoards

Pomoc - Płynne kolizje

Ishimura - 12-07-2015, 13:35
: Temat postu: Płynne kolizje
Siemanko, mam problem z kolizjami. Otóż o ile podłoga działa spoko tak jak powinna, to jak skacze, to postać jakby "przykleja się" do sufitu i spada pionowo i nawet nie można nią wtedy sterować? Jakiś pomysł na taką płynną kolizję ? Chodzi o to że jak walnie głową w sufit, a porusza się w przód to dostanie takiego poślizgu głową po suficie :P
307 - 12-07-2015, 14:34
:
Użyj PMO.
wermi - 13-07-2015, 07:36
:
używasz wbudowanego ruchu platformowego opartego o box2d czy tego starego szajsu?
Ishimura - 13-07-2015, 16:57
:
Heh dokładnie to nie wiem jakiego używam :P Normalnie, bohater to active o typie platform, a do tego kolizje z background. Wiem że to chała tak więc zwracam się o jakąś pomoc :P
jarlfenrir - 13-07-2015, 19:10
:
Ishimura napisał/a:
bohater to active o typie platform
Co to znaczy, że "o typie platform"? W zakładce ruch określiłeś mu "platform"?
Ishimura - 13-07-2015, 19:45
:
Dokładnie :) Movement -> Type = Platform
jarlfenrir - 13-07-2015, 20:12
:
Ishimura napisał/a:
Dokładnie :) Movement -> Type = Platform
Więc to jest to, co tutaj nazywamy "wbudowany ruch platformowy". I kiedyś ludzie polecali zrobienie własnego ruchu platformowego, a teraz widzę, że jakieś nowe rozszerzenia się popojawiały...

własny ruch, czyli dodajesz dodatkowe obiekty, detektory, które zawsze podążają za twoją postacią, ale są ułożone dookoła niej.
Potem dodajesz warunki typu:
użytkownik wcisnął lewo + lewy detektor nie koliduje z przeszkodą -> przesuń ludzika w lewo
detektor dół nie koliduje z tłem -> przesuń ludzika w dół
ludzik jest w fazie skoku + detektor górny koliduje z tłem -> przerwij skok

(zdarzenia zaprezentowane poglądowo)
Ishimura - 13-07-2015, 20:39
:
A np, jak ze skokiem? Jakieś parametry trzeba wprowadzać żeby skok był takim łukiem ?
Albo jakieś rozszerzenie jest ?
Cootje - 13-07-2015, 22:25
:
Ten ruch z box2d nie ma już tego buga.
jarlfenrir - 13-07-2015, 22:36
:
Ja to zawsze robię za pomocą jednej zmiennej obiektu. Np ustawiam ją na -5 (grawitacja).
Potem zdarzenia:
jeśli grawitacja różna od 0 ->
dodaj do pozycji Y grawitację

jeśli dolny detektor nie koliduje z tłem ->
dodaj do grawitacji 1

Jeśli dolny detektor koliduje z tłem ->
ustaw grawitację na 0

Jeśli górny detektor koliduje z tłem ->
ustaw grawitację na 0

Dzięki temu w każdej kolejnej ramce postać przesunie się o coraz mniejszą liczbę pikseli w górę aż w końcu dojdzie do zera (w tej ramce postać "zawiśnie" w powietrzu). Następnie licznik przekręci się na liczby dodatnie i postać zacznie spadać z coraz większą prędkością.
Jak dodasz do tego jednostajny ruch po X (np. gracz trzyma wciśnięty klawisz w prawo, więc jednostajnie przesuwasz postać o np. 3 piksele w prawo), to uzyskasz efekt lotu po łuku.

Dodatkowo dla większej precyzji warto użyć fastloopa.
tj. zamiast przesuwać obiekt o wartość grawitacji dodać:

grawitacja większa od 0 -> uruchom pętlę "G" tyle razy, ile ma wartość grawitacja
grawitacja mniejsza od 0 -> uruchom pętlę "G" minus grawitacja razy

w pętli "G"
grawitacja mniejsza od 0
-> ustaw pozycję Y na Y -1

w pętli "G"
grawitacja większa od 0
-> ustaw pozycję Y na Y +1

(przydałaby się funkcja signum, by te dwa zdarzenia scalić w jedno, ale nie mogę takowej znaleźć...)
Ishimura - 14-07-2015, 21:46
:
Heh, mam pewien problem. Jak zanegować kolizję z innym obiektem ? Opcja jest na szaro, a jak przykleiłem colider do postaci i daje zdarzenie;

Colider collision with bacdkdrop -> to w tym momencie nie można ustawić Movement - Stop dla obiektu bohater.

Aha i czy typ movementu obiektu należy zmienić czy może być Static ?
Zax37 - 15-07-2015, 07:48
:
Kolizji nie możesz zanegować, bo to taki trochę callback, ale możesz zanegować overlapping.

Colider not overlapping backdrop
+ewentualnie odtwórz raz jeśli zapętlone żeby uzyskać podobny efekt do kolizji, ale na wyjście z niej

Chyba że nie o to chodzi. Jeśli nie możesz ustawić Movement - Stop, to znaczy że obiekt nie ma wybranego odpowiedniego ruchu. Oczywiście przy własnym ruchu tej opcji się nie używa, chyba że opiera się go na wbudowanym.