Skocz do zawartości

Ogromny swiat 2D - jakies pomysly na "ożywione obieky"


TO_mek

Rekomendowane odpowiedzi

Witam!

Od jakiegoś czasu zastanawiam się nad dużym światem 2D zrobionym w GM. Robienie dużych roomow mija się z celem. Chodzi mi o coś na zasadzie dużych tablic przechowujących dane i wyświetlania tylko tego skrawka świata który mieści się na 1 ekranie coś mniej więcej jak w tym tutorialu (porównanie do peryskopu czołgu).

Zastanawia mnie jak uzyskać ożywione obiekty poza aktualnie widocznym ekranem. Załóżmy, że wszelkie postacie (zwierzęta, rośliny) chcę mieć "żywe" tzn. że drzewo co ileś tam czasu rośnie, zmienia kolor liści, zwierzęta poruszają się po planszy, rosną, walczą pomiędzy sobą (wilk goni zająca) itp. Obawiam się, że robiąc to na obiektach w dodatku cały czas aktywnych może na dzień dobry zarżnąć grę bo ich docelowa liczba może iść w setki. Deaktywacja obiektów poza roomem także nie ma sensu bo nieaktywny obiekt to tak jakby go wcale nie było (nie zmienia pozycji, nie wykrywa kolizji itp.).

 

Zdaję sobie sprawę, że tego typu gry (bazującej na tak dużym świecie z interaktywnymi obiektami) nie się się zrobić w kilka tygodni czy miesięcy. Na początek stworzę sobie bardzo prostą platformówkę ale w oparciu o podobny algorytm wyświetlania czyli:

- ekran ruchomy tylko w lewo/prawo (a w zasadzie tylko w jedną stronę bo bohater ma z automatu "iść" w prawo a gracz ma tylko możliwość podskakiwania - jeden klawisz sterujący w grze)

