14 listopada 2016

A może roguelike?

Idę za ciosem.

Zachęcony efektem działania generatora podziemi stwierdziłem, że użyję go w większym projekcie. Generator ma stać się częścią prostej (tak wydawało się na początku) gry roguelike.
Żeby nie wymyślać koła i zasad gry od zera wykopałem starą planszówkę znaną na zachodzie jako Citadel of Blood, a w Polsce skopiowaną (zpiraconą przez Encore) i znaną pod nazwą Labirynt Śmierci. Generator będzie odpowiedzialny za tworzenie wyglądu poszczególnych klocków z których będą się składać podziemia, tak aby nie korzystać z niezbyt pięknych kafelków z których składała się oryginalna plansza.
W tej chwili wersja 0,0001 beta tworzy planszę z możliwymi połączeniami oraz ustala typ pomieszczenia, do którego trafia drużyna. W tle dzieje się trochę magii programistycznej
i  staram się robić te elementy gry, które nie sprawiają mi kłopotów programistycznych. W tej chwili dostępne są pierwsze wersje maszyny losującej potwory i skarby oraz mechanizm zarządzający turami gry.

Poniżej widać przykładowy działania generatora.


Kwadracik zielony to aktualna pozycja „drużyny” zwiedzającej podziemi. Podziemia tworzone są na bieżąco przy przechodzeniu między klockami (niebieskie kwadratowe pola) i na bieżąco określana jest liczba dostępnych wyjść/wejść z pomieszczeń. Czarne ramki to oczywście nieprzekraczalne „ściany”.

A tu widać w pełni wygenerowany poziom podziemi.




W tej chwili kwadraciki mają 64x64 px wielkości a sama plansza to 8x8 kwadratów (docelowo nie będzie tak skalowana).

Dla każdego z kafelków – w oparciu o ilość wejść – chcę wygenerować z pomocą już napisanego generatora wygląd. I tak do obszaru o 3 wejściach kafelek będzie wyglądał tak:





A tak dwa połączone klocki – jeden z 3 wejściami i drugi z jednym.








Taki przynajmniej jest plan. Na razie jestem jeszcze parę kroków przed połączeniem generatorów ze sobą.


Rzeczy wymagające dużo pracy idą w tej chwili na później – min. obsługa walki, grafika, ekrany i sensowne gui. Co do grafiki - będzie pixelartowa (oczywiście). Znalazłem w międzyczasie komplet grafik, które w 100% pokrywają moje zapotrzebowanie na elementy składające się na gry. Chcę wykorzystać DawnLike - 16x16 Universal Rogue-like tileset v1.81



Wygląda tak:


Będę mógł przećwiczyć obsługę grafiki i tworzenie animacji.

Mądrzy ludzie mówią, że najtrudniej napisać swoją pierwszą grę. Cóż – zobaczymy czy uda mi się ją zrobić i doprowadzić do grywalnej wersji. W miarę postępów (widocznych) będę dodawał kolejne wpisy.

Jeśli kogoś interesuje kod i co wykorzystuję - to także mogę go wrzucać. Piszę oczywiście w javie ze wsparciem javyfx  i kilku zewnętrznych bibliotek użytkowych.

03 listopada 2016

Generator map lekcje 5 / 6

Kolejny krok to zapewnieniu połączeń pomiędzy oderwanymi od siebie obszarami map. Lekcje zawierają się w ramach wpisów:  Connecting Rooms oraz Ensuring Connectivity

Lekcję dotyczącą tworzenia połączeń między oderwanymi do tej pory pomieszczeniami przerobiłem wraz z tutorialem. Jednak kolejną, w której zapewniamy połączenia pomiędzy wszystkimi obszarami mapy zrobiłem już samodzielnie bez zaglądania do tutoriala. W oparciu o zdobytą już wiedzę i własne umiejętności udało mi się to dosyć sprawnie zrobić. Ciężko mi ocenić czy mój kod jest tak dobry jak ten z tutoriala, czy może wręcz lepszy, ale działa i jestem z niego zadowolony bo jest mój :D.


Poniżej efekt pracy bez uruchomionego dodatkowo łączenia (lekcja Connecting Rooms):



i z łączeniem oderwanych obszarów (samodzielny kod):




Jak widać pojawił się nowy korytarz łączący oderwane strefy.


Teraz wyznaczone ścieżki trzeba przekształcić w korytarze. Czyli: Passageways.

31 października 2016

Generator map lekcja 4

Przerobiłem lekcję 4 Detecting Regions , w ramach której mapka była sprawdzenia pod obecność artefaktów w postaci zbyt małych obszarów pustych lub zbyt małych obszarów wypełnionych.
Przykładowo :
Mapka z dosyć dużą krawędzią dla kwadratu ściany (wartość Długość boku) z regionem o zdecydowanie zbyt małej wielkości. Powinien on zostać usunięty (wypełniony ścianą). Oczywiście w efekcie mapka będzie w 100% niegrywalna, ponieważ w całości zostanie wypełniona ścianami. 

Poniżej mapka przepuszczona przez filtr, z której usunięto dwa (musicie uwierzyć na słowo :) ) zbyt małe obszary puste. Algorytm usuwa także zbyt małe ściany.


  

W poniższej mapce widać zbyt mały obszar ściany, który powinien zniknąć z naszej mapy:


 Lekcja poszła dosyć szybko. Nie ustrzegłem się kilku błędów, ale udało się je w miarę szybko ogarnąć (nie pamiętam kiedy ostatnio używałem w javowego PriotytyQueue!)


28 października 2016

