Przyznam się bez bicia: w tym tygodniu nie pracowałem zbyt wiele nad projektem konkursowym. Miałem trochę na głowie (nowa praca! 🙂 ) a ewentualne wolne chwile spędzałem nad innymi tematami bloga.
Na moją platformówkę przeznaczyłem weekend. Udało mi się i trochę przysiadłem dziś do projektu. Już mam pierwsze efekty. W grze pojawiły się dwa nowe elementy: lawa, kolizją z która powoduje śmierć gracza i restart gry, oraz poruszające się w pionie platformy.
W nową wersję gry pograć można klikając w obrazek powyżej (kod można znaleźć na projektowym githubie).
Na samym dole poziomu znajduje się obecnie lawa (pomarańczowy pasek). Miejscami jest ona zakryta platformą podłogi, ale nie wszędzie. Gracz musi uważać aby nie wpaść do lawy. Jeżeli jej dotknie, przegra i gra zresetuje się. Lawę można obejść idąc górą po drabinkach, lub dołem korzystając z unoszących się platform. Uwaga, platformy opadają i unoszą się na przemian, aż do zanurzenia w lawie.
Według mnie te dwie nowości naprawdę sporo dodają do gry i czuję, że powoli zbliżam się do takiego formatu, który będzie mi odpowiadał. Co ciekawe z technicznego punktu widzenia, zarówna lawa jak i lewitujące platformy, to dość drobne.
Oba te obiekty tworzone są w module platformy (platform.js). To co umownie nazwałem lawą (może to równie dobrze być rwąca rzeka, wilczy dół, ostre lodowe stalagmity itd. ), to po prostu zwykła platforma, którą wrzuciłem do nowej tablicy – lavas. Obiekty z tej tablicy sprawdzam z obiektem gracza podczas aktualizacji stanu. Jeżeli wystąpi się uruchamiana zostaje funkcja resetGame, która zmienia stan gry z powrotem na menu. Pociski wystrzelone w lawę znikają tak jakby trafiały w zwykłą platformę, jednak nie generują wtedy efektu cząsteczek.
Jeżeli chodzi o obiekt poruszającej się platformy, powstaje on dzięki nowej metodzie modułu platform.js. Metoda ta nazywa się newMovPlatform i jest eksportowana na zewnątrz modułu. Tak wygląda jej kod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
newMovingPlatform: function(x,y,width,height,color, maxY, minY, speed){ var newPlat = Object.create(platform); newPlat.x = x; newPlat.y = y; newPlat.maxY = maxY; newPlat.minY = minY; newPlat.width = width; newPlat.height = height; newPlat.goingDown = true; if(color){ newPlat.color = color; } newPlat.speed = speed; newPlat.update = function(){ if(this.y >= this.maxY) { this.y = this.maxY; } if(this.y <= this.minY) { this.y = this.minY; } if(this.y === this.maxY && this.goingDown === true) { this.goingDown = false; } if(this.y === this.minY && this.goingDown === false) { this.goingDown = true; } if(this.goingDown) { this.y += this.speed; } else { this.y -= this.speed; } } return newPlat; }, |
Działa ona podobnie do metody tworzącej zwykłe platformy, ma jednak parę dodatkowych cech. Przede wszystkim, tworzony obiekt, posiada dane na temat krańcowych wartości Y podczas poruszania się platformy (maxY i minY) oraz pole przechowujące informacje o prędkości poruszania się platformy speed.
Wartości tych pól, przekazywane są jako argumenty do funkcji tworzącej obiekt. Ponad to, obiekt platformy poruszającej się posiada również własną metodę update. Jest to bardzo prosta sekwencja wyrażeń warunkowych, która kontroluje kierunek oraz ruch platformy na osi Y.
Platformy aktualizowane są podczas wykonywania funkcji update stanu. Podczas ich aktualizacji sprawdzam również czy któraś nie koliduje z graczem. Używam do tego metody blockRectangle z modułu helpers. Dzięki tej metodzie postać może ‚stać’ na ruchomej platformie.
Tak jak pisałem, zmiany są nie wielkie, ale myślę że dość efektowne. Mam już prawie wszystko co potrzeba aby stworzyć dobrą platformówkę (przynajmniej jeśli chodzi o otoczenie). Kolejny krok to usprawnienie ataków gracza, póki co mam tylko placeholdery. Chciałbym też w najbliższym czasie popracować nad poruszającym się ekranem gry, a w szczególności na tym w jaki sposób się porusza. przypięcie środka ekranu do środkowego punktu gracza jest trochę mało ‚miodne’. Zobaczymy co da się z tym zrobić.
Jeżeli masz jakieś pytania lub uwagi, zachęcam do skorzystania z opcji dodania komentarza poniżej. Innym dobrym sposobem na kontakt ze mną jest moja strona na facebooku. Jestem bardzo ciekaw waszych opinii o moim projekcie 🙂 .
Wygląda bardzo fajnie, kilka razy wpadło się do lawy zanim doskoczyłem do końca 😀
Pozwoliłem sobie zerknąć też trochę w kod i w sumie mam pytanie 🙂
Nie jestem rozeznany w narzędziach ku takowemu celu w javascript’cie, ale zastanawiam się czy myślałeś już nad sposobem przechowywania struktury levelu/levelów tzn. pozycje chociażby platform czy innych obiektów?
Myślałeś o jakimś zewnętrznym narzędziu, czy może coś własnego? 🙂
Myślałem, myślałem 🙂 Założenie było takie, że będzie to po prostu pisany ręcznie plik JSON . Co z tego wyjdzie ostatecznie? Zobaczymy 🙂 Jeżeli okaże się, że będzie to zbyt dużo roboty, nie wykluczam użycia jakichś generatorów.