Kolizje w grach 2D 2774 0

O temacie

Autor Ezzam

Zaczęty 14.09.2012 roku

Wyświetleń 2774

Odpowiedzi 0

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy

Ezzam

Kolizje w grach 2D
2012-09-14, 20:24(Ostatnia zmiana: 2012-09-14, 21:59)
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ą

Teoria
Sposó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 zrozumienia

Na 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.

Kod
void 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).

Ograniczenie
Ta 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łowie
Wię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
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry