Skręć se silnik
napisał: Kamil Witam w następnym odcinku mojej rubryki, w której staramy się w jak najprostszy sposób napisać swoje własne silniki do gier klikowych. Tym razem kontynuujemy temat z poprzednich numerów – ruch platformowy. Dzisiaj dopracujemy ruch w poziomie naszej postaci.. Przypomnę, że w wersji z poprzednich numerów nasz ruch miał bardzo uproszczony ruch w poziomie – zawsze przesuwał się z taką samą prędkością, nie było żadnego przyspieszenia i wykrywanie kolizji ze ścianami było bardzo niedokładne. Poradzimy sobie z tym przy pomocy licznika prędkości poziomej (podobnego do licznika prędkości pionowej z poprzednich artykułów) i, oczywiście, Fast Loopa. Licznik ten może mieć zarówno wartość ujemną i dodatnią – gdy ma ujemną, postać porusza się przeciwnie do układu odniesienia, czyli w lewo. Jeżeli macie jeszcze gdzieś na dyskach, otwórzcie go, bo w nim będziemy wprowadzać modyfikacje. Na samym początku stwórzmy nowy licznik i nazwijmy go „vX” – będzie przechowywał wartość prędkości poziomej, oraz „vX bezwzg”, który zajmie się wartością bezwzględną prędkości, czyli po prostu z niego Fast Loop będzie odczytywać, ile razy ma odpalić pętle (a że FL nie odpala pętli ujemnych, musi to być wartość bezwzględna). Następnie, usuńmy stare zdarzenia dotyczące ruchu. Raczej nie powinieneś mieć problemów z odgadnięciem, które to. Gotowe? Detektory na miejscu? Pierwsze, co zrobimy, to wyciągnięcie wartości bezwzględnej prędkości. Dwa proste zdarzenia: Wartośc „vX” mniejsza od zera –> ustaw wartość „vX bezwzg” na ujemność wartości „vX”. Czyli: -(Value(„vX”)). Wartość „vX” większa od zera –> ustaw wartość „vX bezwzg” na wartość „vX”. Dalej. Dwa zdarzenia, które, w zależności od tego który klawisz jest wciśnięty, zwiększą lub zmniejszą wartość prędkości. W tym momencie musimy zastanowić się, jaką maksymalną prędkość może osiągnąć nasza postać. Załóżmy, że maksymalnie może biec 3 piksele na pętle. Powtarzaj póki klawisz w lewo jest wciśnięty + Lewy detektor NIE koliduje z przeszkodą + Wartość „vX” jest większa od -2 + Co każde 0.1 sekundy. -> Odejmij 1 z wartości „vX”. Powtarzaj póki klawisz w prawo jest wciśnięty + Prawy detektor NIE koliduje z przeszkodą + Wartość „vX” jest mniejsza od 2 + Co każde 0.1 sekundy. -> Dodaj 1 do wartości „vX”. Warto zauważyć warunek Co każde 0.1 sekundy. Zmieniając ten interwał czasowy określamy przyspieszenie obiektu. W tym wypadku wynosi ono 10px/sekundę^2, lecz jest, oczywiście, prędkość ograniczona do 3px/pętle, co oznacza, że nasz obiekt osiągnie maksymalną prędkość w 0.3 sekundy. Jeżeli chcesz sprawić, by obiekt szybciej lub wolniej przyspieszał, zwiększ lub zmniejsz ten warunek czasowy. Teraz, odpalmy pętlę Fast Loopa: Zawsze -> Odpalaj pętle Fast Loopa #1 (wartość „vX bezwzgl”) razy. Ważnym elementem jest tarcie między graczem a podłożem. Najprościej mówiąc, póki gracz stoi na ziemi jego prędkość powinna się zmniejszać. Nic prostszego. Wartość „vX” jest większa od 0 + Detektor dolny zachodzi na tło + Klawisz w lewo NIE jest wciśnięty + Klawisz w prawo NIE jest wciśnięty + Co każde 0.05 sekundy -> Odejmij 1 od wartości „vX”. Wartość „vX” jest mniejsza od 0 + Detektor dolny zachodzi na tło + Klawisz w lewo NIE jest wciśnięty + Klawisz w prawo NIE jest wciśnięty + Co każde 0.05 sekundy -> Dodaj 1 do wartości „vX”. Dlaczego tak? Ano, jeżeli prędkość jest większa od zero, np. wynosi 2, to postać porusza się w prawo. By ją zatrzymać trzeba przybliżyć wartość prędkości do zera (nie ustawimy jej na zero, bo wtedy postać zatrzymywałaby się momentalnie, a tak gładko wyhamowywuje). By to zrobić, odejmujemy 1 od wartości. Natomiast, gdy wartość jest ujemna, musimy dodać 1. I znowu pojawia się warunek czasowy. Określa on, jak mocno podłoże zwalnia gracza. Eksperymentując z tym warunkiem, możemy osiągnąć inne tarcie dla innych powierzchni (powiem o tym potem). No i w końcu ostatnie zdarzenia, odpowiedzialne za samo już przesuwanie gracza. W czasie pętli #1 + Detektor lewy NIE nachodzi na tlo + Wartość „vX” jest mniejsza od zera -> Ustaw pozycję Postaci na aktualną pozycję Postaci – 1. W czasie pętli #1 + Detektor prawy NIE nachodzi na tlo + Wartość „vX” jest większa od zera -> Ustaw pozycję Postaci na aktualną pozycję Postaci + 1. Prawie koniec. Ostatnie zdarzenia likwidujące błędy: Lewy detektor koliduje ze ścianą -> Ustaw wartość „vX” na 0. Prawy detektor koliduje ze ścianą -> Ustaw wartość „vX” na 0. I to będzie wszystko. Nic prostszego. 5 minut roboty, a nasz ruch dzięki temu wygląda realistyczniej, bardziej pr0. Możemy się pokusić jeszcze o fajne bajery, takie jak bieg po przytrzymaniu jakiegoś klawisza, mniejsze tarcie na lodzie, czy kurz wzniecany spod nóg podczas szybkiego biegu czy gwałtownego zawracania – pole do popisu jest duże i nie są to trudne rzeczy. Jak zwykle zachęcam do własnych eksperymentów. I na koniec mały bonus. Co powiecie na jeszcze jeden krok w stronę realizmu: brak kontroli nad postacią w locie? Wystarczy do warunków Powtarzaj gdy Lewy/Prawy klawisz jest wciśnięty... dodać dodatkowy warunek – Detektor dolny koliduje z tłem. I wszystko. Na dzisiaj to już wszystko co miałem do zaprezentowania. Zapraszam na kolejny odcinek. Jeszcze spooro rzeczy zostało do zrobienia.
Copyright (c) 2005-2007 Ślimaczek