Skocz do zawartości

Generator podziemii


Rekomendowane odpowiedzi

Generatory to potężne narzędzia, pozwalające na ułatwienie życia designerowi (do pewnego stopnia - projektant musi zdecydować, jak dane obiekty mają być generowane). Ten generator ma za zadanie stworzyć, na podstawie zdefiniowanych przez użytkownika parametrów, coś na kształt poziomu do gry. Wychodzi mu to nieźle, wg mnie, więc szkoda by było, gdybym się tym z nikim nie podzielił.

Zatem, proszę. LINK

 

scr1.png

Generator ma następujące opcje:

a ) Modyfikacja metody działania algorytmu generowania pierwotnego szumu

Zanim wyjaśnię, przejrzyjcie artykuł o zastosowanym algorytmie generowania szumu. Iteration flags oznacza, które iteracje zostaną wykonane - tzn. dla liczby 27 (011011) zostaną wykonane iteracje 1, 2, 4, 5 - to spowoduje, że szum będzie miększy, a mapa - bardziej gładka. Im większa mapa, tym więcej iteracji - ilość iteracji rośnie logarytmicznie do większego z rozmiarów mapy (dla mapy 80x64 log2(80)=6.32<=7, zatem zostanie wykonanych 7 iteracji). Iteration amplification start pokazuje, jak duży wpływ będzie miała pierwsza iteracja, a iteration amplification speed - jak duży wpływ będą miały kolejne iteracje.

b ) Tworzenie losowych bąbli

Bąble można sobie wyobrazić jako łagodne pagórki (lub strome, zależnie od blob intensity). Można regulować ich liczbę (blob number) i ich rozmiar (blob radius - promień każdego bąbla mieści się w przedziale od blob_radius/2 do blob_radius).

c ) Tworzenie pierścienia

Pierścień powoduje stworzenie doliny lub wzniesienia na środku. Zależnie od ring radius, pierścień będzie obejmował całą mapę (1), nic (0), lub pewien fragment (wartości pośrednie). Wysoki ring inner intensity stworzy wzniesienie, a wysoki ring outer intensity - dolinę. Uwaga - liczy się różnica między ring inner a ring outer, nie ich absolutne wartości.

d ) Tworzenie linii (korytarzy)

Linie można sobie wyobrażać jako coś na kształt bruzdy - im większe line intensity, tym większa szansa, że w tym miejscu będzie podłoga. Można modyfikować ilość linii (line number) i ich szerokość (line width).

e ) Tworzenie ściany zewnętrznej

Ściana zewnętrzna to użyteczny modyfikator, który zamyka teren naokoło mapy. Od border intensity zależy, jak duże szanse są na powstanie ściany, a od border inner edge i border outer edge zależy grubość ściany. (UWAGA: w tej chwili jest bug powodujący, że zmiana outer edge nie działa tak, jak powinna - niewielki problem, bo i tak zwykle jest na wartości 1, ale na razie nie zmieniać)

f ) Zmiana wielkości mapy

Niby nic, a cieszy.

scr2.png

g ) Modyfikacja progu tworzenia ścian

Dzięki tej opcji, niezależnie od jakości szumu, powstała mapa zawsze będzie zawierała zdefiniowany przez bias floor percentage procent pól będących podłogą (bierze pod uwagę jedynie szum, modyfikacja mapy może spowodować, że mniejszy procent pól będzie podłogą). Bias randomization to parametr definiujący, jak mocno krawędzie ścian będą poszarpane (zależnie od kontrastu szumu, ten parametr powinien być mały lub całkiem spory - domyśnie 0).

h ) Usuwanie dziur w ścianach

Ustawienie holes removal na Y spowoduje, że zostaną zlikwidowane wszystkie dziury, których wielkość jest nie większa niż holes minimum size. Dla algorytmu dziurą jest każde pole, które jest podłogą, a rozmiarem dziury - ilość wszystkich pól, do których można dotrzeć z danego pola bez przechodzenia przez ściany. (Holes diagonal check oznacza, że pola, które sąsiadują z dziurą jedynie po przekątnej również są dołączane do dziury)

 

Pozostałe opcje są jedynie pomocnicze:

Generate from current noise wczytuje ponownie mapę z wygenerowanego wcześniej szumu, wykorzystując parametry z punktów g) i h)

Save/Load preset pozwala na zapisanie/wczytanie ustawień modyfikowanych w programie, aby móc z nich generować własne mapy

Save map zapisuje mapę do pliku, jeżeli masz chęć wykorzystać wygenerowaną mapę w swojej grze. Odczyt wykonuje się za pomocą funkcji file_to_map, znajdującej się w projekcie. Ściana to 0, podłoga to 1. Mapa jest wczytana do ds_grid.

 

Sterowanie:

Spacja - generuj nową mapę

Shift - przełączaj pomiędzy widokiem minimapy (noise/map)

Ctrl - przełączaj pomiędzy trybem interfejsu (pre-processing, post-processing)

Strzałki - zmiana pozycji widoku

 

To chyba tyle póki co. Projekt jest w wersji 1.0, na razie nie mam ochoty tego ulepszać : P

Odnośnik do komentarza
Udostępnij na innych stronach

GML
___________________________________________

################################################################################

############

FATAL ERROR in

action number 1

of Mouse Event for Glob Left Pressed

for object tiledrawer:

 

make_color_hsv argument 3 incorrect type (5) expecting a Number (YYGI32)

at gml_Script_noise_to_surface (line 9) - draw_point_color(i,j,make_color_hsv(0,0,ngr[# i,j]));

################################################################################

############

--------------------------------------------------------------------------------------------

stack frame is

gml_Script_noise_to_surface (line 9)

called from - gml_Object_tiledrawer_GlobalLeftButtonPressed_1 (line 44) - sf=noise_to_surface(ng);

 

Po wgraniu pliku z presetem i kliknięciem na coś tam

 

 

Wiesz co mógłbyś jeszcze dodać? Opcję centrowania mapy w post proc oraz opcję która by usuwała wszystkie jaskinie niezależne które są duże tak by została 1. Jest usuwanie małych plam ale nadal mogą się zrobić 2 porównywalnie duże które nie mają ze sobą połączenia. Możliwość ich połączenia lub usunięcia mniejszej było by dobrym pomysłem.

Odnośnik do komentarza
Udostępnij na innych stronach

No tak, ale nie bardzo rozumiem, czym, i gdzie, miałby być "środek planszy". Mój generator dla map o wymiarach nie będących tymi samymi potęgami dwójki bierze wycinek szumu z najmniejszego kwadratu większego od mapy, z samego środka, i dopiero na nim wykonuje wszystkie operacje.

Chodzi o bounding box mapy? Takie coś też dałoby się zrobić, ale czy jest potrzeba?

 

Zrobiłem już łączenie jaskiń, niedługo wystawię kolejną wersję.

Odnośnik do komentarza
Udostępnij na innych stronach

Nowa wersja (oznaczmy ją 1.1), a w niej:

-Dodane: opcja łączenia ze sobą dziur korytarzami o wybranej szerokości. Metoda póki co prymitywna - łączone są ze sobą środki dziur, co nie zawsze oznacza, że dziury zostaną połączone.

-Dodane: preset small_closed_mountain (jak wam się poszczęści, to zobaczycie w nim problemy tej metody łączenia dziur)

-Naprawione: błąd związany ze zmianą rozdzielczości mapy przed jej wygenerowaniem, co powodowało problemy z ponownym generowaniem mapy z istniejącego szumu

-Naprawione: Opcja holes diagonal check nie pokazuje już swojej liczbowej wartości

-Wczytanie starszych presetów nie wywoła błędów

W planach:

-Dodanie kompatybilności presetów

-Ulepszenie metody łączenia dziur ze sobą

-Dodanie pomieszczeń (na poziomie mapy)

LINK

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...