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