Autor Wątek: gra wyścigowa i sprawdzanie kto jest pierwszy  (Przeczytany 6395 razy)

Vipa

  • Gość
# Lipiec 15, 2008, 21:53:45
My sami, w Micro Madenss, rozwiązaliśmy to w ten sposób, że rozstawiliśmy na trasie przypuśćmy po 30 punktów, ponumerowaliśmy je od 1 wzwyż i sprawdzaliśmy kto jest najbliżej najdalszego punktu. Pozostaje dodawanie do każdego punktu po 100 (do ogólnej ilości) po pokonaniu okrążenia (to już moja inicjatywa, nie wiem jak to rozwiązał koder) by nie wyszło, iż ktoś za nami 3/4 okrążenia jest przed nami w statystykach, i powinno być cool. U nas się sprawdziło całkowicie i jest spoko. Problem to DOKŁADNE rozmieszczenie tych punktów.

Offline Mr. Spam

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

Offline Goliatus

  • Użytkownik
    • Warsztat - tworzenie gier

# Lipiec 16, 2008, 02:28:55
Jest jeszcze inna możliwość w postaci algorytmu A*. Dla każdego checkpointu mamy taką mapę(wygenerowaną wcześniej) i to pozwala określić kto jest najbliżej celu. Problemem, który nie trudno sobie wyobrazić, jest skracanie drogi pomiędzy checkpointami(zaplanowane przez autorów lub w cudowny sposób odkryte przez genialnego gracza) i właśnie uzycie A* pozwala go rozwiązać.

Vipa: Chodzi o to, aby pokazać kto ma bliżej do checkpointu po drodze, a nie kto jest bliżej w linii prostej, bo co zrobisz jeśli będziesz chciał dodać mosty i tunele do swoich wyścigów?
« Ostatnia zmiana: Lipiec 16, 2008, 02:33:30 wysłana przez Goliatus »

Offline BTM

  • Użytkownik

# Lipiec 16, 2008, 09:01:41
A nie możesz checkpointów zrobić liniami prostymi łączącymi dwa przeciwległe "krawężniki" ? Wtedy nie ważne czy ktoś jest na zewnętrznej czy wewnętrznej zakrętu - jeżeli checkpoint jest jakby promieniem wiodącym zakrętu to obliczając kto jest bliżej możesz określić kto jest pierwszy. Poza tym, pomijam już fakt, że w takim momencie każdy koncentruje się na tym, by nikt go nie minął z lewej/prawej a sama pozycja zmienia się dosyć często ;-)

Offline menajev

  • Użytkownik
    • Karate Inowrocław

# Lipiec 18, 2008, 20:16:43
Przy swojej gierce też z tym kombinowałem, co prawda jeszcze nic nie zrobiłem, ale miałem jeden pomysł- 'przyczepić' samochodom 'antenki' [zwykłe linie, najlepiej ustawiające się prostopadle do toru] i sprawdzać, po której stronie tych antenek znajdują się inni [albo sprawdzać, czy właśnie je dotykają - wyprzedzają lub są wyprzedani]. Jednak jeszcze nic nie zrobiłem, więc nie wiem, czy byłoby to łatwe do zrobienia i jak by działało [ale tak na oko działałoby dobrze].

Offline MadMax

  • Użytkownik
    • http://mobiledeveloper.cba.pl/

# Lipiec 18, 2008, 21:14:14
moim zdaniem mozna to latwo rozwiazac :). A skoro topick sie ciagnie to jeszcze problem jest Hot :).

wiec moj, koncept:



1. teraz trase podzielic na kilka punktow ktore mozna polaczyc odcinkami (czerwonymi na rys),
2. srodkowy punkt pojazdu rzutowac na wszystkie odcinki i sprawdzic ktory odcinek jest blizej (chociaz to uproszczone rozwiazanie mogace powodowac bledy),
3. obliczyc odleglosc rzutu punktu (p1, p2 na rys) na odcinku od poczatku odcinku.
4 odleglosc dodac do sumy dlugosci poprzednich odcinkow (czyli to moze byc tablica odcinkow).
5. posortowac wyniki dla kazdego pojazdu i mamy info kto jest 1 :).

aha co do punktu 2 to lepiej nie rzutowac na wszystkie odcinki tylko te ktore nie sa zasloniete, bo moze wyjsc sytuacja:



dlatego trzeba tez sprawdzac czy rozowy rzut nie przecina przeszkody / sciany.

wszystko mozna zoptymalizowac :).

Teraz tez jak rozwiazac AI.



1. obliczane sa wektory od pojazdu do kazdej czerownej kulki ktore nie przecinaja zadnej przeszkody.
// 2 - trudniejsza wersja xD
2. kazda kulka ma swoja sile przyciagania (najwieksza sile maja te co sa na trasie) i wetkor do niej jest mnozony przez ta sile.
3. wektory sa sumowane i usrednione do 1 wetkora.
4. wektor wynikowy jest tym gdzie powinien jechac pojazd (to jest wynikowa sila przyciagania ktora ma najwiekszy wspwy na wynik).

