protected override Vector2 DangerAcceleration() { var predators = VisibleEntities.OfType <Predator>().Where(b => b.IsAlive).ToList(); var acceleration = new Vector2(0, 0); acceleration += Vector2.Multiply(Flee(predators), 7f); return(acceleration); }
protected Vector2 Separate(float desiredSeperation) { var steer = new Vector2(0, 0); var others = VisibleEntities.OfType <Being>().Where(being => being.IsAlive && being.GetType() == GetType()); if (!others.Any()) { return(steer); } foreach (var other in others) { if (other == this) { continue; } var distance = VectorHelper.TorusDistance(Position, other.Position); if (distance < desiredSeperation) { var difference = Vector2.Subtract(Position, other.Position); if (difference.Length() > 0) { difference = Vector2.Normalize(difference); } // Weight by distance if (distance != 0) { difference = Vector2.Divide(difference, distance); } steer = Vector2.Add(steer, difference); } } steer = Vector2.Divide(steer, others.Count()); if (steer.Length() > 0) { if (steer.Length() > 0) { steer = Vector2.Normalize(steer); } steer = Vector2.Multiply(steer, MaxSpeed); steer = Vector2.Subtract(steer, Velocity); steer = VectorHelper.Limit(steer, MaxForce); } return(steer); }
protected override Vector2 HungryAcceleration() { var boids = VisibleEntities.OfType <Boid>().Where(b => b.IsAlive).ToList(); var predators = VisibleEntities.OfType <Predator>().Where(b => b.IsAlive).ToList(); var acceleration = new Vector2(0, 0); acceleration += Vector2.Multiply(Flee(predators), 2f); acceleration += Vector2.Multiply(Separate(10f), 0.5f); acceleration += Vector2.Multiply(Align(boids), 0.5f); acceleration += Vector2.Multiply(Cohesion(boids), 0.5f); acceleration += Vector2.Multiply(Hunt(), 5f); acceleration += Vector2.Multiply(Attack(), 10f); return(acceleration); }