Example #1
0
            private static void OnTimedEvent(object source, ElapsedEventArgs e)
            {
                ModelInterface m       = Engine.GetInstance()._model;
                int            length  = m.GetBallCount();
                int            length2 = m.GetBrickCount();

                Vector2D msize        = m.GetMapDimensions();
                Vector2D shipPosition = m.GetShipPosition();
                Vector2D fallSpeed    = (length2 > 0) ? m.GetBrickSpeed(0) : null;

                Random r = new Random();
                double diff;

                Vector2D bposition, newPosition, newSpeed, bspeed;
                int      j, health;
                bool     chocked;

                // S'il n'y a plus de briques, on passe au niveau suivant
                if (length2 <= 0)
                {
                    m.SetLevel(m.GetLevel() + 1);
                    Engine.GetInstance().Restart();
                }

                // Pour chaque balle (car le moteur gère plusieurs balles même si on l'a limité pour la démonstration)
                for (int i = 0; i < length; i++)
                {
                    bspeed  = m.GetBallSpeed(i);
                    j       = 0;
                    chocked = false;
                    while (j < length2 && !chocked)
                    {
                        if (Tools.Utils.Intersects(m.GetBallBoundingBox(i), m.GetBrickBoundingBox(j)))
                        {
                            health = m.GetBrickHealth(j) - m.GetBallDamage(i);
                            m.SetBrickHealth(j, health);
                            if (health <= 0)
                            {
                                // Il faut corriger l'index car la brique va être supprimée dans le setbrickhealth
                                j--;
                                length2--;
                            }

                            // Le rebond est géré dans une classe utilitaire, ici on inverse X et Y
                            m.SetBallSpeed(i, Tools.Utils.ChocResult(bspeed));
                            chocked = true;
                        }
                        j++;
                    }

                    bposition   = m.GetBallPosition(i);
                    newPosition = bposition + bspeed;
                    newSpeed    = bspeed;

                    // On surveille que la balle ne soit pas sur le point de sortir de l'écran et on corrige par des rebonds sinon
                    if (newPosition.X < 0)
                    {
                        newPosition.invertX();
                        newSpeed.invertX();
                    }
                    else if (newPosition.X >= msize.X - 1)
                    {
                        newPosition.X = 2 * (msize.X - 1) - newPosition.X;
                        newSpeed.invertX();
                    }
                    else if (newPosition.Y >= msize.Y - 1)
                    {
                        newPosition.Y = 2 * (msize.Y - 1) - newPosition.Y;
                        newSpeed.invertY();
                    }
                    // La balle peut aussi rebondir sur le ship, nous le testons, si c'est le cas elle rebondit avec un petit aléa (diff)
                    else if (Tools.Utils.Intersects(m.GetBallBoundingBox(i), m.GetShipBoundingBox()))
                    {
                        newPosition.Y = 2 * (shipPosition.Y + m.GetShipDimensions().Y) - newPosition.Y;
                        newSpeed.invertY();

                        diff = r.NextDouble() / 2 * newSpeed.X * ((r.Next(2) < 1) ? -1 : 1);

                        newSpeed.X += diff;
                    }

                    m.SetBallPosition(i, newPosition);
                    m.SetBallSpeed(i, newSpeed);

                    // Si on a perdu la balle, on perd la partie
                    if (newPosition.Y < 0)
                    {
                        m.SetLost(true);
                        Engine.GetInstance().Stop();
                    }
                }

                // On va accélérer les briques en mode HighSpeedMode et aussi les déplacer
                for (j = 0; j < length2; j++)
                {
                    newSpeed    = fallSpeed + Engine.GetInstance()._configuration.GameMode.StepSpeed;
                    newPosition = m.GetBrickPosition(j) + m.GetBrickSpeed(j);
                    m.SetBrickPosition(j, newPosition);
                    m.SetBrickSpeed(j, newSpeed);

                    if (newPosition.Y < -1)
                    {
                        j--;
                        length2--;
                    }
                }

                // Enfin si le ship touche une brique, il la détruit mais est endommagé, s'il est détruit, on perd
                for (j = 0; j < length2; j++)
                {
                    if (Tools.Utils.Intersects(m.GetShipBoundingBox(), m.GetBrickBoundingBox(j)))
                    {
                        m.SetShipHealth(m.GetShipHealth() - m.GetBrickHealth(j));

                        if (m.GetShipHealth() <= 0)
                        {
                            m.SetLost(true);
                            Engine.GetInstance().Stop();
                        }

                        m.SetBrickHealth(j, 0);
                        j--;
                        length2--;
                    }
                }
            }