Author Topic: Tworzenie map - instrukcja  (Read 9523 times)

Offline troll

  • Administrator
  • Hero Member
  • *****
  • Posts: 654
    • View Profile
Tworzenie map - instrukcja
« on: November 14, 2012, 06:33:36 PM »
Jak to działa
Mapy w Gizarmie tworzy się przy pomocy programów wywołowanych z linii poleceń. Nie ma tu żadnego edytora WYSWIG. Mapę definiuje się poprzez dostarczenie odpowiednich pngów, które określają parametry mapy. Być może brak graficznego edytora może stanowić na początku trudność, ale dzięki temu, że generator jest sterowany grafiką można łatwo obrabiać mapy za pomocą swojego ulubionego edytora grafiki rastrowej (GIMP, Photoshop, Paint.net ...). Można również łatwo modyfikować mapy, w momencie gdy wychodzi kolejna wersja Gizarmy wymagająca map nowego typu.

Tworzenie mapy składa się z 2 etapów:
  • Generacji podziału na regiony
  • Kompilacji mapy z map klimatycznych

Tutaj można zobaczyć proces tworzenia mapy na schemacie blokowym. Oczywiście większość grafik jest już dostarczona przeze minie i nie trzeba się nimi przejmować.

Co należy przygotować:

1. Mapę obszaru zajmowanego przez regiony, nieprzekraczalne granice dla regionów (np. rzeki i brzegi lądów)


Kolory:
  • czarny #000000 - obszar na którym regiony się nie znajdą
  • biały #FFFFFF - obszar dla regionów
  • niebieski #0000FF - granicę nieprzkraczalne dla regionów. Granice powinny być cienkimi liniami

Przykład

2. Mapa lądów, mórz i rzek.

Kolory:
  • jasno-niebieski #00FFFF - morze
  • zielony #00FF00 - ląd
  • rzeki #0000FF - rzeki. Powinny odpowiadać obszarowi który zajmują narysowane rzeki

przykład

3. Mapy klimatu:
Mapy klimatu to obrazki. Użyte kolory to odcienie szarości. Każda mapa definiuje dany parametr, kolor czarny reprezentuje niską wartość parametru, biały wysoką

Przykłady:

4. Mapy zasobów specjalnych
Są to obrazki w skali szarości. Każda mapa określa rozkład danego zasobu. Kolor #FFFFFF odpowiada 20% szansie pojawienia się zasobu, #000000 oznacza, że dany zasób napewno się nie pojawi. Oczywiście żeby teren z zasobem specjalnym się pojawił teren bazowy musi się zgadzać. Przykładowo wieloryb nigdy nie pojawi się w górach.

Wymagane mapy dla:
  • wieloryby (przykład)
  • sól
  • kamienie szlachetne
  • drewno szlachetne
  • słonie

5. Rysowana nakładka
Wszystko co znajdzie się na tym obrazku zostanie naniesione na wygenerowane tło mapy. Z tego powodu tło obrazka musi być przeźroczyste. Na tym obrazku narysowane są granicę lądu i oceanu oraz rzeki.

Tak naprawdę można tu narysować cokolwiek, ponieważ kompilator nie analizuje tego obrazka

przykład

Uwaga: wszystkie obrazki muszą być tego samego rozmiaru i być zapisane w 32 bitowym png z kanałem alfa.

Jak zrobić mapę krok po kroku:

1. Generujemy mapę regionów

Po sciągnięciu i rozpakowaniu programu Bakterie kopiujemy do katalogu input mapę [1], nazywamy ją sandbox.png. Następnie uruchamiamy program wpisując z linii poleceń

Code: [Select]
java -jar bakterie.jar
jeżeli w trakcie wykonania programu otrzymujemy MemoryException musimy zwiększyć limit pamięci dla programu poprzez dodanie odpowiedniego parametru. Aby zwiększyć limit np. do 1000M dodajemy:

Code: [Select]
java -jar bakterie.jar -Xmx1000M
Jeżeli wszystko pójdzie dobrze po zakończeniu pracy programu w katalogu output powinien znajdować się plik region.png zawierający podział na regiony. Przykładowy obraz wynikowy.