- wszelkie pojawiające się obiekty (platformy, przeciwnicy (drobne zwierzaki które należy przeskoczyć) i przeszkody (dziura z wodą, niewielki murek itp) są przechowywane w tablicy i tworzone w momencie gdy mają pojawić się na ekranie,

- platforma główna (droga) to "klocki" o stałej szerokości, bez zbędnych przerw między sobą - czyli definiując ilość tych kostek i znając ich szerokość znany będzie docelowy rozmiar (szerokość) świata

- pozycja bohatera jest stała natomiast cały świat się przesuwa z prawej do lewej,

- szerokość rooma = szerokości widzialnego ekranu, szerokość świata nieograniczona (a właściwie ograniczona podczas tworzenia listy obiektów platformy głównej a to z kolei potrzebne jest do efektu przesuwania tła i obiektów drugiego planu)

- do tego tło i obiekty dalszego plany by wykorzystać efekt paralaksy,

 

Powyższe punkty raczej nie sprawią mi problemu natomiast zastanawia mnie jak rozwiązać to "ożywienie świata" (które w tej gierce platformowej w zasadzie jest mało istotne a które jak najbardziej będzie istotne przy docelowym projekcie)

 

Może macie jakieś sugestie czy sprawdzone algorytmy jak do takiego tematu podejść.

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm z tymi żyjącymi obiektami to może by zrobić coś podobnego jak to zrobili Piranha Bytes z Gothickiem. Ludzie i moby mieli z góry zdefiniowane różne stany, które się zmieniały w zależności od pory dnia i postępów gracza. Tymi stanami to np mogło by być coś takiego:

 

stan 1 - gościu śpi w domku w przedziale czasowym 23:00-7:00

stan 2 - gościu jest w domu i coś tam robi 7:00 - 12:00

stan 3 - gościu jest po za domem i chodzi po pathu 12:00 - 23:00

 

No i teraz jak gracz jest oddalony od niego to deaktywujemy go, kiedy gracz podejdzie to aktywujemy i zmieniamy mu ten stan w zależności od tego o jakiej porze tej aktywacji dokonano.

 

Przykładowa sytuacja:

Gracz spotyka gościa w domu o godzinie 8:00, oddala się od niego i gościu się deaktywuje. Mija parę godzin, teraz jest godzina 17:00. Gracz podchodzi do domku, w którym jest deaktywowany gościu i się aktywuje jednocześnie sprawdzając porę dnia. Sprawdza i jest 17:00 więc uruchamia się mu stan 3 przenosimy instancję gościa w jakieś randomowe miejsce na pathu tylko w takie by gracz nie był w stanie zobaczyć jego teleportacji. No i co się dzieje, gracz wchodzi do domku i gościa nie zastaje. Więc ma odczucie że postać tego gościa "żyje".

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm z tymi żyjącymi obiektami to może by zrobić coś podobnego jak to zrobili Piranha Bytes z Gothickiem. Ludzie i moby mieli z góry zdefiniowane różne stany, które się zmieniały w zależności od pory dnia i postępów gracza.

 

No tak to powiedzmy jest to jakiś pomysł na takie przypadki jakie podałeś ale:

- takie postacie gdy są dezaktywowane nigdy nie wyjdą same na aktywny ekran nawet jeśli ich ścieżka na to pozwala,

- takie obiekty nie mają interakcji między sobą (wilk nie zapoluje na zająca bo się z nim nie spotka).

 

Ale faktycznie obiekty nieruchome (np. rośliny które mają rosnąć, zmieniać wygląd) można w ten sposób zrobić.

 

Ewentualnie nasuwa się pomysł aby cały świat poza widocznym ekranem był "ożywiany" (aktywowany) co jakiś przedział czasowy, wykonywały się obliczenia i ponownie "zamrażał" (deaktywował) tylko to nie bardzo będzie współgrać z aktywnym ekranem gdzie chciałbym by widoczne obiekty poruszały się w czasie rzeczywistym a nie "turowo".

Odnośnik do komentarza
Udostępnij na innych stronach

takie postacie gdy są dezaktywowane nigdy nie wyjdą same na aktywny ekran nawet jeśli ich ścieżka na to pozwala,

Można przechwycić różnicę w czasie pomiędzy aktywacją a deaktywacją i przesunąc taką instancję po pathu o dokładnie ten okres czasu. Wtedy nie trzeba się martwić o to że same się nie aktywują, gracz je aktywuje i to wystarczy

 

takie obiekty nie mają interakcji między sobą (wilk nie zapoluje na zająca bo się z nim nie spotka).

Dało by chyba radę zrobić jakieś instancje kontrolujące takie zdarzenia działające podobnie jak zwykłe żyjące.

 

Niech taka instancja kontrolująca będzie postawiona w np. lesie i ma zdefiniowanie z góry jakieś konkretne wydarzenia, które będą zachodziły kiedy gracz podejdzie na pewną odległość i nieświadomie aktywuje ten kontoler

np:

niech instacja wilka ma zmienną określającą to jak bardzo mocno wilk jest głodny w procentach, glod = 0%

 

-- zdarzenie 1 - symulacja zabijania zająca przez wika --

a. aktywuj instancję wilków i zająców w promieniu 1000px od kontrolera ( ten punkt jest wymagany by przeprowadzić dalsze obliczenia )

b. sprawdź w tym promieniu populację zająców i wilków

c. gdy zająców jest dużo więcej od wilków i średnia glod tych wilków > 65% to zabij losową liczbę tych zająców, postaw w ich miejsce zdechłe ciała a wilkom wyzeruj glod.

 

-- zdarzenie 2 - wilki padaja z glodu --

a. aktywuj instancję wilków i zająców w promieniu 1000px od kontrolera

b. sprawdź w tym promieniu populację zająców i wilków

c. gdy zająców jest dużo mniej od wilków i średnia glod wilków > 90% to zabij losową liczbę wilków, postaw w ich miejsce zdechłe ciała.

 

Oczywiście tutaj mogą się pojawić problemy z optymalizacją więc niech te zdarzenia nie zachodzą zbyt często. :P

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