/// <summary> /// Aliohjelma joka on vastuussa erilaisista törmäyksenkäsittelyistä /// </summary> /// <param name="whiteBall">Beginissä alustettu valkoinen pallo</param> /// <param name="ballList">Lista pelissä olevista palloista</param> private void Collisions(PhysicsObject whiteBall, List <PhysicsObject> ballList) { // Törmäyskäsittelijä joka toistaa ääniluokasta äänen kun objekti törmää laitaan void wallSound(PhysicsObject collidingBall, PhysicsObject collisionTarget) { if (collisionTarget.Tag.ToString() == "edge") { Sfx.PlayWall(); } } // Kun pelipallo törmää toiseen palloon, toistetaan tämä ääni void ballSound(PhysicsObject whiteBall, PhysicsObject collisionTarget) { // Muunnetaan pallon tagi stringiksi ja tarkistetaan sisältääkö stringi kirjaimen p niinkuin pallo. String collidingBall = collisionTarget.Tag.ToString(); bool isBall = collidingBall.Contains("p"); if (isBall == true) { Sfx.PlayBall(); } } // Funktio joka käsittelee kun valkoinen pallo joutuu pussitettavaksi void whiteBallPocket(PhysicsObject whiteBall, PhysicsObject collisionTarget) { if (collisionTarget.Tag.ToString() == "pocketCollision") { Sfx.PlayFail(); MessageDisplay.Add("Valkoinen taskussa"); pointCounter.Value -= 5; // Pysäyttää valkoisen pallon ja siirtää sen ruudun ulkopuolelle (jotta pallo ei liiku kun se palautetaan= whiteBall.Velocity = new Vector(0, 0); whiteBall.Position = new Vector(10000, 0); Timer ballPocketed = new Timer { Interval = 0.16 }; // Jos voidaan lyödä, siirrä pallo takaisin pöydälle ja pysäytä ajastin ballPocketed.Timeout += (delegate { if (CanHit == true) { whiteBall.Position = new Vector(200, 0); ballPocketed.Stop(); } }); // Käynnistä ajastin pallon palauttamiseksi ballPocketed.Start(); } } // Funktio joka käsittelee muiden pallojen pussitetuksijoutumisen void ballPocket(PhysicsObject collidingBall, PhysicsObject collisionTarget) { // Vie pelin pallot väliaikaisesti uuteen listaan List <PhysicsObject> removeBallList = new List <PhysicsObject>(); BallsInGame.ForEach(ball => removeBallList.Add(ball)); if (collisionTarget.Tag.ToString() == "pocketCollision") { // Jos pussitettava pallo on kasipallo ja palloja on muitakin jäljellä, suorittaa Fail(); if (BallsInGame.Count > 1 && collidingBall.Tag.ToString() == "p8") { Fail(); } // Mikäli pussitettava pallo on kasipallo ja se on viimeinen pallo, suorittaa Win(); if (BallsInGame.Count == 1 && collidingBall.Tag.ToString() == "p8") { Win(); } Sfx.PlayWin(); // Oikeasti? Enkö voi lambdalla poistaa suoraan? // Poistaa väliaikaisesta listasta pallon tagin osoittamasta indeksistä removeBallList.RemoveAt(removeBallList.FindIndex(ball => ball.Tag == collidingBall.Tag)); // Vie uuden listan yleiselle listamuuttujalle BallsInGame = removeBallList; // Asetetaan pussitetun pallon velocity nollaan collidingBall.Velocity = new Vector(0, 0); collidingBall.Destroy(); pointCounter.Value += 5; } } // Lisätään ylläoleva törmäyksenkäsittelijä valkoiseen palloon AddCollisionHandler(whiteBall, wallSound); // Lisätään jokaiselle tavalliselle pallolle ääniefekti törmätessään seinään ballList.ForEach(regularBall => { AddCollisionHandler(regularBall, wallSound); }); // Ääniefekti kun pelipallo ja muut pallot törmäävät toisiinsa AddCollisionHandler(whiteBall, ballSound); // Tapahtumankäsittelijä kun pelipallo joutuu pussitettavaksi AddCollisionHandler(whiteBall, whiteBallPocket); // Lisätään jokaiselle tavalliselle pallolle törmäyksentunnistus ballList.ForEach(pallo => { AddCollisionHandler(pallo, ballPocket); }); }