Skocz do zawartości

Losowe generowanie mapy


ZyperPL

Rekomendowane odpowiedzi

Witam!

Ostatnio postanowiłem powrócić do Game Makera i dokończyć mój projekcik. Tylko oczywiście mam problem...

Nie wiem, czy to zaawansowany czy nie. Jednak napiszę już tutaj, ponieważ z GMem siedzę trochę dłużej.

 

 

Tak więc, jak napisałem w nazwie tematu chciałbym zrobić losowe generowanie mapy. Ale nie takie chaotyczne (bo takie, gdzie obiekty są byle gdzie to umiem zrobić) tylko takie, gdzie objekty będą poukładane w jakiejś logicznej kolejności.

Grafika top-down.

Chcę, żeby obiekty tworzyły losowe ściany i korytarze, ale tak, żeby można było tam przejść.

 

Proszę, żeby mi ktoś napisał jak to mniej więcej zrobić. Kody GML mile widziane (choć wystarczy mi to dokładnie opisać) :P

Odnośnik do komentarza
Udostępnij na innych stronach

Poukładaj sobie mapę z klocków na podłodze i zastanów się przy tym co tobą kieruje, że układasz tak, a nie inaczej. Nie ma na to uniwersalnego algorytmu. To zależy jak te twoje mapy mają wyglądać, jak ma być ta "logiczna kolejność".

Odnośnik do komentarza
Udostępnij na innych stronach

Heroes?

Jacy Heroes? Might and Magic? O ile pamiętam, nie było tam losowej mapy. Ale chodzi mi o to, żeby bloki ustawiały się w ściany. A nie jako pojedyńcze bloki. Jak to napisać? Można zrobić tak, że tworzy jeden blok i dokleja inne do niego. Ale jakie są na to polecenia, bo opuściłem się w GM :<?

@Platyna, no tak. Tylko raczej nie da się umysłu ludzkiego przepisać do gry. To trzeba jakoś znaleźć inny sposób, tak żeby wydawało się, że to losowe. Trochę nad tym myślałem i zrobiłem ten temat, żeby czegoś więcej się dowiedzieć, bo bez waszej pomocy na pewno tego nie zrobię :P

Odnośnik do komentarza
Udostępnij na innych stronach

Heroes?

Jacy Heroes? Might and Magic? O ile pamiętam, nie było tam losowej mapy.

heroes of might &magic <II.Losowanie bylo w edytorze map i tworzeniu mapy w potyczkach.

a co do tematu glownego: losuj rozmiar danego pokoju, utworz za pomoca tego sciany, znajdz przyklad w zasobach gmclanu na laczenie murow, a reszta analogicznie

Odnośnik do komentarza
Udostępnij na innych stronach

hmm może w ten sposób:

 

*cały room podzielony jest na grid powiedzmy 64x64

*wszystkie komórki wypełnione są obiektami solid(ściana 64x64)

*następnie po roomie zasuwa gumka- obiekt 64x64 który wycina korytarze, jej ruch trzeba dobrze zaprogramować aby wycinanka miała ręce i nogi.

*w większych komnatach tworzone są specjalne strefy, tzw komnaty

 

objekty będą poukładane w jakiejś logicznej kolejności.

Czyli? że np w komnacie(pomieszczeniu o jakimś tam rozmiarze ) która powstała po wycinance tworzysz cmentarz,->jakieś tam grobki-> sprawdzasz gdzie stworzył się cmentarz-> niedaleko stawiasz wrogów którzy żyją na cmentarzu-> jakieś przedmioty specjalne niedaleko wrogów cmentarnych

 

Analogicznie po wycinance możesz sprawdzić czy jest jakis większy obszar wolny-> stawiac tam obj drzewka etc; leśne żyjątka->leśnych wrogów->leśne skarby

W ten sposób mapka może być ciekawa i sensowna, jakby człowiek sam ją ręcznie składał:)

Odnośnik do komentarza
Udostępnij na innych stronach

hmm może w ten sposób:

 

*cały room podzielony jest na grid powiedzmy 64x64

*wszystkie komórki wypełnione są obiektami solid(ściana 64x64)

*następnie po roomie zasuwa gumka- obiekt 64x64 który wycina korytarze, jej ruch trzeba dobrze zaprogramować aby wycinanka miała ręce i nogi.

*w większych komnatach tworzone są specjalne strefy, tzw komnaty

 

 

Czyli? że np w komnacie(pomieszczeniu o jakimś tam rozmiarze ) która powstała po wycinance tworzysz cmentarz,->jakieś tam grobki-> sprawdzasz gdzie stworzył się cmentarz-> niedaleko stawiasz wrogów którzy żyją na cmentarzu-> jakieś przedmioty specjalne niedaleko wrogów cmentarnych

 

