Zarejestruj Zapomniałeś hasła?
Dodatki do Własnego Ruchu Platformowego (cz.1)
Dodany 15 kwietnia 2009, 16:29 Odsłon 3391
Edytory Ocena
 (35 głosów)
Kategoria Silnik Poziom (Dla średnio-zaawansowanych)
W tym kursie znajdziesz dodatkowe akcje, które wzbogacą ruch uzyskany według tego kursu.
Jest to tłumaczenie kursu Davida Newtona, znanego jako DavidN. Oryginalny kurs można znaleźć na stronie Clickteamu.


Spis treści:
- Podwójne Skoki
- Przyspieszanie i Zwalnianie (Akceleracja i Deakceleracja)
- Skoki o Różnej Wysokości
- Drzwi i Obiekty-Przeszkody

Podwójne Skoki
W wielu grach, możesz wykonać podwójny skok w powietrzu dostając "doładowanie" w najwyższym punkcie skoku. Możemy to wykonac nie zmieniając obecnych obiektów, lecz wykonując jedynie kilka zmian w naszych zdarzeniach - a dokładniej sposób w jaki wykrywamy czy gracz może skoczyć czy nie. tym razem chcemy, by gracz mógł podskoczyć w powietrzu, ale tylko jeśli wcześniej wybił się z podłoża (inaczej można by było by wykonać drugą część podwójnego skoku spadając z platformy).

Po pierwsze, niech program ustawia pewną wartość zależnie od tego, czy postać wykonuje skok, czy nie. Jednym ze sposób jest dodanie nowej alterable value, którą nazwiemy "JumpCount". Znowu jako domyślną wartość pozostawiamy 0. Zmień zdarzenie, które pozwala Graczowi skakać:
7

• Player presses Fire 1

• Detector is overlapping a backdrop

Set Grav("Player") to -9 //Zmiana

Set JumpCount("Player") to 1 //Dodane

(Zmiana ustawień grawitacji jest opcjonalna - zmniejszyłem ją z 10 na 9, ponieważ podwójny skok i tak będzie pozwalał skakać nam nieco wyżej.)

Teraz zmienimy ta wartość z powrotem na 0 gdy gracz wyląduje:
4

• On loop "gravity"

• Player is overlapping an obstacle background

• Grav("Player") > 0

Set Y position of Player to Y("Player")-1

Set Grav("Player") to 0

Set JumpCount("Player") to 0 //Dodane

Stop loop "gravity"

(Możesz także dodać akcję, która ustawia JumpCount na 0 w zdarzeniu odpowiedzialnym za zatrzymywanie gracza przy uderzeniu w sufit, co zapobiegło by podwójnemu skokowi po takim uderzeniu. Wszystko zależy od twoich preferencji.)

Teraz kiedy sprawdzamy, czy gracz skoczył, możemy dodać event, który pozwoli nam wykonac podwójny skok. Są dwie drogi, by to wykonać: pierwsza wymaga zmiany zdarzenia skoku tak, by Gracz mógł skoczyć po raz drugi w powietrzu. Natomiast druga droga jest bardziej elastyczna - musimy w niej stworzyć nowy event, dzięki temu drugi skok będzie się różnił od pierwszego.

Dodaj ten event nad istniejącym eventem "Player presses Fire 1":
N1

• Grav("Player") <> 0

• JumpCount of Player == 1

Set Grav("Player") to -6

Set JumpCount("Player") to 2

Tak naprawdę nie ma powodu by teraz ustawiać JumpCount na 2 zamiast na 0, ale pozwala to na sprawdzanie w łatwy sposób czy Gracz wykonał podwójny skok, co może się potem przydać. Ustawiamy grawitację na -6, wartość bliższą zeru niż ta w oryginalnym skoku, przez co drugi skok będzie nieco słabszy od pierwszego.

Powód, dla którego ten event miał być umieszczony nad drugim eventem o skoku, jest taki, że MMF sprawdza od zdarzenia wciśnięcia klawiszy od góry do dołu. Jeżeli oryginalny event byłby nad zdarzeniem, które teraz stworzyliśmy, nasze zdarzenia wykonywały by się jednocześnie, ponieważ pierwszy event ustawiałby JumpCount na 1, przez co drugi mógłby się wykonać.

