Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }