Skocz do zawartości

Łączenie room'ów w jeden (nieskończona mapa)


MetalowyNerd

Rekomendowane odpowiedzi

Witam. Już jakiś czas programuję w GameMaker: Studio, jednak ciągle się uczę i poznaje nowe rzeczy, jak na przykład choose(a,b,c), to poznałem dziś. Do rzeczy xD, bo zbaczam z tematu xd. Nie mam pojęcia, jak zrobić nieskończony teren. W takim sensie, że gracz idzie na przykład bez przerwy w prawo i co jakiś czas tworzy się po prawej nowy room, z tym, że dołączany jest on do aktualnego room'u, a room'y poza zasięgiem widoku, są wyłączane i zapisywane.

 

Załóżmy, że gracz startuje w room'ie o nazwie rm_gra, w którym jest jakiś losowy generator przedmiotów na mapie. Gdy dojdzie do którejś z krawędzi rm_gra, tworzy się na pustej przestrzeni drugi rm_gra z tym samym losowym generatorem przedmiotów i tak bez końca. Nie chodzi mi o to, żeby po dojściu do końca mapy, przenosiło mnie na początek tej samej, tylko żeby tworzyło zupełnie nową. Jak taki motyw wykonać? Szukam po całym necie, (tak, po angielsku głównie), ale nie mogę znaleźć. Filmiki z YouTube'a, przedstawiające Minecraft'a 2D nie bardzo mi pomagają, dlatego proszę doświadczonych o pomoc.

 

Dziękuję bardzo za uwagę i czekam na jakiś support.

Odnośnik do komentarza
Udostępnij na innych stronach

Prosisz o coś trudnego do zaimplementowania, zwłaszcza w GameMakerze. Na początek powinieneś wiedzieć, jak zrobić coś takiego w ograniczonej przestrzeni.

Z tego co rozumiem, chcesz wersję w 2D. Przeczytaj najpierw uważnie ten artykuł o Perlin Noise. Tam jest zastosowana siatka 64x64, ale taka sama zasada jest dla siatki 64x1 (w praktycznym sensie: zwykła tablica jednowymiarowa*) i taką też siatkę sobie przyjmiemy.

 

Perlin Noise to obrazek utworzony przez nałożenie na siebie n oktaw (w artykule to te sześć czarno-niebieskich rozmytych obrazków). Przyjmiemy n=5. Z natury ograniczenia rozmiaru obrazka, sam obrazek nie jest nieskończony. Można natomiast, korzystając z danych nt powstałych oktaw, otrzymać bezszwowe połączenie do następnego obrazka 64x1.

 

Metoda działa następująco:

1) Tworzysz pierwszy obrazek:

1-) Ustawiasz set_texture_interpolation(1) (czy jakoś tak)

1a) Tworzysz surface 64x1 (S)

1b) Tworzysz pięć oktaw (O1-O5) o rozmiarach odpowiednio (możesz w pętli): 4x1, 8x1, 16x1, 32x1, 64x1. Każda oktawa to osobny surface - najpierw zamalowujesz go na czarno, a następnie zamalowujesz go białymi pikselami, przy czym dla każdego piksela ustawiasz losową alphę z zakresu od 0 do X (proponuję za X ustawić 0.4)

1c) Rysujesz każdą z oktaw O1-O5 na S, przy czym:

-blending podczas rysowania musi być ustawiony na bm_add (funkcją draw_set_blend_mode)

-każda z oktaw musi być rozciągnięta na całym S (użyj draw_surface_stretched)

-po skończeniu rysowania oktaw, ustawiasz blending na bm_normal

1-) Ustawiasz set_texture_interpolation(0)

 

2) Kiedy tylko chcesz wygenerować sąsiedni chunk, musisz wykonać następujące kroki:

2a) Tworzysz nowy surface 64x1 (Snew)

2b) Tworzysz nowe pięć oktaw (Onew1-Onew5), tak jak wyżej

2c) (NAJWAŻNIEJSZE) Ustawiasz brzegowe piksele oktaw, aby ładnie się zszywały z sąsiednim chunkiem. Ten krok zależy od tego, po której stronie nowego chunka leży sąsiedni chunk:

-Jeżeli po lewej: Pierwszy piksel (od lewej) każdej z nowej oktawy jest ostatnim pikselem (czyli od prawej) każdej oktawy sąsiada

-Jeżeli po prawej: Ostatni piksel (od prawej) każdej z nowej oktawy jest pierwszym pikselem (czyli od lewej) każdej oktawy sąsiada

2d) jest jak 1c), ale z nowymi surface'ami.

 

To jest pierwsza część. Jest jeszcze dużo do zrobienia, ale to wyżej to właściwie całe generowanie terenu. Jeżeli załapałeś, daj znać, bo nie wiem, czy mam dalej tłumaczyć.

 

PS. Mam coś podobnego, ale dla obrazków NxN. Większość kodu to tworzenie grywalnej mapy, ale jest tam, w środku gdzieś, generowanie Perlin Noise.

 

*tablice w GM są do kitu, lepiej używać ds_list()

Odnośnik do komentarza
Udostępnij na innych stronach

Po części rozumiem Amaterasu, ale mam już powiedzmy "bloki" terenu, które są nakładane na mapę, a nie wiem, czy się do końca rozumiemy, bo mi chodzi o to, żeby room powiększał się o dodany nowy room do aktualnego, nie chodzi mi o generowanie nieskończonej tekstury terenu, tylko o samo "powiększanie" się room'a. Na razie kombinuję z tutorialami na YouTube, może uda mi się to zrobić, ale myślałem, że ktoś mi zaraz poda kilka funkcji, czy jakiś fragment kodu, który dodaje nowego room'a do aktualnego, a tu widzę, że temat konkretny. Tak, brakuje mi doświadczenia, ale to nie znaczy, że mam nie próbować ;).

Odnośnik do komentarza
Udostępnij na innych stronach

Z roomu 1 do roomu 2 nie przechodzi się gładko. Przy każdym przejściu do kolejnego roomu usuwane są obiekty z roomu 1 (o ile room 1 nie jest persistent), tworzone są obiekty z roomu 2 (o ile wcześniej w nim nie byłeś i nie ma zaznaczonego persistent), wszystkie te operacje kosztują trochę procesora. W dodatku, do danych obiektów z roomu 2 nie masz żadnego dostępu, jeżeli jesteś w roomie 1. Rozszerzanie roomów jest możliwe, ale jak dokumentacja wskazuje:

(...) you can change (or set) the width of any room in your game except the current one

zatem żeby zmienić szerokość danego roomu, nie może być to room aktywny.

Te limity są kompletnie bez sensu, gdy ma się do czynienia z grami proceduralnymi z otwartym światem (jak ta, którą chcesz zrobić). Dlatego, aby zrobić taką grę proceduralną, należy odejść od koncepcji roomów.

 

(tzn. nie mówię, że kompletnie się nie da tego zrobić, ale trzeba się bardzo, bardzo natrudzić - taki to urok proceduralnego generowania)

Odnośnik do komentarza
Udostępnij na innych stronach

ediepl, :blink: , ale jestem głupi... Jakie to było oczywiste, rozwiązanie było tak blisko :thumbsup: . Dzięki, że mi otworzyłeś oczy, bo rozwiązanie miałem przed nosem xD. To chyba najlepsze wyjście, jak mogłem o tym nie pomyśleć xD. Dzięki wielkie, popróbuję tą drogą ;).

 

Amaterasu, fakt, bezsensowne ograniczenia, ale na razie mam sposób do wypróbowania, będę działał na jednym room'ie, tak, jak mi poradził ediepl, a obiektom poza widokiem będę ustawiał visible na false :). Ta opcja na prawdę wygląda obiecująco, jak mogłem o tym nie pomyśleć xD.

 

Na razie dziękuję Wam wszystkim za pomoc i zainteresowanie się moim problemem. Obczaję, czy mi to wyjdzie i jak ;).

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ę...