Ignatus Opublikowano 30 Sierpnia 2015 Udostępnij Opublikowano 30 Sierpnia 2015 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 Więcej opcji udostępniania...
candy Opublikowano 30 Sierpnia 2015 Udostępnij Opublikowano 30 Sierpnia 2015 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 Więcej opcji udostępniania...
MaxGaming Opublikowano 30 Sierpnia 2015 Udostępnij Opublikowano 30 Sierpnia 2015 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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 30 Sierpnia 2015 Udostępnij Opublikowano 30 Sierpnia 2015 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 Więcej opcji udostępniania...
Ignatus Opublikowano 30 Sierpnia 2015 Autor Udostępnij Opublikowano 30 Sierpnia 2015 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 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
3r3se7ven Opublikowano 30 Sierpnia 2015 Udostępnij Opublikowano 30 Sierpnia 2015 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 Więcej opcji udostępniania...
Sutikku Opublikowano 31 Sierpnia 2015 Udostępnij Opublikowano 31 Sierpnia 2015 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 Więcej opcji udostępniania...
kt1117 Opublikowano 31 Sierpnia 2015 Udostępnij Opublikowano 31 Sierpnia 2015 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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 1 Września 2015 Udostępnij Opublikowano 1 Września 2015 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 Więcej opcji udostępniania...
Threef Opublikowano 1 Września 2015 Udostępnij Opublikowano 1 Września 2015 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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 1 Września 2015 Udostępnij Opublikowano 1 Września 2015 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 Więcej opcji udostępniania...
I am Lord Opublikowano 1 Września 2015 Udostępnij Opublikowano 1 Września 2015 A co stoi na przeszkodzie by takie same informacje zapisywać w paru warstwach ds_grida? :P Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
3r3se7ven Opublikowano 1 Września 2015 Udostępnij Opublikowano 1 Września 2015 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 Więcej opcji udostępniania...
Threef Opublikowano 1 Września 2015 Udostępnij Opublikowano 1 Września 2015 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 Więcej opcji udostępniania...
3r3se7ven Opublikowano 1 Września 2015 Udostępnij Opublikowano 1 Września 2015 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę