# Icy Tower 3D DEV LOG #### W ramach nauki openGLa (po raz 5 już chyba) postanowiłem w końcu zrobić jakiś większy projekt w tym. Żeby mieć większa motywację będę pisał devlog codziennie (nawet jak nic nie zrobię danego dnia, będę pisał co se robiłem poza tym XD). Planuję zacząć w piątek 09.06 regularne updaty. :::spoiler **Plany i rozgrywka (WiP)** Przeniesienie Icy Towera do 3D jest idiotyczne z założenia, bo czytelność będzie bardzo ograniczona i prędkość będzie musiała być mocno zmniejszona względen oryginału, ale ten projekt pozwala na pokazanie fajnych rzeczy z openGLa: 1. Widok musi być trzecioosobowy, bo pierwszoosobowe platformówki to jest dramat. To sprawia że trzeba w ogóle to zrobić (a nie wiem jak utrzymać model przed kamerą, próbowałem i to jest masakra), trzeba zrobić model (będę robił sam jakieś low poly w Blenderze) i animacje (nie mam pojęcia, boję się xd). 2. Skoro można patrzeć w dół, to musi być podłoga przed którą uciekamy, a nie krawędź ekranu. Lawa jest sztampowa bardzo, ale można napisać jakiś ładny animowany shader do tego i pobawić się oświetleniem na platformach, modelu gracza i ścianach. 3. Platformy będą miały kolizje tylko od góry (jak w 2D), ale od spodu patrząc muszą być półprzezroczyste, żeby dało się planować skoki większe niż 1 piętro. Nie wiem jak to zrobić mądrze jeszcze. 4. Draw distance platform musi być dynamiczny chyba - jak nie mamy prędkości to rysuje się tylko kilka pięter na górę (dla czytelności), a jak jesteśmy rozpędzeni to powinno się rysować więcej (czytelność piętra w góre nic nie wnosi (może w ogóle się będą ukrywać albo będą bardziej przezroczyste), a większy syf na ekranie może zwiększyć poczucie pędu xdd). 5. Gwiazdki przy rozpędzeniu będą mogły być fajnym efektem cząsteczkowym. 6. Możliwe że platformy nie będą tylko prostokątami tylko będą bardziej nieregularne, ale nie wiem czy to nie zepsuje czytelności, a na pewno zepsuje detekcje kolizji. Projekt będzie pisany w cpp (tu podrzucę link do gita jak już zacznę). Będę go na Ubuntu, więc może być dodatkowo zabawnie XD. ::: ## Czerwiec :::spoiler 7 Mam przygotowany już szablon z tutorialu, odpowiednio przepisany na klasy żeby się dało nad tym po ludzku pracować. Z 2h się męczyłem dzisiaj bo źle czyściłem bufor Z po każdej klatce, tak to wygląda jak się złej wartości użyje do tego XDDD. --- {%youtube iVBCf3-glgY %} ::: :::spoiler 8 Zaimplementowałem prostą fizykę skoków (do poprawy żeby prędkość wznoszenia i spadania zmieniała się w czasie), sam wykminiłem jak stworzyć 2 różne obiekty a nie kopie jednego obiektu (jestem dumny bardzo xd), załadowałem skyboxa też. Myślałem że skybox będzie tylko dla mojej zabawy (bo w sumie miało być widać niebo tylko u szczytu studni), ale podoba mi się i chyba zrobię jakieś okratowane okna raz na jakiś czas w ścianach (czyli już nie ma studni tylko wieża), ale to się zobaczy. Skybox tworzyłem w ogóle z 2h, bo boczne ścianki były do góry nogami, powalone bo obrócenie ich w paincie nie naprawia problemu xd. --- {%youtube ovDN-ZjrZcM%} ::: :::spoiler 9 Pomyślałem że będę mierzył FPSy w trakcie kodowania: to może być zabawne, bo teraz rysuję 2 obiekty (myślę że będę rysował góra 4 w całej grze, tylko że platformy będą kopiowane), ale na razie w ogóle tego nie optymalizuję. Fizyka kolizji pewnie zeżre sporo zasobów, ale teraz mam 750 FPSów. ![](https://hackmd.io/_uploads/BkdW59xPh.jpg) Dodałem testowo pierwszy model 3D (tylko bohater ma być modelem), i po pierwsze to jest więcej roboty niż się spodziewałem, a po drugie śmiesznie bo FPSy spadły do 300. Z włączoną zintegrowaną grafiką i ten model jest całkiem szczegółowy (+ nie ma tu żadnej optymalizacji, może da się to przyspieszyć) ale śmieszne że tak bardzo spadło przez 68k nowych trójkątów. Nie wiem czemu z włączoną kartą Nvidii wyciągam stałe 60 FPSów (obojętnie czy z modelem plecaka czy nie), musi mieć jakąś blokadę. Później się pobawię żeby ją ściągnąć. ::: :::spoiler 10 Zrobiłem własny model w Blenderze i XD, to jest trudne bez tutoriala żadnego, ani wiedzy, ani żadnej zdolności do plastyki. Ale rysowanie tekstur na modelu bezpośrednio jest fajne. Oczywiście załadowanie modelu z blendera nie działało długo, ale mamy model postaci. Super zabawą będzie dodawanie do tego animacji w blenderze. --- {%youtube FmDgI4Yka2A %} ::: :::spoiler 11 Dodałem poruszanie postacią we wszystkich osiach: nie wiem jakim cudem wyszło mi to całkiem sprytnie, szczególnie że sam to wymyślałem. Teraz muszę podpiąć kamerę do pleców, nie wiem jak się za to zabrać kompletnie. Udało mi się też ściągnąć limit FPSów w ubuntu (sterowniki Nvidii włączają VSynca defaultowo, w sumie sprytne). Teraz mam 1800 FPSów. --- {%youtube XIIwjY7BX24 %} ::: ::: spoiler 13 Ostatnie 2 dni walczyłem z implementacją kamery z 3 osoby. Chciałem to na początku samemu wymyslić, ale bez szans więc robiłem tutoriale i ostatnie 4h jakoś walczyłem z tym, że model się obrazał w lewo, a kamera w prawo. Nie wiem jak w końcu wpadłem na to jak trygonometria tam działa i to naprawiłem, ale kod wygląda okropnie, losowe zmienne są ponegowane, ja nie wiem XD. Mam nadzieję że nie będę musiał tego zmieniać już, bo jak tego dotknę to się posypie, lepiej nie umiem, a od zera nie mam zamiaru. FPSów na GPU Nvidii jest teraz 2.3k, ale widać że draw distance jest potężny. --- {%youtube _QFeZNDy4S4 %} ::: ::: spoiler 14 Dzisiaj implementowanie przezroczystości (żeby patrząc kamerą w górę platformy nad nią były przezroczyste i było cokolwiek widać) i rozbudowa systemu kolizji i skoków. Zasadniczo podstawy już działają, teraz mogę zacząć rzeczywiście to kodować, więc zostało dodanie animacji, dodanie ściany dookoła, spawnowanie platform spadających od góry losowo, lawa na dole, licznik punktów, menu, przegrana po wpadnięciu do lawy, dźwięki, efekty cząsteczkowe skoków (i może jakieś iskry z lawy), upłynnienie skoków i spadania (żeby nie były ze stałą prędkością tylko stopniowo zwalniały / przyspieszały). Do tego optymalizacja, bo o ile grafika jest zoptymalizowana teraz nienajgorzej, to silnik kolizji jest brzydki jak noc i muszę to przepisać całkowicie. Ale działa. Usunąłem podłogę bo nic nie było widać. Ograniczyłem fps-y do 60 bo nagrany ekran zacinał okropnie jak nagrywałem to ponad 2k fpsów. --- {%youtube 6G29DWTkkfw %} ::: ::: spoiler 15 Dzisiaj spory refactor kodu, bo już mi się syf zaczął robić. Do tego zalążki rzeczywistego gameplayu, czyli przesuwanie platform na dół (bo wiadomo że tak to będzie działać, nie że lawa leci do góry bo mogłaby się wywalić do nieprecyzyjnych floatów już), kolizje zakodowane mądrzej (ale dalej clipping modelu widać). Wymodelowałem też ściany (sam próbowałem nałożyć teksturę wziętą z neta i ją zmodyfikować, dlatego to tak wygląda XD). Zwiększłem też draw distance nareszcie. --- {%youtube 2L4j1WeLh68 %} ::: ::: spoiler 16 Dzisiaj mało siedziałem, dodałem tylko kolizje do ścian i napisałem shader do lawy pływającej ładnie. Zacząłem też pracować nad pisaniem tekstu na ekran, ale w openGLu to jest masakra i nie działa mi bilioteka do tego, chyba wezmę i to oldschoolowo załatwię teksturami po prostu. --- {%youtube flEdIL5r0Kg %} ::: ::: spoiler 17 Dzisiaj zrobiłem to: ten czerwony trójkąt w górnym lewym rogu. Nie siedziałem nad tym jakoś szczegółnie długo, ale na pewno z 2h poszły żeby go narysować XD. To oznacza że w sumie cały kod potrzebny do napisania HUDu jest gotowy (i GUI po części też), ale na razie wyświetla się mały czerwony trójkącik. ![](https://hackmd.io/_uploads/HJEBF2jDn.jpg) ::: ::: spoiler 18 Dzisiaj sukces, czyli pierwsza semi-grywalna wersja. Poszło szybciej niż zakładałem do tego punktu, ale zostało mnóstwo do zrobienia jeszcze. Tak więc dodałem działający hud, faktyczną śmierć, scrollowanie tekstury ścian (żeby sie wydawało że lawa się podnosi a nie platformy oapadają, ale przez statyczny skybox moim zdaniem i tak tego nie czuć). Zostało do zrobienia jeszcze mnóstwo, takich jak lepsze spawnowanie platform, różne rozmiar platform, lepsza fizyka skoków, animacje, przyspieszanie w ogóle podczas serii skoków i przyspieszenie prędkości spadania platform z upływem czasu, efekty cząsteczkowe, dźwięki (to będzie masakra), ale i tak jestem z siebie dumny. A no i jeszcze fajnie by było nie musieć wyłączać i włączać programu żeby zacząć nową grę. Muszę też w końcu zrobić Makefile'a do tego, ale to też będzie zabawa. --- {%youtube HLjmQTaB9vw %} I wrzuciłem w końcu kod na gita (tak jak mówię, bez Makefile'a to nie jest proste bo wymaga mnóstwa bibliotek do openGLa), ale jest. https://github.com/jakujakub1234/OpenGL_IcyTower3D ::: ::: spoiler 19 Dzisiaj chciałem zrobić animacje, ale model w blenderze zrobiłem tak beznadziejnie że jak podnoszę ręcę do góry to kciuk ląduje przy kolanach XD. Muszę zrobić model od zera bo nie mogę z tym. ![](https://hackmd.io/_uploads/S1cnnZRDh.png) ::: ::: spoiler 21 Obraziłem się na tego blendera więc wczora sobie robiłem przerwę, dzisiaj w lamach luźniejszych rzeczy się bawię efektami postprocesowymi. Przy okazji sobie poczytałem trochę dookoła, a same efekty postprocesowe nie wiem czy będą miały jakieś zastosowanie w grze, ale może jakiś kernel mi się spodoba. ![](https://hackmd.io/_uploads/r18mcAldh.jpg) Z tymi kernelami (wziętymi wprost z tutoriala) super wygląda lava, może dodam do jej shadera po prostu. ![](https://hackmd.io/_uploads/ry-I5Rxd2.jpg) ![](https://hackmd.io/_uploads/SJN8q0ld2.jpg) ::: ::: spoiler 22 Trochę sobie odpuściłem w tym tygodniu niestety, mam nadzieję że w weekend będę miał więcej czasu na dokończenie ważnych rzeczy. Dzisiaj skończyłem wszystkie rozdziały z tutoriala (większość rzeczy mi się nie przyda, ale może w innym projekcie), a teraz się bawiłem postprocesowymi efektami i mi się to podoba bardziej niż powinno xd. --- {%youtube teGm8dfOOjw %} ::: ## Lipiec ## Sierpień