Skocz do zawartości

Losowe wolne miejsce GM:Studio


Ignatus

Rekomendowane odpowiedzi

Witam.Mam prosty problem z którym walczę od kilku dni i póki co zero efektów

 

Zrobiłem prymitywny losowy generator mapy, problem polega na tym żeby losowe elementy mapy pojawiały się tylko i wyłącznie na pustych miejscach, nie kolidowały ze sobą.Wydaje się banalne, ale coś nie mogę tego rozgryźć

 

Pokaże na przykładzie samych ścian(bo później losowane są też inne elementy, ale nawet same ściany bardzo często nachodzą na siebie)

 

Create:

GML
liczba_scian=irandom(25)

 

 

if (instance_number(obj_sciana)<=liczba_scian){ //sciany

repeat(liczba_scian){

 

xx = irandom_range(61,960);

yy = irandom_range(160,630)

if (place_empty(xx,yy)){ instance_create(xx,yy,obj_map);

 

}}}

 

To oczywiście nie jedyny wariant jakie próbowałem, chciałem też wykorzystać pętle IF (zero różnicy) oraz DO UNTIL- tutaj po prostu zawiecha

 

Nie wiem jak się do tego zabrać.

 

Pokój jest fizyczny i wszystko jest oparte na Physics - nie wiem czy ma to w tym przypadku znaczenie

Odnośnik do komentarza
Udostępnij na innych stronach

Twój kod sprawdza tylko jeden punkt. Jeżeli sciana ma być tworzona jeden piksel obok istniejącej, to ściany zaczną na siebie nachodzić. Lepiej sprawdzać z pomocą collision_rectangle(.............),

GML
if(collsion_rectangle(xx-10,yy-10,xx+10,yy+10,.....))

instance_create(xx,yy,obj_sciana)

Zakładam, że origin jest ustawiony na center oraz szerokość i wysokosć sprite to 20. Pokombinuj i pisz co wyszło.

Odnośnik do komentarza
Udostępnij na innych stronach

Moim zdaniem lepiej by było jakbyś to robił na ds_grid, zamiast sprawdzać każdy piksel :/ Tak to musiałbyś sprawdzać czy miejsce jest puste - czyli także czy jak tam postawi kawałek ściany nie najdzie na drugą itp. więc de facto musiałbyś piksel po pikselu to robić...

Odnośnik do komentarza
Udostępnij na innych stronach

Istotny jest rozmiar klocka jaki rzucasz na mapę, daj mnożniki rozmiaru obiektu do wylosowanych xx yy

 

tu tak

xx = irandom_range(61/multipler,960/multipler);

yy = irandom_range(160/multipler,630/multipler)

 

Oczywiście zwróć uwagę że 61/17 nie bardzo ma sens dla irandom, dlatego przemyśl rozmiar mapy.

 

a tu tak

if (place_empty(xx*multipler,yy*multipler)){ instance_create(xx*multipler,yy*multipler,obj_map);

 

 

 

Powoli z tego dojdziesz żeby robić mapy w ds_grid, a później i ztego się wyleczysz i uznasz że ds_list jest nawet lepsza.

Odnośnik do komentarza
Udostępnij na innych stronach

Póki co DS nie ogarniam w ogóle więc nawet nie próbuje.Dość dobrze sprawdziło się collision_rectangle, nie jest idealnie ale poprawa ogromna

 

A to czas spróbować, to nie gryzie, a ile prędkości dodaje i na jakie przestrzenie pozwala :)

 

ds_list robisz :

nazwa_listy = ds_list_create();

 

ds_list_add_value(lista, wartość) dodajesz kolejne dane

 

później czeszesz to rekurencyjnie przez for i w kilka minut pisania masz stworzony generator poziomów

Odnośnik do komentarza
Udostępnij na innych stronach

W grze którą już nie wiem ile robię, to mam to tak zrobione.

GML (create)
mapa=ds_grid_create(35, 35) // Tworzymy grida

GML
var xx=irandom(35);

var yy=irandom(35);

 

if(ds_grid_get(mapa,xx,yy)==0) //sprawdzamy komorke

{

instance_create(xx*24,yy*24, blok) //to 24, to oczywiscie dlugosc klocka

ds_grid_set(mapa, xx, yy, 1); //ustawiamy w gridzie

}

Albo tak, jeśli chcesz żeby wokół klocka była wolna przestrzeń

GML
var xx=irandom(35);

var yy=irandom(35);

 

if(ds_grid_get_sum(mapa,xx-1,yy-1, xx+1, yy+1)==0) //sprawdzamy kwadracik komorek

{

instance_create(xx*24,yy*24, blok) //to 24, to oczywiscie dlugosc klocka

ds_grid_set(mapa, xx, yy, 1); //ustawiamy w gridzie

}

To sobie w pętle wrzuć czy coś, która będzie trwać aż postawi klocek, czy jak tam chcesz.

Ewen

Odnośnik do komentarza
Udostępnij na innych stronach

A to czas spróbować, to nie gryzie, a ile prędkości dodaje i na jakie przestrzenie pozwala :)

 

ds_list robisz :

nazwa_listy = ds_list_create();

 

ds_list_add_value(lista, wartość) dodajesz kolejne dane

 

później czeszesz to rekurencyjnie przez for i w kilka minut pisania masz stworzony generator poziomów

Rekurencyjnie przez for? xD To nie oksymoron?

Odnośnik do komentarza
Udostępnij na innych stronach