moze te moje sposoby sa ze tak to nazwe lamerskie, czy oporne, ale automatyczne bo wszystko mozna wygenerowac w edytorze nawet nie dotykajac myszka trasy :).

aha te najwieksze kule to maga byc punktami laczacymi odcinki z poprzedniego algorytmu do wyznaczania kto jest 1. A przy generowaniu kul najwieksze sily przyciagania maja kule umieszczone na odcinkach trasy, a te umieszczone na innym terenie trawa ect. juz nie graja takiej roli.

jeszcze nie implementowalem tych algosow, ale jestem na 100 pewien ze beda dzialac zreszta to widac.

co myslicie o tych rozwiazaniach ?

Pozdrawiam,
madmax.
« Ostatnia zmiana: Lipiec 18, 2008, 21:24:32 wysłana przez MadMax »

Offline Goliatus

  • Użytkownik
    • Warsztat - tworzenie gier

# Lipiec 18, 2008, 23:13:46
MadMax: Mam wątplwiości co do rozwiązania kwestii sztucznej inteligencji, gdyż to narzuca designerowi stworzenie idealnego rozkładu punktów, co jest bardzo trudne i musi oznaczać powstanie błędów lub po prostu ułomnego AI.

Offline steffan

  • Użytkownik
    • Adam Roszyk Blog VR, Startups, Travels

# Lipiec 18, 2008, 23:31:42
Dzięki za kolejne pomysły ale już raczej nie są potrzebne- właśnie ustawiam punkty kontrolne na każdej trasie  ;)
A co do pomysłu MadMax'a na stworzenie Ai, to mam właściwie łatwiejsze rozwiązanie:

- Grafik, na każdej planszy tworzy mi jakby bardzo wysokie krawężniki na całym torze
- Wczytuję wszystkie potrzebne rzeczy do gry, oraz z całkowitą przeźroczystością w/w "krawężniki"
- Do każdego wozu przeciwnika dodaje 3 punkty, ustawione wyżej i dalej od samego pojazdu [lewy, prawy, środkowy(najdalej)]
- W pętli głównej sprawdzam:
  -jeśli prawy punkt 1# przeciwnika koliduje z "krawęznikiem", obróć 1# przeciwnika w lewo
  -analogicznie lewy punkt
  -jeśli centralny punkt 1# przeciwnika koliduje, zmniejsz prędkość 1# przeciwnika

Może trochę mało profesjonalne i nie nadaje się na bardziej skomplikowane trasy, ale w mojej grze takie rozwiązanie spisuje się idealnie ;)
A przy tym dzieci nie będą musiały się denerwować że przeciwnicy są zbyt mądrzy, żeby ich wyprzedzić ;p

Offline MadMax

  • Użytkownik
    • http://mobiledeveloper.cba.pl/

# Lipiec 19, 2008, 00:02:07
MadMax: Mam wątplwiości co do rozwiązania kwestii sztucznej inteligencji, gdyż to narzuca designerowi stworzenie idealnego rozkładu punktów, co jest bardzo trudne i musi oznaczać powstanie błędów lub po prostu ułomnego AI.

Goliatus: wlasnie w tym szkopul ze nie :). Chodzi o to ze dobrze napisany algo zrobi to sam za designera, tylko bedzie musial rozruzniac co jest droga a co poboczem (chociaz designer moglby dawac wskazowki algowi poprzez rozmieszczenie np. specjalnych sfer). Ogolem wszystko z tych algosow jest z zalozenia wygenerowane i tych punktow / kulek nie musi byc az tak duzo - mozna ustalic pewien prog kulek na mape, ale fakt AI moze byc na tym srednio myslace :D, ale po dodaniu kilku warunkow juz nie bylo by problemu i gracz mialby klopoty z wyprzedzeniem przeciwnika.

Dzięki za kolejne pomysły ale już raczej nie są potrzebne- właśnie ustawiam punkty kontrolne na każdej trasie  ;)
A co do pomysłu MadMax'a na stworzenie Ai, to mam właściwie łatwiejsze rozwiązanie:

- Grafik, na każdej planszy tworzy mi jakby bardzo wysokie krawężniki na całym torze
- Wczytuję wszystkie potrzebne rzeczy do gry, oraz z całkowitą przeźroczystością w/w "krawężniki"
- Do każdego wozu przeciwnika dodaje 3 punkty, ustawione wyżej i dalej od samego pojazdu [lewy, prawy, środkowy(najdalej)]
- W pętli głównej sprawdzam:
  -jeśli prawy punkt 1# przeciwnika koliduje z "krawęznikiem", obróć 1# przeciwnika w lewo
  -analogicznie lewy punkt
  -jeśli centralny punkt 1# przeciwnika koliduje, zmniejsz prędkość 1# przeciwnika

