Odpowiedzi:
Dawno temu (1990) powstały stare gry w pinball:
Pole gry ma kilka warstw (co widać podczas gry):
i kilka warstw kolizji:
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 ):
Niektóre firmy gier używają własnego silnika fizyki, ale innym, łatwiejszym sposobem jest użycie silnika fizyki, takiego jak Box2D
lub 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.
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.
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 :)
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.
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ć