Autor Wątek: C# XNA - Problem z kolizja kwadratową  (Przeczytany 1261 razy)

Offline hudypatyk

  • Użytkownik

# Marzec 28, 2013, 15:48:07
Witam mam następujący problem, piszę prostą grę w 2D. posiadam już ładnie wy renderowany świat gry 1000x900 z obiektami oraz zaimplementowaną fizykę odpowiedzialną za grawitację, czyli jak nacisnę klawisz UP to gracz podskakuje otrzymując pewną prędkość początkową X aby następnie ją wytracić  i dojść do punktu 0 a następnie opadać do momentu  kolizji z jakimś z obiektów ( w tym przypadku są to poziomy). Problem polega na tym, że jak odległość między Top graczem a kolejnym 'poziomem' Bot jest mniejszy niż pierwsza faza ruchu gracza (czyli wytracanie prędkości do punktu 0) to gracz przechodzi przez 'ściany'. Nie mam pomysłu jak obsłużyć to zdarzenie.
Tutaj kod odpowiedzialny za poruszanie i wykrywanie kolizji:

       
        public void PoruszanieGraczem()
        {
            pozPopGracz = PozycjaObiektu;
            if (Keyboard.GetState().IsKeyDown(Keys.Left))
            {
                if (PozycjaObiektu.X > Game.GraphicsDevice.Viewport.X + 20)
                {
                    PozycjaObiektu -= new Vector2(PredkoscPoruszania.X, 0);
                }
                if (CzyKolizja() == true)
                {
                    PozycjaObiektu = new Vector2(pozPopGracz.X, PozycjaObiektu.Y);
                }
            }
            if (Keyboard.GetState().IsKeyDown(Keys.Right))
            {
                if (PozycjaObiektu.X < Game.GraphicsDevice.Viewport.Width - TeksturaObiektu.Width - 20)
                {
                    PozycjaObiektu += new Vector2(PredkoscPoruszania.X, 0);
                }
                if (CzyKolizja() == true)
                {
                    PozycjaObiektu = new Vector2(pozPopGracz.X, PozycjaObiektu.Y);
                }
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Up))
            {
                if (PozycjaObiektu.Y > Game.GraphicsDevice.Viewport.Y + 20)
                {
                    if (CzyKolizja())
                    {

                            PozycjaObiektu = new Vector2(PozycjaObiektu.X, pozPopGracz.Y); 
                            predkosc = -wyskok;
                    }
                }

            }
            if (PozycjaObiektu.Y > Game.GraphicsDevice.Viewport.Y + 20)
            {

                predkosc += grawitacja;
                if (predkosc.Y > 3)
                {
                    predkosc.Y = 3;               
                }
                PozycjaObiektu += predkosc;   
                if (CzyKolizja())
                {
                    if (Keyboard.GetState().IsKeyUp(Keys.Up))
                    {
                        PozycjaObiektu = new Vector2(PozycjaObiektu.X, pozPopGracz.Y);
                        predkosc = Vector2.Zero;
                    }
                }
           
            }
        }
       
       private bool CzyKolizja()
        {
            Rectangle pozGra = new Rectangle((int)PozycjaObiektu.X, (int)PozycjaObiektu.Y, TeksturaObiektu.Width, TeksturaObiektu.Height);
            for (int i = 0; i < Mapa.IloscKrawedziMapy; i++)
            {
                if (pozycjeKlockow[i].Intersects(pozGra))
                {
                    return true;
                }
            }
            return false;
        }
Oraz w załączniku .exe jak by ktoś nie zrozumiał mojego tłumaczenia :d

Offline Mr. Spam

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

Offline Xirdus

  • Redaktor

# Marzec 28, 2013, 16:15:12
Znaczy się, jak podskoczysz i uderzysz głową w platformę, to pojawiasz się na jej górze?

Offline hudypatyk

  • Użytkownik

# Marzec 28, 2013, 16:28:04
Tak, Jak trzymam przycisk UP to przelatuje przez platformę i po chwili pokazuje się po drugiej stronie (czyli na gorze). Jak raz nacisnę, szybko UP to gracz zatrzymuje się w środku platformy, kolejne naciśnięcia UP wypluwają go na wierzch.

@edit
Wydaje mi się, że problem tkwi gdzieś w obsłudze przycisku UP i w ostatnim if'ie

@edit 30.03.2013
Udało się rozwiązać problem, trzeba było napisać osobną funkcje do obsługi kolizji z górna krawędzią.
« Ostatnia zmiana: Marzec 30, 2013, 01:51:08 wysłana przez hudypatyk »