Ejemplo n.º 1
0
        /******************** Metody******************/

        public override void Aktualizuj(float dt)
        {
            //sprawdz klizje z kazdym z moich i rzuc event jesli zachodzi
            foreach (Kolider x in SilnikGry.ObecnaScena.DajKomponent(Nazwa)) //Sprawdz kolizje dla kazdego aktywnego komponentu na senie
            {
                Kolider kol1 = (Kolider)x;                                   //Rzutowanie komponentu na klasę kolidera
                if (kol1.warstwaFizyczna != warstwaFizyczna || kol1 == this)
                {
                    continue;                                                          //tylko kolidery w tej samej warstwie mogą kolidowac
                }
                if (SprawdzKolizje(kol1))
                {
                    InformujOKolizji(kol1, true);      //informuje siebie o kolizji
                    kol1.InformujOKolizji(this, true); //informuje drugi obiekt o kolizji
                }
                else
                {
                    InformujOKolizji(kol1, false);      //informuje siebie o braku kolizji
                    kol1.InformujOKolizji(this, false); //informuje drugi obiekt o braku kolizji
                }

                for (int i = 0; i < KolidujaceKolidery.Count; i++)
                {
                    Kolider kol2 = KolidujaceKolidery[i];
                    if (kol2.ObiektyGryKomponentu == null || !kol2.Aktywny)
                    {
                        KolidujaceKolidery.Remove(kol2);
                        i--;
                        WyjscieZKolizji?.Invoke(this, kol2);
                    }
                }
            }
        }
Ejemplo n.º 2
0
 /******************** Informacje o kolizji******************/
 private void InformujOKolizji(Kolider zKim, bool czyZderzenie)
 {
     if (czyZderzenie)                            //Jezlei zderzenie jest na true
     {
         if (!KolidujaceKolidery.Contains(zKim))  //Sprawdzamy, czy wczesniej nie kolidował
         {
             KolidujaceKolidery.Add(zKim);        //Dodajemy obiekt do listy koliderów
             WejscieWKolizje?.Invoke(this, zKim); //event mówiący o wejsciu w kolizje
         }
     }
     else //Jezeli nie ma kolizji obiektów
     {
         if (KolidujaceKolidery.Contains(zKim)) //sprawdzamy czy kolider znajduje się w liście Kolidującyhc
         {
             KolidujaceKolidery.Remove(zKim);     //Usuwamy kolidera, bo to oznacza, że juz przestał koilidować
             WyjscieZKolizji?.Invoke(this, zKim); //event o wyjściu z kolizji
         }
     }
 }
Ejemplo n.º 3
0
 /******************** Sprawdzanie kolizji + metody pomocnicze******************/
 bool SprawdzKolizje(Kolider kol)
 {
     if (warstwaFizyczna != kol.warstwaFizyczna || this == kol)
     {
         return(false);                     //sam ze soba ani w innej warstwie nie koliduj
     }
     for (int i = 0; i < Punkty.Count; i++) //dla kazdego z odcinokow tego kolidera
     {
         Point p1 = PunktyPoTransformacji(Punkty[i]);
         Point p2 = PunktyPoTransformacji(Punkty[(i + 1) % Punkty.Count]);
         for (int j = 0; j < kol.Punkty.Count; j++)  //sprawdz z kazdym odcinkiem innego kolidera
         {
             Point p3 = PunktyPoTransformacji(kol.Punkty[i]);
             Point p4 = PunktyPoTransformacji(kol.Punkty[(i + 1) % kol.Punkty.Count]);
             if (CzySiePrzecinaja(p1, p2, p3, p4))
             {
                 return(true);                                   //jak sie przecinaja to musza kolidowac
             }
         }
     }
     return(false);    //jak sie odnicki nie przecinaly to sa to calkiem rozlaczne wielokaty
 }