/******************** 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); } } } }
/******************** 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 } } }