Analogicznie po wycinance możesz sprawdzić czy jest jakis większy obszar wolny-> stawiac tam obj drzewka etc; leśne żyjątka->leśnych wrogów->leśne skarby

W ten sposób mapka może być ciekawa i sensowna, jakby człowiek sam ją ręcznie składał:)

 

 

Bardzo dobrze mi to wytłumaczyłeś :)

Tylko jest jakiś prosty sposób na sprawdzanie wielkości pomieszczenia? distance_to_object chyba za bardzo nie pasuje.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ja bym stworzył gotowe większe kawałki korytarzy i pomieszczeń i układał je w całośc jak puzzle. Wtedy np. zawsze do danej strefy może być max. 4 wejscia (północ, południe, wschód, zachód), ale nie muszą - nie mniej ustawiając jeden losowy klocek na starcie który ma wejścia na górze i z prawej wiesz, że z lewej i na dole musisz ustawić fragment mapy który wejśc z tej strony mieć nie będzie. To raptem 4 instrukcje if ;)

 

Ew. algorytmy na znajdywanie drogi które są w GM, mogą posłużyć za rysowanie korytarzy pomiędzy takimi pomieszczeniami (wtedy gdy np. masz każdy blok wielkości 200x200 pikseli, wcale nie muszą być one ułożone w siatce tej wielkości - mogą być na różnych wysokościach, żeby korytarz trochę skręcał).

Odnośnik do komentarza
Udostępnij na innych stronach

Ja bym skrobnął takie coś:

OBRAZEK

 

1. tworzysz ds map grida z wylosowanymi w nim zapełnionymi polami

2. losujesz jakieś punkty które nie będą nachodzić na te pola. ( będą to końcówki korytarzy )

3. Algorytmem A* ( motion planning w GM ) łączysz każdy punkt z każdym tak by omijały kwadraty ( tworzysz osobne pathy )

4. wywalasz kwadraty

5. teraz wypełniasz naokoło pathów puste miejsca ścianami.

6. pathy usuwasz.

 

Tak były by tworzone korytarze a pokoje to możesz np utworzyć dokładnie w tych czerwonych punktach.

Odnośnik do komentarza
Udostępnij na innych stronach

No, tylko co dokładniej mam Ci powiedzieć ;) Pisałem top-down i korytarze, więc przepraszam, że mogło być to do końca nie jasne.

http://img843.imageshack.us/img843/9269/ma...owageneracj.png

Chodzi o coś mniej więcej rogulelike. Ale nie tak zaawansowane. Same korytarze wystarczą.

 

Pomysł LunderLorda* i alwina świetny. Wielkie dzięki również Platynie za pomoc. Ciekaw jestem, czy coś zrobię i czy nie pozapominałem komend (z tym motion planing to masakra).

Jak zrobić, żeby pathe powstawały po kątach prostych (90*), bo to nie było tak, że zawsze leciało bardziej płynnie?

 

Może ktoś trochę zarzuci komendami? :S

 

@Dół:

Nie przekręciłem. Po prostu zły klawisz wcisnąłem. Sorka.

Odnośnik do komentarza
Udostępnij na innych stronach

Może przydać nam się jakaś funkcja co przyjmuje jako argumenty liczby a i n i zwraca losową liczbę z przedziału <n-a;n+a> w taki sposób by te najbliżej n miały największe szanse na wylosowanie. Funkcja powinna wyglądać jakoś tak:

GML (Skrypt quotlosujquot)
a=argument0;

n=argument1;

l=sqr(random(sqrt(a)));

l=n+(sign(random(2)-1)*l);

return l;

Jeśli się nie pomyliłem to powinno działać. Nie sprawdzałem. :)

 

Teraz możesz przy jej pomocy losować sobie ilość komnat, ich szerokości i wysokości mając jakąś wartość n która chcesz by wypadał najczęściej.

Zwraca liczby rzeczywiste jakby co. Możesz sobie je dodatkowo zaokrąglić jak chcesz.

Odnośnik do komentarza
Udostępnij na innych stronach

Ehh.. Chyba tego nie ogarniam, co napisał HuderLord. Trzeba robić jeden path, czy do każdego połączenia nowy? I.. i... jak wykrywać czy block koliduje z pathem? Ehh.. przerasta mnie to.

 

Chyba użyję sposobu alwina. IMHO łatwiejszy :<

 

Dawno nie siedziałem z GM, więc teraz trudno mi się myśli :|

 

Sory, i dzięki ;)

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