Project Spark - kurs tworzenia gier część 4, obiekty złożone, mechanika i fizyka
27.01.2014 | aktual.: 20.03.2014 09:34
W poprzednich lekcjach nauczyliśmy się jak programować skrypty, modelować otoczenie, używać ścieżek kontrolujących ruch obiektów oraz zarządzać energią. W tej lekcji nauczymy się tworzyć własne obiekty złożone z mniejszych obiektów. Podobnie jak w przypadku klocków LEGO Mindstorm nie ograniczymy się jednak tylko do poskładania obiektu ale także zaprogramujemy skrypty dzięki którym obiekt zacznie działać. Naszym zadaniem będzie zbudowanie działającej katapulty która będzie miotała kamienne kule zdolnie niszczyć otoczenie. Dokładnie to będzie trebusz. Jeżeli ktoś trafił na ten artykuł nie czytając wcześniejszych części to zachęcam do przeczytania wszystkich po kolei ponieważ są one wzajemnie ze sobą powiązane. Każda lekcja kursu bazuje na wiedzy wyniesionej z poprzednich lekcji.
Pierwszym etapem będzie skonstruowanie ramienia naszej katapulty. W edytorze Project Spark nie znajdziemy gotowego obiektu spełniającego nasze wymagania dlatego zrobimy go z mniejszych elementów podobnie jak w przypadku klocków LEGO. Wybieramy z galerii obiekt drewnianego filaru. Po umieszczeniu do na planszy zaznaczamy ten obiekt i robimy kilka jego kopii. Następnie poszczególne elementy skalujemy tak by każdy kolejny był trochę mniejszy od poprzedniego. Wdzięki temu nasze ramie katapulty będzie szerokie u podstawy i będzie się zwężało w pobliżu aktywnego końca. Na zakończeniu dodałem inny obiekt by całość była ciekawsza wizualnie
Zanim nasze ramie skleimy w jedną całość musimy poznać zasady ustalania punktu odniesienia. W edytorze Project Spark każdy obiekt ma zdefiniowany własny punkt odniesienia względem którego wykonywana jest rotacja. Niektóre obiekty mają ten punkt w środku inne u podstawy. Nasze ramie katapulty musi mieć ten punkt odniesienia umieszony asymetrycznie w dolnej części. By to osiągnąć będziemy musieli odpowiednio zaplanować kolejność sklejania obiektów. Punktem odniesienia każdego złożonego obiekty jest punkt odniesienia pierwszego zaznaczonego obiektu w momencie sklejania grupy obiektów. Jest to przydatna zasada ponieważ umożliwia nam łatwe umieszczenie punktu odniesienia w dowolnym miejscu dowolnego złożonego obiektu. Wystarczy że dokleimu do złożonego obiektu jakiś mały element i ustalimy go nadrzędnym dla całości stosując odpowiednią kolejność zaznaczania i grupowania.
W naszym przypadku całość będzie jeszcze prostsza. Wystarczy że ostatni element naszego ramienia obrócimy o 180 stopni. Dzięki temu podstawa tej belki stanowiąca jej punkt odniesienia będzie w dolnej części naszego ramienia. Następnie sklejamy całe ramie za w odpowiedniej kolejności jak na obrazku. Wszystkie sklejenia wykonujemy w menu wielokrotnej selekcji które znajduje się obok selekcji prostej.
Gdy mamy już gotowy element ramienia katapulty to czas stworzyć dla niego animacje. By obiekt ożywić jak zwykle wykorzystujemy skrypt jego mózgu. W części trzeciej kursu nauczyliśmy się że każdy mózg może mieć kilka stron skryptu z których każda oznacza jeden stan tego obiektu. Nasz obiekt ramienia katapulty wymaga dwóch stanów: stanu strzału oraz stanu ponownego załadowania katapulty. Oba stany będą od siebie niezależne a sterowanie nimi przekażemy na zewnątrz do obiektów dźwigni oraz korby. Zwolnienie dźwigni będzie oznaczało strzał, kręcenie korby będzie ponownie ładowało katapultę. Obiekty te wiążemy połączeniem energetycznym z naszym ramieniem katapulty tak by uruchomienie każdego z nich powodowało uruchomienie jednego ze skryptów. Tym razem nasze przełączniki nie tylko aktywują swój stan energetyczny ale zanim to zrobią odwołują się do elementu ramienia i ustawiają w nim odpowiednią stronę skryptu (zamiast używać numeru jak na obrazku lepiej użyć nazwy). Tak by przekazana po chwili energia została wykorzystana na właściwą akcję. W edytorze Project Spark dowolny obiekt może sterować działaniem własnego mózgu oraz mózgami dowolnych innych obiektów które wybierzemy. Dzięki temu możemy tworzyć bardzo złożone interakcje pomiędzy obiektami. Skrypt dla przełącznika wygląda następująco, skrypt dla korby jest prawie identyczny za wyjątkiem numeru strony:
Następnie musimy stworzyć skrypty sterujące w samym ramieniu katapulty. Oba będą stworzone na bliźniaczej zasadzie. Pierwszy z nich czyli strzał będzie obracał ramię w jednym kierunku z dużą prędkością. Drugi będzie obracał ramię w przeciwnym kierunku z małą prędkością przywracając katapultę do stanu pierwotnego. W naszym przypadku wartości graniczne obrotu ustaliłem na 30 stopni gdy katapulta jest gotowa do strzału oraz 180 stopni po wykonaniu strzału. Aktualna wartość wychylenia ramienia katapulty przechowywana jest w zmienne lokalnej. Animacja wykonuje się z prędkością 30 cyki na sekundę gdzie przy każdym cyklu sprawdzane są warunki brzegowe i jeżeli są one spełnione to wartość się zmienia zarówno w przypadku zmiennej jak i samego obrotu obiektu. Po przekroczeniu wartości brzegowej skrypt odwołuje się do naszych przełączników wyłączając zasilanie co kończy działanie skryptu. Użytkownik musi aktywować ponownie dźwignię lub korbę w zależności od sytuacji co ustawi odpowiednią stronę jako aktywną oraz dostarczy zasilanie. Gotowy proces strzału i ładowania wygląda następująco
Gdy mamy gotową animację ruchu naszego ramienia budujemy właściwą katapultę. Podobnie jak ramie składamy ją z elementów drewnianych filarów. Przyda nam się także kamień symulujący obciążenie katapulty oraz sama kula którą będziemy strzelać. Wszystkie elementy odpowiednio skalujemy i budujemy z nich model katapulty tak jakbyśmy bawili się klockami LEGO. Jednocześnie pamiętamy o sklejaniu. Czyli gdy kończymy jeden filar to sklejamy go w całość, następnie kopiujemy powstały obiekt obracamy i robimy z niego wsparcie. Ponownie sklejamy, kopiujemy i mamy oba filary. Całość musi wyglądać realistycznie więc najlepiej ściągnąć sobie z Google kilka rysunków prawdziwych katapult by przyjrzeć się jak one zostały zbudowane. Pamiętamy jednak by pod żadnym pozorem nie sklejać naszego ruchomego ramienia ze statyczną częścią katapulty. Także dźwignia oraz korba nie mogą zostać sklejone z reszta konstrukcji ponieważ staną się jej częścią i nie będziemy mogli modyfikować skryptów tych elementów aktywnych. Obiekty aktywne na samym końcu powiążemy z pozostałą konstrukcją połączeniem typu attachment które znajduje się w menu obok wielokrotnego zaznaczenia. To powiązanie w przeciwieństwie do sklejania łączy obiekty zachowując jednak ich odrębność dzięki czemu ich właściwości mogą być dalej wybierane i zmieniane.
Gdy mamy gotową katapultę czas dodać animację kuli podążającej za ramieniem w trakcie strzału. W tm celu dodajemy ścieżkę którą nazwiemy Boulder path. By ułatwić sobie narysowanie odpowiedniej ścieżki najlepiej wykonać kilka kopii obiektu naszego ramienia katapulty umieszczając je w różnych fazach animacji. Ten szybki zabieg pokazuje nam jak poprawnie wyznaczyć trasę wystrzeliwanej kuli. Rysujemy odpowiednią trasę po czym usuwamy nadmiarowe kopie ramienia katapulty. W samej ścieżce ustalamy parametr 'smooth' tak by trasa poruszania się kuli była zaokrąglona. Zaznaczamy także by cała trasa była zamkniętym okręgiem dzięki czemu będziemy mogli wykorzystywać wielokrotnie z naszej ścieżki do kolejnych strzałów. Oczywiście powoduje to że nasza kula zamiast polecieć będzie sobie krążyła po katapulcie w kółko ale problem ten rozwiążemy poprzez malutki program skryptu który umieścimy w mózgu naszej kamiennej kuli.
Skrypt sterujący naszym pociskiem wygląda następująco. Głównym elementem jest poruszanie się po wyznaczonej ścieżce. Jednak nie chcemy by kula zataczała okręgi więc gdy jest w górnej pozycji natychmiastowo przenosimy ją na pozycję startową. By to osiągnąć to nadpisujemy jej pozycję pozycją startową po tym gdy osiągnie ona finalne stadium lotu w trakcie wystrzelenia gdy zabranie jej energii która dostarczana jest z ramienia katapulty. By ułatwić sobie ustalenie właściwej pozycji startowej umieszczamy pomocniczy obiekt LogicCube w miejscu w którym kula znajduje się na starcie. Teraz już wystarczy pobrać pozycję naszego niewidocznego obiektu LogicCube i przypisać go jako nową pozycję naszego pocisku. Dzięki temu nasza kula zamiast zawisnąć w powietrzu po odcięciu zasilania zostaje przemieszczona do punktu początkowego.
W tym momencie nasza animacja jest już gotowa. Możemy wystrzelić z katapulty i animuje się zarówno ramię katapulty jak i sama kula. Możemy także przeładowywać katapultę. Jednak chcemy by nasza katapulta nie tylko ładnie się animowała ale także strzelała prawdziwymi kamiennymi kulami siejącymi zniszczenie. By to osiągnąć w miejscu w którym nasza kula kończy animację umieszczamy kolejny niewidoczny blok logiczny. Nasz blok logiczny będzie rzucał kulami w kierunku naszego strzału. Możemy ustalić wiele parametrów tego rzutu takie jak siła lub wektor kierunku. Dzięki temu że są one w jednym miejscu w logicznej kostce bardzo łatwo je modyfikować i nie ma to wpływu na naszą główna animację strzału. Animacja widoczna kuli pierwszej oznaczona jest na czerwono, droga niewidoczna na niebiesko a strzał drugim rodzajem kuli na zielono
Jednak by rzucić kulą musimy zdefiniować obiekt którym rzucamy. Nie chcemy rzucać gotowym obiektem z galerii bo ma on inny rozmiar i ma domyślne właściwości. Dlatego będziemy musieli dodać z galerii kolejną kule i przeskalować ją do rozmiaru naszego głównej kuli która miotamy w ramach utworzonej animacji. Jest ona widoczna jako żółta kula na wcześniejszym obrazku. Nasza kula do miotania będzie miała zupełnie inny skrypt sterujący. Nie będzie ona podążała po żadnej ścieżce ale będzie się zachowywała zgodnie z zasadami fizyki. Będzie miała ona własną masę, tarcie, objętość, przyspieszenie oraz prędkość. Po ustaleniu parametrów fizycznych musimy ustalić że nasza kula jest wzorcem dla obiektów ustawiając w jej właściwościach parametr Template. Dzięki temu ten egzemplarz kuli będzie niewidoczny i będzie stanowił wzorzec na podstawie którego nasz blok logiczny będzie tworzył kolejne pociski w trakcie strzału.
Gdy mamy już ustalone parametry lotu konieczne jest ustalenie parametrów kolizji. W tym celu zamykamy edytor właściwości obiektu i otwieramy skrypt jego mózgu. By całość była prosta dodałem prostą zasadę polegającą na zniszczeniu kawałka terenu przy każdym zderzeniu z gruntem. Oczywiście nie jest to działanie idealne ponieważ kule leżące na gruncie przepalają plansze na wylot ale obrazuje zasadę działania. W prawdziwej grze możemy ustalić że w wyniku uderzenia kula ulegnie destrukcji lub że zniszczenia będą zależne od prędkości zderzenia. Możemy także w poszczególnych obiektach na mapie dodać osobną logikę zderzenia tak by kamienny mur inaczej reagował na zderzenie z kulą niż mur drewniany. Możemy także dodać efektowne eksplozje wyrzucające w górę pojedyncze deski w wielkim obłoku pyłu. Możliwości destrukcji otoczenia sią ograniczone jedynie naszą wyobraźnią ponieważ każdy obiekt w Project Spark ma własny skrypt sterujący gdzie możemy zaprogramować efekt zderzenia.
Gotowe demo będzie wyglądało następująco. W moim przypadku zmodyfikowałem parametry fizyczne szablonu wystrzeliwanej kuli by odbijała się ona po planszy. Nie jest to może zbyt realistyczne ale za to prezentuje model zniszczeń które generujemy w momencie dotknięcia terenu. Wypadałoby jeszcze dodać animację obciążnika by przesuwał się on w górę i dół ale to już są szczegóły które dodajemy dzięki pojedynczej ścieżce ruchu. Gotowy obiekt zapisujemy do naszej galerii dzięki czemu będziemy mogli z tej katapulty korzystać w przyszłych naszych projektach lub ją udostępnić innym. Aktualnie udostępniać można tylko całe poziomy ale można z nich skopiować wybrane obiekty. Zapowiedziano także bezpośrednie udostępnianie pojedynczych obiektów w finalnej wersji gry. Tak by można tworzyć gry wspólnie z innymi użytkownikami Project Spark. Ktoś zrobi zamek, ktoś inny katapultę i taran a jeszcze inna osoba oprogramuje AI obrońców i szturm na zamek gotowy.
Film jak zwykle nagrał się w nienajlepszej jakości ale mój program do nagrywania pulpitu jest w wersji demonstracyjnej a domyślne kodeki nie pozwalają mi na nagranie płynnego obrazu 1080p.
W następnym odcinku...
W kolejnej części zademonstrowałem jak stworzyć podstawowe mechanizmy silnika gry by móc budować większe poziomy oraz lepiej zarządzać kodem i zasobami komputera. Tworzymy szablony przeciwników którzy dziedziczą wspólne zachowanie, programujemy fabryki obiektów oraz dzielimy grę na sektory widoczności by ją zoptymalizować. Lekcja piąta znajduje się pod tym adresem
Od dziś Project Spark jest dostępny dla każdego za darmo
Od 18 marca 2014 nie są wymagane klucze beta. Każdy może ściągnąć aplikację i tworzyć własne gry bez potrzeby wcześniejszej rejestracji. Zlikwidowano także abonament Spark Time który wcześniej ograniczał możliwość grania w gry używające DLC. Teraz każdy może grać we wszystko za darmo nawet jeżeli nie odblokował samemu zawartości DLC.
Project Spark - Sklep Windows 8.1
Na potrzeby tego kursu założyłem dodatkowe konto w grze gdzie będę publikował kod dla poszczególnych lekcji. Aktualnie są tam tylko najnowsze lekcje. Zapraszam. SatiricalCrab94.