Uwagi:
  • Wygenerowane regiony są prawidłowe w około 99%. Przy próbie użycia ich w kompilatorze map bardzo prawdopodobne jest, że część regionów trzeba będzie poprawić ręcznie.
  • Program dla dużych map działa bardzo wolno. Przykładowo podział dla mapy Europy wykonywał się ponad 4 godziny na procesorze i5

2. Kompilujemy mapę

Najpierw należy ściągnąć i rozpakować kompilator map. Po rozpakowaniu w katalogu głównym powinien znajdować się plik kompilator-map.jar, katalogi input/map w którym znajduje się konfiguracja oraz output/map gdzie znajdzie się gotowa mapa. W projekcie input/map znajdować się gotowy projekt, żeby sprawdzić, czy wszystko działa poprawnie można uruchomić kompilator. Należy to zrobić z linii poleceń, ważne jest, żeby mieć dostęp do generowanych logów. Robimy to poleceniem ewentualnie dodając -Xmx...

Code: [Select]
java -jar kompilator-map.jar
Żeby stworzyć własną mapę należy podmienić pliki w katalogu input/map/
  • region.png - wynik podziału na regiony z poprzedniego kroku
  • w katalogu climate wszystkie mapy klimatyczne
  • w katalogu resource wszystkie mapy występowania zasobów specjalnych
  • land.png - mapa [2]
  • drawing.png - mapa [5]

Podczas kompilacji może się zdarzyć, że rozkład regionów który otrzymaliśmy podczas generacji będzie nieprawidłowy:
  • Region może być za mały
  • Może być za duży
  • Może być za długi / wysoki (powyżej 128px)
  • Może być za cienki
  • Może być mieć zbyt wielu sąsiadów (maksymalnie może mieć 8 )

Kompilator powinien podpowiedzieć położenie nieprawidłowego regionu w logach. Jeżeli będą z tym problemy postaram się opisać to lepiej.

3. Podgląd wygenerowanej mapy

W katalogu output/map/log znajdują się między innymi następujące pliki:
  • bg.png - zrzut tła mapy
  • stones.png - zrzut spritów terenu początkowego
  • stonesForest.png - zrzut spritów terenu maksymalnie zalesionego
  • stonesNoForest.png - zrzut spritów terenu z usuniętym lasem

Nakładka graficzna [5]
Jak narysować brzeg
Są na to dwa sposoby:

  • Poskładać z gotowych fragmentów. Fragment brzegu można powycinać z tego obrazka: kontur mapy xkcd
  • Poprzez użycie tekstury. Po wypełnieniu całego obszaru mapy teksturą, zaznaczamy obszar przyszłego lądu. Czyścimy zaznaczony obszar. Następnie rozszerzamy zaznaczenie o 8 pikseli, odwracamy je i znowu czyścimy. Potem trzeba jeszcze obrysować czarnym pędzelkiem krawędź lądów.

Jak narysować rzeki
Do tej pory zawsze składałem je z gotowych elementów. Fragmenty rzek na tym obrazku są powiększone 0 300% (żeby łatwiej je modyfikować).
« Last Edit: March 20, 2013, 10:32:59 PM by troll »

Offline mike

  • Newbie
  • *
  • Posts: 39
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #1 on: November 20, 2012, 09:22:31 PM »
A jaki jest minimalny rozmiar mapy? Mam słabego kompa, ale pomimo tego chciałbym coś potestować. Myślę nawet o napisaniu prostego generatora map w C#. W przeszłości napisałem sporo różnych prostych aplikacji obrabiających grafikę oraz steganograficznych więc myślę, że nie byłoby problemu napisać jakiś prosty generator.

EDIT: Ciekawie ten program bakterie działa ;)
« Last Edit: November 20, 2012, 09:37:18 PM by mike »

Offline troll

  • Administrator
  • Hero Member
  • *****
  • Posts: 654
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #2 on: November 20, 2012, 10:17:50 PM »
Można założyć, że minimalny rozmiar to rozmiar mapy taki jak w przykładowym projekcie :). Prawdopodobnie da się jeszcze mniejszą, ale nie sprawdzałem tego.

Troll

Offline mike

  • Newbie
  • *
  • Posts: 39
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #3 on: November 20, 2012, 10:33:37 PM »
Na początek postaram się zrobić taki program, który po kolei odpala procesy i przenosi pliki we właściwe miejsca.

