public void InitialiseModel(ModelInterface m) { MapGenerator g = this.GameMode.Generator; m.SetStopped(false); m.SetLost(false); m.SetMapDimensions(new Vector2D(this.Width, this.Height)); this._ship.Position = new Vector2D((this.Width - this._ship.Dimension.X) / 2, 0); m.AddShip(this._ship); m.SetBricks(g.generateMap(m.GetLevel(), this.Width, this.LevelHeight, this.GameMode.MinSpeed)); m.RemoveBalls(); m.AddBall(); }
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--; } } }