/// <summary>
 /// Actualizamos la vista del area que hace las funciones de sensor del cuerpo para detectar el suelo.
 /// </summary>
 /// <param name="owner"></param>
 public void PostUpdate(Body owner)
 {
     sensor.X = owner.Rectangle.X;
     sensor.Y = owner.Rectangle.Y + owner.Rectangle.Height;
     sensor.Width = owner.Rectangle.Width - 1;
     sensor.Height = 1;
 }
 public Line(Vector2 a, Vector2 b, Body hitBody)
 {
     this.a = a; this.b = b; this.hitBody = hitBody;
 }
 public IntersectionPoint(Vector2 p, float distance, Body hitBody)
 {
     this.p = p; this.distance = distance; this.hitBody = hitBody;
 }
        /// <summary>
        /// Simulamos la logica de gravedad y deteccion de suelo del cuerpo.
        /// </summary>
        /// <param name="owner"></param>
        public void PreUpdate(Body owner)
        {
            Body[] collideWith;
            world.IntersectRect(sensor, out collideWith);
            {
                int condition = 0;
                for (int i = 0; i < collideWith.Length; i++)
                    if (collideWith[i] != owner && collideWith[i].Solid && collideWith[i].Enabled)
                        condition++;

                if (condition == 0) owner.Rectangle.Y+=10;
            }
        }
 /// <summary>
 /// Dibujamos el area del sensor.
 /// </summary>
 /// <param name="owner"></param>
 public void PostDraw(Body owner)
 {
     Helper.DrawBox(sensor, Color.Yellow);
 }
        /// <summary>
        /// LoadContent se llama una vez por juego y permite cargar
        /// todo el contenido.
        /// </summary>
        protected override void LoadContent()
        {
            // Crea un SpriteBatch nuevo para dibujar texturas.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // TODO: use this.Content para cargar aquí el contenido del juego
            this.IsMouseVisible = true;

            Helper.font = Content.Load<SpriteFont>("font");
            Helper.spriteBatch = spriteBatch;
            Helper.graphicDevice = GraphicsDevice;

            // Inicializamos el sistema de colisiones y añadimos objetos a la escena:
            world = new World();

            world.bodies.Add(new Body(new Rectangle(0, 0, 80, 80), Color.Green, true, true));
            world.bodies.Add(new Body(new Rectangle(0, 80, 80, 80), Color.Green, true, true));
            world.bodies.Add(new Body(new Rectangle(0, 80 * 2, 80, 80), Color.Green, true, true));
            world.bodies.Add(new Body(new Rectangle(0, 80 * 3, 80, 80), Color.Green, true, true));

            world.bodies.Add(new Body(new Rectangle(80, 80 * 3, 80, 80), Color.Green, true, true));
            world.bodies.Add(new Body(new Rectangle(80 * 2, 80 * 3, 80, 80), Color.Green, true, true));
            world.bodies.Add(new Body(new Rectangle(80 * 3, 80 * 3, 80, 80), Color.Green, true, true));

            world.bodies.Add(new Body(new Rectangle(80 * 3, 80, 80, 80), Color.Green, true, true));
            world.bodies.Add(new Body(new Rectangle(80 * 9, 80, 80, 80), Color.Green, true, true));

            world.bodies.Add(new Body(new Rectangle(0, 80 * 5, 80, 80), Color.Green, true, true));

            world.bodies.Add(new Body(new Rectangle(80 * 4, 80, 80, 20), Color.Green, true, true));

            world.bodies.Add(new Body(new Rectangle(80 * 2, 80, 80, 10), Color.Green, true, true));

            // Creamos un cuerpo no fijo que manejaremos como si fuera el jugador:
            body = new Body(new Rectangle(80 * 2, 80 * 2, 80, 80), Color.Red, false, true);
            body.Debug = true;
            world.bodies.Add(body);
            body.WorldInstance = world;
            body.PreUpdate += this.PreUpdate;
            body.PostUpdate += this.PostUpdate;
            body.PostDraw += this.PostDraw;

            // Creamos un cuerpo no solido que hara las veces de trigger (un lanzador de eventos):
            trigger = new Body(new Rectangle(80 * 6, 80 * 2, 80 * 2, 80 * 2), new Color(255, 0, 255, 128), true, false);
            world.bodies.Add(trigger);
            trigger.OnCollision += this.triggerOnCollision;

            // Definimos un rayo para trazar trayectorias con el entorno:
            ray = new RayTracer(world);
        }
 /// <summary>
 /// Evento de colision del area de trigger.
 /// </summary>
 /// <param name="owner"></param>
 public void triggerOnCollision(Body[] b)
 {
     onCollisionMessage = "El cuerpo esta colisionando con el area de trigger.";
 }
        /// <summary>
        /// Determina si un rectangulo intersecta con el area de algun cuerpo de la escena.
        /// </summary>
        /// <param name="rectangle">Rectangulo a evaluar.</param>
        /// <param name="collideWith">Devuelve la lista con los cuerpos con los que intersecta.</param>
        /// <returns>Devuelve verdadero si hay interseccion con algun cuerpo.</returns>
        public bool IntersectRect(Rectangle rectangle, out Body[] collideWith)
        {
            collides.Clear();
            foreach (Body body in bodies)
            {
                if (rectangle.Intersects(body.Rectangle))
                    collides.Add(body);
            }

            collideWith = collides.ToArray();
            return collides.Count > 0;
        }