예제 #1
0
        /// <summary>
        /// Actualiza el estado de la escena.
        /// </summary>
        public void Update()
        {
            // Actualizamos los estados de todos los cuerpos de la escena que no sean fijos y esten activos:
            foreach (Body body in bodies)
            {
                // Si se definio, ejecutamos el metodo de pre actualizacion del cuerpo:
                if (body.PreUpdate != null) body.PreUpdate(body);
                body.Update();
            }

            // Recorremos la lista de cuerpos de la escena y calculamos sus colisiones y su respuesta en caso de haber colision:
            foreach (Body currentBody in bodies)
            {
                // Buscamos colisiones con el resto de cuerpos de la escena:
                collisions.Clear();
                foreach (Body body in bodies)
                {
                    // Descartamos al cuerpo actual en la busqueda:
                    if (currentBody != body && currentBody.Enabled)
                        if (currentBody.Rectangle.Intersects(body.Rectangle))
                            collisions.Add(body);
                }

                // Evaluamos la respuesta a la colision:
                if (collisions.Count > 0)
                {
                    // Si hay colisiones con el cuerpo actual lanzamos el evento y enviamos la lista de cuerpos que colisionan:
                    if (currentBody.OnCollision != null)
                        currentBody.OnCollision(collisions.ToArray());

                    // Descartamos primero cualquier cuerpo que no sea solido para no calcular respuesta con el:
                    List<Body> collisionsToResponse = new List<Body>();
                    foreach (Body body in collisions)
                        if (body.Solid && body.Fixed) collisionsToResponse.Add(body);

                    if (collisionsToResponse.Count > 0)
                    {
                        // Invertimos el angulo de direccion que tenia el cuerpo:
                        float dir = currentBody.Direction + (currentBody.Direction > 180 ? -180 : 180);

                        // Si hay colisiones obtenemos la respuesta a la colision para recolocar el cuerpo:
                        int count; do
                        {
                            // Retrocediendo un pixel en la direccion opuesta que recorria el cuerpo:
                            currentBody.Location = MathTools.Move(currentBody.Location, 1, dir);

                            // Comprobamos las colisiones restantes:
                            count = collisionsToResponse.Count;
                            foreach (Body b in collisionsToResponse)
                                if (!currentBody.Rectangle.Intersects(b.Rectangle)) count--;
                        }
                        while (count > 0);

                        // Igualamos la ultima posicion con la actual de la correccion para anular la direccion tomada en el proximo Update() del cuerpo:
                        currentBody.lastPoint = currentBody.Location; 
                    }
                }
            }

            // Si se definio, ejecutamos el metodo de post actualizacion del cuerpo:
            foreach (Body body in bodies)
                if (body.PostUpdate != null) body.PostUpdate(body);
        }
예제 #2
0
 /// <summary>
 /// Dibuja una linea.
 /// </summary>
 /// <param name="a">Punto de inicio de la linea.</param>
 /// <param name="b">Punto final de la linea.</param>
 /// <param name="color">Color de la linea.</param>
 public static void DrawLine(Vector2 a, Vector2 b, Color color)
 {
     if (dummy == null)
     {
         CreateDummyTexture();                // Si no se inicializo la textura base se inicializa.
     }
     // Dibujamos la textura estirada y aplicando el angulo correcto:
     spriteBatch.Draw(dummy, new Rectangle((int)a.X, (int)a.Y, (int)Vector2.Distance(a, b), 1), null, color, MathHelper.ToRadians(MathTools.GetAngle(a, b)), Vector2.Zero, SpriteEffects.None, 0);
 }