/// <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); }
/// <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); }