Skocz do zawartości

Rekomendowane odpowiedzi

Opublikowano

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

Opublikowano

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ść".

Opublikowano

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

Opublikowano
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

Opublikowano

Wrzucaj na listę wszystkie aktualnie istniejące ściany boczne bloczków. Losuj, którąś z listy i dobudowuj do niej nowy bloczek. Ścianę tę usuń z listy, a wrzuć 3 nowe ściany nowego bloczka.

Opublikowano

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ł:)

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

  • Administratorzy
Opublikowano

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ł).

Opublikowano

E tam. Jak by już miały być prostokątne to pole powierzchnia raczej prościej można wyliczyć niż collision_rectangle(). Nie mam w sumie pojęcia jak byś chciał to zastosować.

Opublikowano

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.

Opublikowano

Muszę przyznać - sprytne.

Dobrze by było gdyby jeszcze nasz pytek odpowiedział w końcu jaką tą mapę chce. W przybliżeniu jak one mają wyglądać.

Opublikowano

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.

Opublikowano

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.

Opublikowano

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 ;)

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