Tym razem tutorial będzie na temat ogólnogamedevowy, a mianowicie wykrywanie i odpowiadanie na kolizje. Jest to prosta i skuteczna technika, dobra do wykorzystania w grach opartych na tile'ach (chociaż bezproblemowo działa przy prawie każdej kolizji opartej na prostokątach). Przykład będę wyjaśniał na podstawie XNA.
tak, obrazki też będąTeoriaSposób, o którym będę mówić, używa głębokości kolizji do określenia kierunku, z którego następuje. Jak to działa?
napisy na rysunkach są wzięte z kodu, tak dla łatwiejszego zrozumieniaNa obrazku widać poprzednią i aktualną pozycję naszego kwadratu. W miejscu, w którym znajduje się teraz, zderza się z terenem. Zajmiemy się teraz zamalowanym na niebiesko kawałkiem, który jest w stanie powiedzieć nam, skąd nadchodzi kolizja.
Na tym etapie obliczamy głębokość zderzenia na obu osiach. Jeśli zderzenie nastąpiło w pionie, wtedy głębokość kolizji będzie mniejsza w pionie i vice versa. Porównujemy ze sobą pozycję naszego prostokąta oraz przeszkody, znajdując kierunek zderzenia. Wtedy przesuwamy obiekt (gracza czy cokolwiek innego) o głębokość kolizji w znalezionym kierunku.
Kodvoid CheckForCollisions()
{
foreach (Rectangle rect in tiles)
{
Rectangle collisionRectangle = Rectangle.Intersect(rect, player);
if (collisionRectangle.Height < collisionRectangle.Width) // Kolizja w osi pionowej
{
if (player.Center.Y > rect.Center.Y) // Kolizja od dołu
{
player.Y += collisionRectangle.Height;
}
else // Kolizja z góry
{
player.Y -= collisionRectangle.Height;
}
}
else if (collisionRectangle.Width < collisionRectangle.Height) // Kolizja w osi poziomej
{
if (player.Center.X > rect.Center.X) // Kolizja z prawej
{
player.X += collisionRectangle.Width;
}
else // Kolizja z lewej
{
player.X -= collisionRectangle.Width;
}
}
}
}
Trochę wyjaśnienia: player to zwykły prostokąt, a tiles to lista prostokątów - przeszkód. Użyłem tu metody, której nie używałem we wcześniejszych tutorialach - Rectangle.Intersect. Jej zadaniem jest stworzenie nowego prostokąta w miejscu, w którym zderzają się dwa inne. Odczytuję wtedy szerokość i długość nowego prostokąta (xDepth oraz yDepth na obrazku).
OgraniczenieTa metoda, chociaż dobra, ma pewne ograniczenie - prostokąt nie może poruszać się zbyt szybko w stosunku do wielkości przeszkód. Wyjaśnienie:
Chociaż widzimy, że kolizja nadchodzi z lewej, to prostokąt porusza się na tyle szybko, że jego środek jest położony na prawo od środka przeszkody. Przez to kolizja jest wykrywana i rozwiązywana niepoprawnie. Bezpieczna prędkość to poniżej połowy szerokości przeszkody na klatkę (to i tak naprawdę szybko).
PosłowieWięc doszliśmy do końca tutoriala. Teraz powinniście wiedzieć, jak poprawnie radzić sobie ze zderzeniami w grach 2D.
Źródło:
https://dl.dropbox.com/u/67704253/Xna%20Tutorial/4/source4.zip