Jeżeli teraz włączysz grę, zobaczysz, że możesz wykonywać podwójne skoki wtedy gdy skoczysz, lecz nie wtedy gdy spadasz z platformy. Zależnie od twoich preferencji może się jednak wydać dziwne, że podwójny skok można wykonać w dowolnym momencie skoku, a nie wtedy gdy postać wzbije się najwyżej. Można to jednak łatwo poprawić:
N1

• Grav("Player") <> 0

• JumpCount of Player == 1

• Grav("Player") > -2 //Dodane

• Grav("Player") < 5 //Dodane

Set Grav("Player") to -6

Set JumpCount("Player") to 2

Dwa warunki jakie dodaliśmy sprawiają, że Gracz będzie mógł wykonać podwójny skok tylko wtedy, gdy wartość grawitacji będzie zbliżona do tej, którą osiąga się w najwyższym punkcie skoku. Zmiana tych wartości da graczom większe lub mniejsze możliwości wykonania podwójnego skoku. Możesz nawet dodać do tego zdarzenia kolejny warunek, który pozwoli na wykonywanie podwójnego skoku po wzięciu jakiejś rzeczy i tak dalej.

Przyspieszanie i Zwalnianie (Akceleracja i Deakceleracja)
Naszemu ruchowi brakuje jeszcze możliwośći przyśpieszania i zwalniania, jakie posiada standardowy ruch platformowy, lecz możemy to w prosty sposób dodać zmieniając lekko ruch horyzontalny. Po prostu musimy dodawać lub odejmować wartości zamiast ustawiać ją odgórnie.

Spójrzmy więc jeszcze raz na zdarzenia odpowiadające za ruch w poziomie:
8

• Repeat while player presses Right

• Horiz("Player") < 3 //Dodane

Set Horiz("Player") to Horiz("Player") + 0.25 //Zmiana
9

• Repeat while player presses Left

• Horiz("Player") > -3 //Dodane

Set Horiz("Player") to Horiz("Player") - 0.25 //Zmiana
10

X Repeat while player presses Left

X Repeat while player presses Right

• Horiz("Player") < 0 //Dodane

Set Horiz("Player") to Horiz("Player") + 0.1 //Zmiana

I dodajmy jedno zdarzenie, takie jak powyższe tylko dla drugiego kierunku:
N2

X Repeat while player presses Left

X Repeat while player presses Right

• Horiz("Player") > 0

Set Horiz("Player") to Horiz("Player") - 0.1

Teraz możesz przetestować ruch. Wartości jakie podałem są mocno przesadzone i sprawiają wrażenie jakby postać poruszała się po lodzie - pozmieniaj je lekko by sprawdzić jaki styl ruchu będzie Ci odpowiadał. Możesz dodać np. sprawdzanie czy Gracz biegnie powyżej określonej prędkości by uzyskać efekt poślizgu, możesz także ustawić by ruch na ziemi różnił się od tego w powietrzu używając wstawionego przez nas wcześniej obiektu detektora.

Skoki o Różnej Wysokości
Pewnie zauważyłeś, że ruch jaki stworzyliśmy obsługuje jedynie skoki o stałej wysokości. Nieważne jak długo będziesz trzymać klawisz skoku zawsze osiągniesz ta samą wysokość nim spadniesz. Większość platformówek pozwala wykonać niewielki skok gry gracz jedynie wciśnie przycisk i większy skok gdy klawisz zostanie przytrzymany. Aby uzyskać taki efekt musimy zmodyfikować zdarzenia odpowiedzialne za grawitację.

Na tą chwilę, siła skoku jest ustawiana jednorazowo, gdy gracz wciśnie przycisk skoku. Teraz chcemy sprawdzić czy klawisz jest trzymany gdy postać jest dalej w trakcie skoku i odpowiednio zadziałać na grawitację w zależności od tego jak długo.

Bardzo prostym sposobem jest dodanie takiego zdarzenia:
N3

X Repeat while player pressed Fire 1

• Grav("Player") < 0

• JumpCount("Player") == 1

Set Grav("Player") to Grav("Player") + 0.5

(Warunek "JumpCount" jest konieczny jedynie wtedy, gdy dodałeś podwójne skoki w sposób opisany wcześniej)

