예제 #1
0
    /// <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); });
    }