Może trochę mało profesjonalne i nie nadaje się na bardziej skomplikowane trasy, ale w mojej grze takie rozwiązanie spisuje się idealnie ;)
A przy tym dzieci nie będą musiały się denerwować że przeciwnicy są zbyt mądrzy, żeby ich wyprzedzić ;p

steffan: no problema :). Jesli dziala to jak najbardziej nie oplaca sie zmieniac. Wersja co podalem jest troche pokombinowana i pewnie tez CPU by prosilo o lzejsze algo ;D.

Podalem ten sposob, bo moze sie komus to przyda. Ja juz pewnie nie bede sie bral za scigalki, ale kto wie :).

//edit
Goliatus: pamietam Twoja stara gre wyscig chomikow (chyba). Tam byly strzalki i nie bylo to zle rozwiazanie. Dlatego mozna takim algosem wygenerowac automatycznie te strzalki a potem usunac kule nie znajdujace sie na trasie :).
« Ostatnia zmiana: Lipiec 19, 2008, 01:33:31 wysłana przez MadMax »

Offline micran

  • Użytkownik
    • Micran - Warsztat

# Lipiec 19, 2008, 21:00:31
Ja bym wykonał to w taki sposób:
1. Samochody powinny miec w strukturze int pozycja
2. Ponumerował bym ich na starcie ( bo przeciez jakas kolejnosc musi być)
3. I jak mija jeden drugiego podmieniać pozycje tych samochodów.
Samochód a    Samochód b
pozycja <---->pozycja

Rozwiazanie najprostsze i napewno bedzie działać.

Offline Hiwer

  • Użytkownik

# Lipiec 19, 2008, 22:40:18
Cytuj
3. I jak mija jeden drugiego podmieniać pozycje tych samochodów.

Tylko problem w tym, że pojęcie pozycja jest trochę niedokładne (niby jak to miałoby być wyliczane, że jeden mija drugiego).

Lepiej jest dać kilka punktów kontrolnych i następnie liczyć względem nich pozycję pojazdów. Jeżeli dystans do następnego punktu jest większy niż samochodu, który był wcześniej drugi to zmiana pozycji. Problem w tym, że droga to nie jest wąski pas, tylko odpowiednio szeroki, że mieszczą się 2-3 samochody i odległość z jednego końca drogi może być inna niż po drugiej stronie. W takiej sytuacji samochód który wyraźnie jest drugi może być liczony jako pierwszy. To jest właśnie problem - jak zrobić system do liczenia pozycji który będzie działał prawidłowo nawet na krętej drodze?

Można wprowadzić dodatkowe (dokładne) sprawdzanie w sytuacji, gdy samochód znajduje się blisko innego samochodu.

Można zapisywać drogę jaką przebył pojazd, ale nie dokładny przebyty dystans samochodu, tylko wyznaczyć na środku jezdni pas i liczyć względem niego. W takiej sytuacji samochód jadący slalomem i jadący prosto w tym samym punkcie będą mieli jednakową odległość do najbliższego punktu kontrolnego, pomimo tego, że jadący slalomem przebył dłuższy dystans w rzeczywistości.

Offline micran

  • Użytkownik
    • Micran - Warsztat

# Lipiec 20, 2008, 15:22:20
Moje spostrzezenia wcale nie musza akurat teraz zadziałać:
Jak ja bym robił ta gre to uzył bym coś takiego jak liczenie odleglosci miedzy samochodami. Na poczatek wybieram jakis samochód dajmy na to ze jest on na pozycji 4. Z przodu daje wektory patrze na zwrot jesli jest dodatni jest przed tym samochodem, ujemny za nim. 1 znajduje sie dalej od 4 niż 2 od 4 itd. Daje moje spostrzezenia na rysunku. Paint'a użyłem:

Offline Zene

  • Użytkownik
    • Zenedith’s dev blog

# Lipiec 20, 2008, 18:17:20
Mój pomysł polega na umieszczaniu punktów kontrolnych, które sprawdzają co jest w ich "zasięgu", oraz trzymać w pojeździe ostatnio mijany punkt kontrolny, który zawiera jego numer porządkowy na trasie. W następnych "ramkach" lub lepiej - pewnym czasie - sprawdzać odległość w punktach kontrolnych za i przed graczem i modyfikować bieżący, najlepiej przybliżający punkt kontrolny - to samo robić dla AI/innych graczy.
Po obliczeniach sprawdzać kto ma dalszy punkt kontrolny. Można wtedy tworzyć dowolnie złożone plansze(tak mi się wydaje a niedługo to zweryfikuję).

UPDATE:
Jeśli pojazdy mają ten sam punkt kontrolny badamy odległość od następnego punktu kontorlnego, ewentualnie jeszcze od poprzedniego.
« Ostatnia zmiana: Lipiec 20, 2008, 18:20:20 wysłana przez Zene »