Offline troll

  • Administrator
  • Hero Member
  • *****
  • Posts: 654
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #4 on: November 20, 2012, 10:48:46 PM »
To niekoniecznie wyjdzie. Generator podziału na regiony jest skuteczny w 99%, to znaczy niektóre regiony są wadliwe i trzeba je poprawiać ręcznie (napisałem zresztą o tym w instrukcji). Nie działa to w pełni automatycznie.

Jeżeli chcesz z tym poeksperymentować proponuje zrobić własną mapę, wtedy zobaczysz co można tam poprawić :).

Troll

Offline mike

  • Newbie
  • *
  • Posts: 39
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #5 on: November 20, 2012, 10:56:19 PM »
Okey poeksperymentuje i zobaczę jak to wszystko wygląda. Może niekoniecznie trzeba ręcznie poprawiać, pewnie można byłoby znaleźć jakiś sposób na automatyczne poprawianie.

Offline troll

  • Administrator
  • Hero Member
  • *****
  • Posts: 654
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #6 on: November 20, 2012, 11:04:01 PM »
Jeżeli jesteś w stanie coś takiego wymyślić - to było by bardzo fajnie. Mnie się do tej pory nie udało.

Z drugiej strony jest to dość trudne zadanie, bo takie anomalne regiony powstają najczęściej w okolicach brzegów o skomplikowanej strukturze. Bardzo ciężko jest naprawić taki region nawet ręcznie, nieraz trzeba nagiąć trochę reguły generacji (np. pozwolić, żeby region był częściowo przecięty przez rzekę), lub podjąć decyzje o usunięciu fragmentu lądu (np. małej wysepki). Trudno by było podejmować takie decyzje automatycznie.

Offline mike

  • Newbie
  • *
  • Posts: 39
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #7 on: November 20, 2012, 11:38:49 PM »
Zastanawia mnie jakie warunki musi spełnić region by być uznany za poprawny?
Jaką musi mieć powierzchnie, min/max szerokość i wysokość w px?

Offline troll

  • Administrator
  • Hero Member
  • *****
  • Posts: 654
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #8 on: November 20, 2012, 11:47:44 PM »
  • Region może być za mały
  • Może być za duży
  • Może być za długi / wysoki (powyżej 128px)
  • Może być za cienki
  • Może być mieć zbyt wielu sąsiadów (maksymalnie może mieć 8 )

Kompilator map powinien napisać w logu co jest nie tak z regionami.

Jeszcze jedna sprawa, nie wiem co chcesz robić, ale jeżeli chciałbyś utworzyć nową mapę, to mogę dorzucić materiały graficzne, które na pewno by ci się przydały.
« Last Edit: November 20, 2012, 11:49:25 PM by troll »

Offline mike

  • Newbie
  • *
  • Posts: 39
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #9 on: November 21, 2012, 12:19:37 PM »
Trochę dziwnie działa ten program bakterie ;) Gdy wrzuciłem jako plik wejściowy cały biały plik PNG nie zadziałał. Zrobiłem cienką czarną ramkę też nie działał. Potem zrobiłem dość grubą też nie udało się wystartować. Dopiero przy bardzo grubej ramce zadziałał.

Mój pomysł na generator wygląda tak:
1) tworze plik PNG z dużą czarną ramką. W środku biały kwadrat. Rezygnuje z niebieskich linii (zauważyłem, że tak stworzona mapa zawsze się kompiluje),
2) uruchamiam program bakterie.jar,
3) w pliku wynikowym region.png usuwam (zamalowuje na biało) regiony graniczące z ramką, żeby mapa nie była kwadratowa,
4) uruchamiam algorytm określający co jest lądem a co morzem.
5) nanoszę rzeki (które przebiegać będą na łączeniach pól),
6) tworze mapy wilgotności, żyzności itd.
7) obrysowuje brzegi,
8) kompilacja.


Napisz co o tym myślisz.
« Last Edit: November 21, 2012, 12:46:38 PM by mike »

Offline troll

  • Administrator
  • Hero Member
  • *****
  • Posts: 654
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #10 on: November 21, 2012, 03:22:04 PM »
Generator wymaga sporego marginesu, kompilator pewnie też. Mało to eleganckie, ale nie sprawia, że nie da się tego użyć.