Rekurencyjnie przez for? xD To nie oksymoron?

 

Nie, dowód przeprowadzasz wprost, że coś się czemuś równa = lub tego nie robi !=

albo dowód wystarczający (nie wprost) przeprowadzony rekurencyjnie z wystarczająco dobrym przybliżeniem for(wystarczająca ilość razy).

 

Polecam teorię dowodu i aksjomatykę :)

 

 

Koledze mapa nie wyszła, ponieważ przeprowadzał dowód nie wprost większą ilość razy niż potrzebna mu precyzja i tym samym obalał twierdzenie o pełności mapy z dokładnością do rozmiaru elementu.

 

Sztandarowy przykład wymyślono chyba w XI wieku, z ciągu Fibonaciego 3/5 a dokładniej 5/8 a dokładniej 8/13...

Odnośnik do komentarza
Udostępnij na innych stronach

Powoli z tego dojdziesz żeby robić mapy w ds_grid, a później i ztego się wyleczysz i uznasz że ds_list jest nawet lepsza.
Jest lepsza ale sprawdza się tylko w jednym warunku. Gdy wszystkie tile zawsze są na ekranie tj. nie używa się view, i do tego tile mają ten sam depth i rozmiar. Oczywiście przy różnym depth można zastosować priority list.

 

ds_grid daje ogromną przewagę przy większych mapach w których na view pokazujemy tylko mały jej kawałek. Wtedy możemy nie rysować tego poza view.

Odnośnik do komentarza
Udostępnij na innych stronach

Jest lepsza ale sprawdza się tylko w jednym warunku. Gdy wszystkie tile zawsze są na ekranie tj. nie używa się view, i do tego tile mają ten sam depth i rozmiar. Oczywiście przy różnym depth można zastosować priority list.

 

ds_grid daje ogromną przewagę przy większych mapach w których na view pokazujemy tylko mały jej kawałek. Wtedy możemy nie rysować tego poza view.

 

Eeeetam :)

Możesz w ds_list opisać mapę dwu, siedmio, stupięćdziesięciowymiarową, zawierającą dane o kolorach, smakach, zawartych obiektach, wczytaniu bądź ignorowaniu części danych...

 

W tym co wrzuciłem w demach 3d, to tam nie ma żadnych modeli, to co widać to ds_list, która opisuje wierzchołki trójkątów, ich położenie, kolor trójkąta, jego przezroczystość etc.

Odnośnik do komentarza
Udostępnij na innych stronach

A co stoi na przeszkodzie by takie same informacje zapisywać w paru warstwach ds_grida? :P

 

Ponieważ w gridzie nie możesz przesunąć zawinięcia :)

A niekoniecznie sqrt z liczby elementów musi mieć wartość całkowitą.

 

A jeśli chcesz opisać przestrzeń nieciągłą cz nieeuklidesową to będziesz czesał zera z grida, bo część jego elementów będzie musiała coś zawierać mimo ich nieważkości w procesie.

Odnośnik do komentarza
Udostępnij na innych stronach

Tak zgadam się, ale omawialiśmy dwuwymiarowy przykład tile. :P I dopóki trzymamy się tego to ds_grid będzie bezkonkurencyjny.

 

Edit: I żeby nie było. :P U siebie w edytorze map aktualnie przechowuję dane jako lista obiektów i tablica 2D jednocześnie. Oczywiście obie struktury przechowują tylko ID ds_map która przechowuje resztę danych.

 

Myk polega na tym że przy małej ilości obiektów lista się sprawdza bardzo dobrze. Ale gdy przy dużej ilości obiektów użyjemy zoom w edytorze i spora ich ilość jest poza widokiem użytkownika to edytor sam przełącza się na odczyt z ds_grid bo jest wykonywana mniejsza ilość operacji.

Odnośnik do komentarza
Udostępnij na innych stronach

Tak zgadam się, ale omawialiśmy dwuwymiarowy przykład tile. :P I dopóki trzymamy się tego to ds_grid będzie bezkonkurencyjny.

 

Edit: I żeby nie było. :P U siebie w edytorze map aktualnie przechowuję dane jako lista obiektów i tablica 2D jednocześnie. Oczywiście obie struktury przechowują tylko ID ds_map która przechowuje resztę danych.

 

Myk polega na tym że przy małej ilości obiektów lista się sprawdza bardzo dobrze. Ale gdy przy dużej ilości obiektów użyjemy zoom w edytorze i spora ich ilość jest poza widokiem użytkownika to edytor sam przełącza się na odczyt z ds_grid bo jest wykonywana mniejsza ilość operacji.

 

 

Bardzo słuszna koncepcja.

 

U mnie z ds_list_of_all_list jest wyliczany fokus na które z list rzucić okiem i pobrać dane.

 

Lista jest bardzo praktyczna, jeśli opisuje wyjątki w mapie. Przy dużych przestrzeniach można fraktalnie generować na bieżącą podłoże, las, a dopiero ważące rzeczy jak murki, domki, wrogów budzić z listy.

 

 

Typowym zachowaniem na początku jest Niutonoza, opisanie całego świata absolutnie na raz, w całości dostępnego i w całości działającego w każdym czasie.

Potem się człowiek robi wybredny i aktywuje części z ds grid i robi pierwsze patchfindery po krokach,

ale przeskok z A* na JPS i wyższe sposoby organizowania dużych map wymagają bardzo minimalistycznego opisu bogatego świata.

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