Wykrywanie kolizji 2D w grze Pinball

9

Do tej pory w poprzednich grach korzystałem z prostej kolizji 2D z polami, a następnie sprawdzałem kolizję na poziomie pikseli.

Jeśli gra w pinball w prawie wielu klatkach, piłka będzie w kontakcie ze ścianą lub inną powierzchnią, to czy istnieje inne podejście?

Jan
źródło

Odpowiedzi:

19

Dawno temu (1990) powstały stare gry w pinball:

Pole gry ma kilka warstw (co widać podczas gry):

wprowadź opis zdjęcia tutaj

i kilka warstw kolizji:

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Lewe zdjęcie w skali szarości to mapa kolizji dla gry głównej, prawe zdjęcie to mapa kolizji dla specjalnego obszaru: rampy pinball.

White = wolne pole dla piłki, indeks kolorów wynosi 255.

Gray= piłka zostanie „wypchnięta” z tej strefy. indeks kolorów = kąt wektora, który należy dodać do pozycji kuli. jasnoszary = 0 ° ciemnoszary = 360 °

Niektóre pseudo-kody:

void do_ball_physics()
{
    while(1)
    {
         byte color = read_pixel_under_ball(ballx, bally); //one pixel read
         if(color == 255) //see remark below
            break;
         float vectorx = sin(color/255.0f * 2.0f * PI);
         float vectory = cos(color/255.0f * 2.0f * PI); 
         ballx += vectorx; //push ball away from one unit
         bally += vectory; //

    }
}

Niektóre specjalne indeksy kolorów mogą być również wykorzystywane do czegoś innego niż kolizji, zakres niestandardowy kolor (np: 240 - 255) mogą być zarezerwowane dla specjalnych stref wykrywania jak spinners, triggers, bumpers, holes, ...

Jak widać, jest to bardzo proste. Jest tylko kilka pikseli „odczytanych” na ramkę. Z tego powodu możesz sprawić, aby symulacja fizyki przebiegała z naprawdę wysoką szybkością klatek, np. 200 fps. Użycie wysokiej prędkości klatek usprawni symulację i zmniejszy „tunelowanie” (dzieje się tak, gdy piłka idzie zbyt szybko i mija elementy koryta bez kolizji). Ta prostota jest również tym, co umożliwia płynne gry w pinball 386 computers(a nawet szybkie 286) w przeszłości (między innymi innymi sztuczkami, takimi jak cykliczne przewijanie kolorów, przewijanie vga i maskowanie sprite ...).

Obecnie większość gier w pinball nie jest już produkowana w ten sposób. Zamiast tego boisko jest sceną 2d / 3d z użyciem wielokątów lub duszków, a kolizje są dokonywane z niektórymi uproszczonymi liniami, krzywymi Beziera lub sferami reprezentującymi uproszczony kształt wizualnego pola gry.

przykład (z wizualnej pinball ):

wprowadź opis zdjęcia tutaj

Niektóre firmy gier używają własnego silnika fizyki, ale innym, łatwiejszym sposobem jest użycie silnika fizyki, takiego jak Box2Dlub Bullet. Większość gier w pinball na iPhone'a, które widziałem, używały wcześniej istniejącego silnika fizyki + niektórych zasobów 3D.

tigrou
źródło
... mówimy tutaj o javascript i canvas, więc najwolniejszą możliwą operacją w tym środowisku jest ... rysowanie i czytanie pikseli ... szczególnie na najwolniejszych urządzeniach. Tak więc 4/5 tej odpowiedzi jest po prostu historią / bez znaczenia. Ale racjonalność nie może konkurować ze zdjęciami.
GameAlchemist,
1
Mapy kolizji mogą być przechowywane w szyku, dlaczego chcesz je przechowywać na płótnie? Jak powiedziałeś, pierwsza część odpowiedzi dotyczy głównie historii, ale jeśli musisz zaimplementować pinball na bardzo niskim końcu procesora (np. Stary gsm), to nadal obowiązuje. W dzisiejszych czasach wolałbym raczej użyć silnika fizyki, takiego jak jbox2d, lub zrobić fizykę samodzielnie, zderzając się z segmentami linii lub krzywymi Beziera (jeśli uważasz, że potrafisz napisać coś takiego).
tigrou
Odczytywanie pikseli na obrazach jest również bardzo szybkie w nowoczesnych przeglądarkach. Niektóre z pierwszych wersji „omg JS jest szybsza niż C” to wszystkie jądra przetwarzające obrazy.
Sean Middleditch
Jak dowiedziałeś się o tigrou map kolizji?
Bemmu
1
Z powodu tego remake'u marzeń pinball: pouet.net/prod.php?which=24499 (nie przeze mnie). Spójrz w źródłach, tam jest mapa kolizji, o której mówię.
tigrou
1