Pomysł ciekawy, można wypróbować. Jakie będą problemy:
  • Nie będzie się dało robić mapek realistycznych (np. Europy) z dużą dokładnością. Linia brzegowa będzie w dużym stopniu zależna od rozkładu regionów
  • Nie jestem pewien, czy rzeki zrobione w ten sposób będą ładnie wyglądać
  • Tak samo z linią brzegową - będzie prawdopodobnie bardzo poszarpana. Nie wszystkie brzegi mórz to norweskie fiordy, w przyrodzie często zdarza się, że linia brzegowa jest w miarę gładka.
  • Jeżeli ma być zachowany styl graficzny mapek (a wolałbym, żeby był) to narysowanie brzegu przy zadanym konturze jest względnie łatwe (robiłem już coś takiego w photoshopie)
  • O wiele większym wyzwaniem będą rzeki. Trudno będzie je narysować, prawdopodobnie będzie trzeba jakiś programik do czegoś takiego napisać

Offline troll

  • Administrator
  • Hero Member
  • *****
  • Posts: 654
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #11 on: November 22, 2012, 11:34:42 PM »
Dodałem trochę materiałów dotyczących tworzenia nakładki graficznej dla mapy

Troll

Offline liosan

  • Administrator
  • Hero Member
  • *****
  • Posts: 585
  • Kataj
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #12 on: November 29, 2012, 02:20:50 PM »
Byłoby miło, gdyby program bakterie rzucając wyjątek dawał tyle informacji, żeby dało się zdebugować problem...

Code: [Select]
Exception in thread "main" java.lang.IllegalArgumentException: Color parameter outside of expected range: Blue
        at java.awt.Color.testColorValueRange(Unknown Source)
        at java.awt.Color.<init>(Unknown Source)
        at java.awt.Color.<init>(Unknown Source)
        at Bakterie.genPng(Bakterie.java:672)
        at Bakterie.licz(Bakterie.java:764)
        at Bakterie.main(Bakterie.java:865)
No i super. Ale gdzie jest ten zły pixel i jaki tam jest kolor, to już nie wiadomo...

EDIT: Znalazłem całą chmarę takich pixelków, naprawiłem... i znowu to samo. Po pół godzinie liczenia... albo napiszę skrypt który to naprawia, albo nie wiem co :)

Liosan
« Last Edit: November 29, 2012, 03:24:26 PM by liosan »

Offline troll

  • Administrator
  • Hero Member
  • *****
  • Posts: 654
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #13 on: November 29, 2012, 04:29:20 PM »
Nie będę ukrywał - bakterie napisane są w sposób mało koszerny delikatnie mówiąc :). W kodzie jest duży bałagan, błędy obsługiwane jak widzisz.

Postaram się w najbliższym czasie dopisać walidacje inputu. Jeżeli nie masz pojęcia co się tam dzieje, to prześlij mi swój input postaram ci się go wieczorem zdebugować (np. na email)

pozdrawiam
Troll

Offline hydro

  • developer
  • Administrator
  • Sr. Member
  • *****
  • Posts: 496
    • View Profile
Re: Tworzenie map - instrukcja
« Reply #14 on: December 03, 2012, 04:25:47 PM »
Jednak robię próbę z mapą, bo dzięki temu że bakterie i kompilator działają wsadowo, a nie trzeba przy nich na bieżąco działać w trybie graficznym, to mogę uruchamiać je na mocniejszym komputerze i czekać na wyniki. Teraz w weekend udało mi się tę metodę wypróbować; na plikach testowych wszystko działa dobrze :-)

Mam natomiast pytanie: orientacyjnie jaki limit pamięci trzeba by było przydzielać Javie na uruchomienie "bakterii" z sandboxem o wymiarach 5001 x 4134 pikseli ?

Trochę trudno mi to przewidzieć, a moje eksperymenty na razie kończyły się jak na załączonym screenie.  I na razie nie wiem, czy to problem na linii system-Java (tam jest słabo mi znany system SBS 2008; prawie windows, ale niektóre rzeczy działają inaczej), czy z samym systemem i jego sposobem użycia pamięci (której fizycznie ma 4 razy więcej niż mój komputer), czy też w moim pliku jest jakiś problem powodujący nadmierne zużycie pamięci.