Generator map lekcja 3

Dzisiaj dzień bogaty we wpisy!

Jako, że miałem troszkę czasu skończyłem 3 lekcję dotyczącą generowania map czyli Creating Meshes.
Muszę powiedzieć, że z powodu niezbyt dobrego zrozumienia tego co się dzieje w tutorialu (jak i słabego tłumaczenia) zrobiłem kilka poważnych błędów w kodzie i mapki wyglądały niebałdzo:


 Problemem ponownie były wbudowane w Unity funkcje, które musiałem napisać samodzielnie w java od zera.

Po kilku zmianach jest już jednak dużo lepiej:



Jak widać są jednak jeszcze jakieś błędy - całe zielone pole powinno być zabudowane mapą, ale efekt jest zachęcający.
Poszukam, poprawię i się pochwal.

HA! Znalazłem błąd. Generator tworzy teraz takie oto mapki.


Kolejny krok - usuwanie błędnych (zbyt małych) obszarów oraz ustalanie powiązań pomiędzy rozdzielonymi na mapie obszarami.

Rysunek Głowomeba

Od ostatniego wpisu o głowomebie minęło już trochę czasu, a gdy odkłada się rzeczy na później coraz ciężej zakończyć rozpoczętą pracę.

Głowomeba czekała i czekała, aż się w końcu doczekała.  Efekt poniżej, wiele lepiej nie będzie bo nie pozwalają na to moje umiejętności.
 
Poniżej umieszczam aktualne foto.




W tej chwili oceniam kompletność rysunku potwora na 95% - nie ma dorysowanej "podłogi" i jakiegoś sensownego tła portalu, z którego wychodzi. 
Rysunek wykonany jest ołówkami na kartce w formacie A4.

27 października 2016

Generator map lekcja 2

Miałem chwilę na przerobienie kolejnego rozdziału tutoriala czyli Marching Squares. Teraz mój kod generuje mapę węzłów, z których będzie można przejść do wygładzania krawędzi pikselowej mapy.

Zrzutów ekranowych nie daję ze względu na to, że wizualnie nic się nie zmieniło. Siadam do części trzeciej.

14 października 2016

Generator map lekcja 1

Na bazie tutoriala do silnika gier Unity i lekcji Cellular Automata napisałem (podobny) generator podziemi w z użyciem Java 1.7 i JavaFX.

Wersja po pierwszej lekcji generuje takie oto mapki jak na załączonych screenach. Po przerobieniu kolejnych lekcji pokażę osiągany postęp.

(Paski widoczne na generatorze to ilość wygładzeń mapy (0-10) i stopień jej wypełnienia białym(0-100))






22 września 2016

W poszukiwaniu palantira

W najbliższym czasie przewiduję rozpoczęcie prowadzenia starożytnej kampanii do MERP tj.W poszukiwaniu palantrira.
Od dawna mnie korciło, aby poprowadzić ten komplet przygód. W tej chwili przegryzam się przez kolejne rozdziały i zapisuje co ważniejsze rzeczy, aby nie kartkować w razie czego książki w czasie gry.
Za dodatkowo źródło wiedzy służy mi "Bestiariusz Tolkienowski" Davida Day

Drużyna będzie czteroosobowa. W tej chwili skład prezentuje się następująco - elfka, człowiek, krasnolud i prawdopodobnie hobbit. Ze względu na to, że nie mieszkamy w tym samym mieście do komunikacji użyjemy Skype i - jak dobrze pójdzie oraz jeśli będę miał czas się przygotowywać - Roll20. Gramy na mechanice kc-towej, a nie na tabelach MERP-a.
Poniżej wklejam mapkę Śródziemia z oznaczonym miejscem startu drużyny - tak to ta mała kropka na wschód od Osgiliath. W miarę postępów kampanii postaram się dodawać kolejne punkciki i krótkie opisy wydarzeń jakie spotkają dzielnych poszukiwaczy przygód.

Życzcie nam wytrwałości i powodzenia w pokonywaniu przeszkód!

12 września 2016

Rysunek - Głowomeba

Dawno mnie tu nie było ale o miejscu nie zapomniałem. Głowomeba- wersja wstępna wielkości mniej- więcej 1/3 A4:
Wersja rozwojowa w formacie A4.

06 sierpnia 2015

Jak nie programować

Czasem bywa tak, że kod, który piszemy, nie jest najlepszej jakości. Wpływają na to różne czynniki - od braku czasu, braku umiejętności po wygodę i brak zastanowienia nad tym co się pisze.
Poniżej prezentuję przykład kodu wyciągniętego z jednego z projektów, w których brałem udział. Zaznaczam - jest to oryginalny kawałek metody z produkcyjnego kodu. Wyciąłem z niego zbędne wywołania do obiektów, aby zachować samo mięsko oraz dodałem odpowiednie formatowanie, aby było widać poziom zagnieżdżenia wywołań.
Próba poprawienia tego co się w tej metodzie działo była niezłym wyzwaniem. Ta pętla for z czterema zagnieżdżonymi pętlami jest po prostu tak niesamowita, że musiałem się nią pochwalić. I nie - nie jest to mój 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
for (){
 for (){
  if (){
   for (){
    if (){
     for (){
      if (){
       if (){
        tu sie cos dzieje
       } else {
        if (){
         tu sie cos dzieje
        }
       }
      }
      if (ogromny warunek na dwie linie){
       tu sie cos dzieje
      }
     }
    }
   }
  }
 }
 for (){
  if (){
   if (){
    if (){
     return true
    }
   }
  }
 }
}
return to co ustalono w mega for