Pinball ma bardzo bogaty zestaw fizyki, nie tylko dziury lub ściany, ale także elementy reagujące (uderzanie do tyłu) lub nierówną powierzchnię, w której piłka zwalnia, a następnie odzyskuje prędkość.

Jeśli chcesz stworzyć dobrą jednoręki bandyta, najlepszym rozwiązaniem jest albo wykrycie kolizji 3D, albo samodostosowany system, w którym każdy kolidujący obiekt ma metodę z parametrami odległości i prędkości, zwracającą zmienione prędkości.

Markus von Broady
źródło
Dlaczego mówisz, że wykrywanie kolizji 3D ma to, co pasuje do 2D?
Jan
@John Wyobrażam sobie dobrą jednoręki bandytę jako grę 3D z rampami itp. Możesz zaprogramować te rampy w 2D i skalować piłkę w górę, gdy ona przechodzi nad rampą i w dół, gdy ona sama spada, ale w tym przypadku nadal jest to 3D gra, po prostu dodajesz wymiar Z sam.
Markus von Broady,
1

Jakiś czas temu zrobiłem grę w pinball; był również oparty na pikselach. Miałem mapę kolizji, która właśnie zawierała dane kolizji. Łatwo było znaleźć przybliżoną normalną kolizję:

Weź obszar mapy kolizji nakładającej się na piłkę, znajdź środek, ułóż wektor od tego punktu do środka kuli, a następnie normalizuj.

Mam nadzieję, że dostaniesz kilka pomysłów :)

wildbunny
źródło
1

Po pierwsze, jeśli stworzysz grę w pinball, najprawdopodobniej będziesz potrzebować więcej wykrycia kolizji w ograniczonym kręgu niż BOX z ograniczeniem :-)
Biorąc pod uwagę złożoność fizyki związanej z pełnoprawnym jednorękim bandytą, sugerowałbym, aby spojrzeć na istniejący silnik fizyczny 2D. Box2D ma dobrą reputację w javascript, mogą istnieć inne, ale nie spotkałem żadnego dobrego (i darmowego).
Rq1: Z pewnością używasz (tak jak ja) klasycznego podziału w grze między aktualizacją a losowaniem. I używasz timera (setInterval / setTimeout) i / lub RequestAnimationFrame do wywoływania aktualizacji, a następnie rysowania w zwykły sposób. Pinball może być rodzajem gry, w której chcesz mieć jedną aktualizację czasową, a drugą kierującą losowanie, dzięki czemu możesz dostosować szybkość każdej z nich niezależnie, aby pracować na szerokiej gamie urządzeń. Ponieważ nie można po prostu upuścić (aktualizacja + losowanie), jeśli urządzenie jest zbyt wolne: jeśli czas między dwiema aktualizacjami (dt) staje się zbyt długi, silnik fizyczny może nie dopuścić do kolizji.

GameAlchemist
źródło
0

Możesz spojrzeć na wizualną grę pinball vs. przyszłą grę pinball dla przedmiotu 2d vs 3d. Jeśli grasz w wizualną grę pinball (wszystko jest zrobione w 2D), to grasz w przyszłą grę pinball, lub coś w rodzaju Zen Pinball, czujesz różnicę w sposobie gry. Ja osobiście wolę 3d, ale twój projekt może lepiej pasować do 2d, tylko Ty będziesz w stanie zdecydować

ProtoJazz
źródło