Autor Wątek: Symulacja ruchu ulicznego  (Przeczytany 2769 razy)

Offline sCk

  • Użytkownik

# Kwiecień 23, 2010, 17:15:00
   Witam, zastanawiam się jak zaimplementować ruch uliczny w grze typu GTA, GTA 2. Na ten moment mam pomysł, żeby stworzyć węzły( auta by jeździły od jednego do drugiego, itd. ). W każdym węźle były by przechowywane adresy następnych do których auto może pojechać lub instrukcje do jakie auto musi zrobić ( np. światła drogowe, przejścia, znaki). Jednak przy takim rozwiązaniu trzeba osobno ustawiać ruch w obie strony, wszystkie zjazdy, itp. Przy małej mapie jak najbardziej wszystko wydaje się być w porządku, jednak gdy rozmiar mapy jest dość duży tych węzłów powstaje duża ilość, co może spowalniać działanie gry w znaczącym stopniu. Wprawdzie można obliczać tylko auta, które jeżdzą między węzłami w pewnej odległości od gracza, w tym wypadku jednak pogarsza się symulacja ruchu w całym mieście. Może ktoś już robił coś takiego, albo ma jakieś przemyślenia na ten temat i ma pomysł w jaki sposób można to rozwiązać?

Pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

# Kwiecień 23, 2010, 17:24:05
Myślę że w GTA 1 i 2 zrobili tak , że jeśli gracz ma pozycję (133,433) w sektorze (5,8) , to ruch uliczny jest tylko w sektorach:
(4,7)(5,7)(6,7)
(4,8)(5,8)(6,8)
(4,9)(5,9)(6,9)
A kiedy gracz np. przechodzi do sektora (5,7) to ruch uliczny kasujemy z sektorów (4,9)(5,9)(6,9) a dodajemy do sektorów (4,6)(5,6)(6,6)
Proste jak wół.

I w GTA 2 i 1 , raczej zrobili drogę zbudowaną z kafli , i każdy kafel ma kierunek/kierunki , do których powinien zmierzać samochód.

Offline Kos

  • Użytkownik
    • kos.gd

# Kwiecień 23, 2010, 20:12:40
W takim GTA (do Vice City włącznie, dalej nie grałem) symulacja samochodów była może połowę dalej, niż zasięg widzenia. I działało :)

Offline Oti

  • Użytkownik

# Kwiecień 23, 2010, 21:47:48
@up
W vice city?! Pf, tam to samochody znikały jak się odwróciłeś. ;) Nie rozumiem jak mogli tak to spieprzyć. :P

Offline Kuba D.

  • Użytkownik

# Kwiecień 23, 2010, 22:06:53
Fakt, strasznie mnie to denerwowało.

W Mafii było to bardzo dobrze rozwiązane, postawiłeś brykę na moście to się korek robił na całą dzielnicę. obojętnie gdzie sobie poszedłeś.

Najlepiej jest po prostu powyznaczać listę celów dla samochodów i pieszych a po ich osiągnięciu wyznaczyć następne itd.

# Kwiecień 23, 2010, 23:19:59
Najlepiej jest po prostu powyznaczać listę celów dla samochodów i pieszych a po ich osiągnięciu wyznaczyć następne itd.
Za duże obciążenie dla procka i pamięci.
Przepuśćmy że miasto ma 10000 mieszkańców.

Lepiej generować losowo samochody , by robić tylko wrażenie.
"Programowanie gier polega na oszukiwaniu gracza." - cytat z któreś książki.

Offline sCk

  • Użytkownik

# Kwiecień 24, 2010, 01:32:51
Mapa kaflowa dla aut wydaje się całkiem wygodnym rozwiązaniem, jednak ma dwie wady.

Po pierwsze drogi byłyby tylko pionowe i poziome, a nie we wszystkich.
Po drugie takie drogi by musiałyby być w odstępach równych wielokrotności szerokości kafla.

Zorganizowanie tego ruchu jednak będzie lepsze, jeżeli użyje się wspomnianych węzłów i podzieli się je na sektory w taki sposób jak napisał  Wladekprogramista.

Offline Kuba D.

  • Użytkownik

# Kwiecień 24, 2010, 10:48:09
Najlepiej jest po prostu powyznaczać listę celów dla samochodów i pieszych a po ich osiągnięciu wyznaczyć następne itd.
Za duże obciążenie dla procka i pamięci.
Przepuśćmy że miasto ma 10000 mieszkańców.

Lepiej generować losowo samochody , by robić tylko wrażenie.
"Programowanie gier polega na oszukiwaniu gracza." - cytat z któreś książki.
Widziałeś w jakiejś grze GTA-podobnej 10000 mieszkańców ? 800-1000 pieszych + 400-500 aut na całe miasto w zupełności wystarczy. I tak to będzie strasznie zasobożerne ?  Wyznaczasz tylko i wyłącznie cele ( czyli punkt do którego dążą) dla każdego z nich, fizykę i zaawansowane AI liczysz tylko dla tego co jest widoczne. Pokrywasz miasto checkpointami np. na skrzyżowaniach, jakiś ważnych miejscach i już masz cele do których będą mieszkańcy podążać ( a jak do nich dochodzą to wyznaczasz następny cel trochę dalej ). Nie musisz wyszukiwać najbardziej optymalnej czy najkrótszej drogi, tylko niech sobie wszyscy chodzą, i jeżdzą ( a jak będzieśż za kimś szedł i go śledził to takie kluczenie będzie dobrze wyglądać bo pomyślisz, że ten za kim idziesz chce zgubić gwałciciela, zlodzieja, detektywa, tajniaka czy kogoś innego i dlatego idzie taką pokrętną drogą ).

# Kwiecień 24, 2010, 11:44:17
Mi chodziło o to , że:
przepuśćmy że mapa ma węzły, mamy skrzyżowanie i znajdujemy się na dole
wybieramy losowo jedno z 3 kierunków i zmierzamy tam aż dojedziemy do następnego rozgałęzienia i wtedy losowo wybieramy jedną z dróg itp..
Samochód/człowiek nie ma jakiegoś konkretnego celu na mapie , tak sobie chodzi.
Oczywiście jeśli samochód/człowiek znajdzie się poza aktualnym obszarem to go kasujemy albo przenosimy na aktualny obszar.

Offline rm-f

  • Użytkownik
    • Tu trolluje

# Kwiecień 24, 2010, 12:24:00
Ale wy kombinujecie :P Macie tutaj IMHO bardzo dobre przybliżenie.

1. Wygenerować graf ulic i nadać wierzchołkom i krawędzią wartości (krawędzie -> (długość/prędkość max)*jakis_const), wierzchołek ( (((ilość wejść)*1min)/ilość wyjść)*jakiś_const) z mapy gry.
2. Stworzyć X samochodów, w miejscach mieszalnych lub losowych
3. Wyznaczyć trasy (dość niedokładne) i wyznaczać je w razie zablokowania ulicy (wtedy auto jedzie do zablokowanej ulicy i jedzie z nowo wyszukiwaną scieżką, możesz dać  jakąś premie -1min?) lub dotarcia do punktu.
4. Wyznaczyć czas trwania trasy (suma wszystkich krawędzi po których się przemieszcza + suma wartości wierzchołków), zapisując na której krawędzi będzie o której godzinie.

A teraz jak znaleźć widoczne auta.
Szukamy które auta będą w obecnym czasie tutaj. I rysujemy je oraz sterujemy AI, dopóty nie stracimy ich z oczu :P
« Ostatnia zmiana: Kwiecień 24, 2010, 12:26:30 wysłana przez świrus »