Teraz jeśli gracz nie będzie trzymał klawisza skoku, gdy postać skacze (Gracz porusza się w górę), MMF doda do grawitacji dodatkową wartość by szybciej ściągnąć go w dół. Zwiększ lub zmniejsz dodawaną wartość by uczynić ten efekt tak mocnym jak tego potrzebujesz.

Drzwi i Obiekty-Przeszkody
Jedną z rzeczy jakich jeszcze nie dołączyliśmy do naszego ruchu jest detekcja obiektów, które mają blokować gracza. Wykrywamy co prawda kolizję z tłem ale nie z obiektami, przez które gracz nie powinien być w stanie przejść (jak np. zamknięte drzwi). Ze sposobu w jaki ustawiliśmy szybkie pętle wynika, że będziemy musieli ustawić wykrywanie kolizji z obiektami wewnątrz pętli odpowiadającej za ruch horyzontalny.

Stwórz nowy obiekt, który będzie służył za drzwi i umieść go gdzieś na planszy. Zwykle przydaje się ustawienie dla drzwi jakiejś grupy (qualifier), by nie powtarzać zdarzeń zbyt często - ustaw grupę "Door" (Drzwi) obiektowi, który właśnie stworzyłeś.

Pokażemy tutaj jak zablokować Gracza w ruchu poziomym, ale jeżeli chcecie możecie utworzyć podobne zdarzenie w pętli grawitacji by zablokować Gracza pionowo. Umieszczenie tego zdarzenia w obydwu grupach sprawi, że obiekt drzwi będzie blokował Gracza w każdym kierunku.

Dodaj to zdarzenie zaraz po evencie odpowiedzialnym za zatrzymywanie gracza po kolizji ze ścianą. W gruncie rzeczy jest bardzo podobne.
N4

• On loop "horiz"

• Player is overlapping Group.Doors

Set X position of Player to X("Player") - (Horiz("Player")/ABS(Horiz("Player")))

Ustaw detektor pod Graczem

Set Horiz("Player") to 0

Stop loop "horiz"

Skoro blokowanie gracza mamy za sobą, musimy teraz zająć się sytuacją w której gracz może przejść przez drzwi - na przykład gdy jakiś klucz czy inny obiekt został zebrany.

Utwórz więc kolejny nowy obiekt i nazwij go "Key" (Klucz) lub coś w tym stylu. Gdy Gracz będzie kolidował z kluczem, chcemy by zostało to zapisane, po to, by podczas kolizji z drzwiami, gdy co najmniej jeden klucz został zebrany, Gracz mógł przez nie przjeść, a klucz został wykorzystany. Stwórz nową alterable value (wartość zmienną) w obiekcie Gracza i nazwij ją "KeysCollected".

Teraz zdarzenia. Przyda się nowa grupa "Keys and Doors" (Klucze i Drzwi), bo to, co w niej umieścimy jakoś nie pasuje do eventów istniejących do tej pory.
N5

• Player collides with Key

Destroy Key

Add 1 to KeysCollected("Player")

Kolejne zdarzenie powinno być nad zdarzeniem, które utworzyliśmy dla kolizji z drzwiami. To dlatego, że chcemy sprawdzać czy Gracz może przejść przez drzwi zanim go ewentualnie zablokujemy.
N6

• On loop "horiz"

• Player is overlapping Group.Doors

• KeysCollected("Player") > 0

Destroy Group.Doors

Subtract 1 from KeysCollected("Player")

Gracz teraz będzie mófł przejść przez drzwi jeśli ma co najmniej jeden klucz, a zostanie zablokowany gdy nie ma żadnego. W grze prawdopodobnie będziesz chciał bardziej zróżnicować rodzaje drzwi i kluczy ale zasada pozostaje ta sama.


W następnej części m.in. o tym, jak wykonać ruchome platformy, sprężyny i jak dodać animacje. Umieszczę także przykładowy plik. Już w tej chwili przykład w języku angielskim można pobrać ze strony Clickteamu.
Komentarze
Shian @ 11 kwietnia 2010, 18:25
Yeah działa. Dzięki:D
Fadex @ 11 kwietnia 2010, 16:14
Po wstępnej analizie - tak, PoW prawdopodobnie zapomniał tam dodać "Player presses fire 1", to powinno poprawić błąd.
Shian @ 11 kwietnia 2010, 15:40
chwila Jeżeli przy naciśnięciu shifta grav zmienia się na -9 a jumpCount na 1 to razu uaktywnia się drugi skok ponieważ: • Grav("Player") <> 0 • JumpCount of Player == 1 Czyli gracz wykonuje jeden skok i to w dodatku słabszy! No chyba że coś przeoczyłem...
Runner @ 27 stycznia 2010, 13:23
No, już nie trzeba, poradziłem sobie, ale dzięki :)
ktos @ 29 grudnia 2009, 14:05
Ja mam ten silnik z polskimi komentami jak chcesz to ci go wyśle:P
Runner @ 29 grudnia 2009, 11:18
Chyba muszę usunąć spolszczenie:S
ktos @ 6 września 2009, 12:33
ok poradziłem sobie xD
Zdunek @ 6 września 2009, 11:20
Jeżeli działa skokowo musisz zobaczyć wartość przyciągania, i przenoszenia w góre, ew. pozycje detektora...
ktos @ 6 września 2009, 10:36
oks dziex Edit działa tylko dość skokowo i jest innym sposobem niż ten ruch :/
Ostatnio edytowane 6 września 2009, 10:56 przez ktos
Zdunek @ 6 września 2009, 02:11
ktos, Detektor pod postacią + wartość platformy (G,D-góra, dół) Wartość G, detektor zachodzi na platforme ->pozycja gracza Y-1 Wartość D, detektor zachodzi na platforme ->pozycja gracza Y+1 A może z FL, ale to inna śpiewka...
ktos @ 5 września 2009, 23:37
kto wie jak zrobić pionowe ruchome platformy ?
PoW @ 5 maja 2009, 21:32
Dodaj negację do warunków obsługujących ruch, wiesz tam gdzie masz "Repeat while player presses Left" dodaj "X Repeat while player presses Right" i analogicznie dla drugiej strony.
Ostatnio edytowane 5 maja 2009, 21:32 przez PoW
Zdunek @ 4 maja 2009, 19:59
Nie wiem jak u was, ale u mnie cos sie pierd^&% w momencie, gdy zechce przytrzymac 2 strzalki:P
Mefisto @ 17 kwietnia 2009, 12:29
Przy użyciu "Przyspieszanie i Zwalnianie" postać na ruchomych platformach(tych poziomych) nienaturalnie przyspiesza. Wy też tak mieliście, czy to mój błąd?
Mefisto @ 16 kwietnia 2009, 20:31
Ściągnąłem cały silnik z CT i dorobiłem pionowe platformy. Teraz mam całkiem niezły silnik platformowy. :P
pikor @ 15 kwietnia 2009, 22:06
bardzo przydatne dla początkujących.. niech zobaczą jak wygląda w miarę porządny kodzik gry.. i że to niezła z tym zabawa.. budowanie takiego kodziaka
Bedziu @ 15 kwietnia 2009, 17:04
Dobry dodatek. Czekamy na więcej. W końcu wszystko będzie w jednym miejscu.
lamberski @ 15 kwietnia 2009, 17:03
"Przyspieszanie i Zwalnianie (Akceleracja i Deakceleracja)" - pamiętam jaką miałem podnietę, kiedy wpadłem na pomysł jak to zrealizować we własnym ruchu ^^ Nie wiem, czy mi się dobrze wydaje ale twój sposób jest raczej taki skokowy, bo nie obsługuje tych ułamkowych wartości przy zwiększaniu szybkości. Chodzi o to, że dodaje skokowo i jest mniej płynne niż akceleracja choćby we wbudowanym ruchu platformowym. No ale o tym może kiedy indziej, bo trochę za dużo tłumaczenia jak na komentarz :U W każdym razie fajnie. Dzieki takim kursom może będzie coraz mniej gier z wbijającymi się w platformy postaciami...
Ostatnio edytowane 15 kwietnia 2009, 17:04 przez lamberski
Dodaj komentarz
Kolor:   Rozmiar:

Dodał PoW
Profil PW
Twoja ocena
^ Do góry
© 2009 - 2012 Fabryka Gier. Publikowanie materiałów tylko za zgodą autorów.
Realizacja: Maciej Lamberski *-: