コード例 #1
0
ファイル: CohesionBehavior.cs プロジェクト: khoatle/game
        /// <summary>
        /// CohesionBehavior.Update infuences the owning animal to move towards the
        /// otherAnimal that it sees as long as it isn’t too close, in this case 
        /// that means inside the separationDist in the passed in AIParameters.
        /// </summary>
        /// <param name="otherAnimal">the Animal to react to</param>
        /// <param name="aiParams">the Behaviors' parameters</param>
        public override void Update(Animal otherAnimal, AIParameters aiParams)
        {
            base.ResetReaction();

            Vector3 pullDirection = Vector3.Zero;
            float weight = aiParams.PerMemberWeight;

            //if the otherAnimal is too close we dont' want to fly any
            //closer to it
            if (Animal.ReactionDistance > 0.0f
                && Animal.ReactionDistance > aiParams.SeparationDistance)
            {
                //We want to make the animal move closer the the otherAnimal so we
                //create a pullDirection vector pointing to the otherAnimal bird and
                //weigh it based on how close the otherAnimal is relative to the
                //AIParameters.separationDistance.
                pullDirection = -(Animal.Location - Animal.ReactionLocation);
                Vector3.Normalize(ref pullDirection, out pullDirection);

                weight *= (float)Math.Pow((double)
                    (Animal.ReactionDistance - aiParams.SeparationDistance) /
                        (aiParams.DetectionDistance - aiParams.SeparationDistance), 2);

                pullDirection *= weight;

                reacted = true;
                reaction = pullDirection;
            }
        }
コード例 #2
0
ファイル: SeparationBehavior.cs プロジェクト: khoatle/game
        /// <summary>
        /// separationBehavior.Update infuences the owning animal to move away from
        /// the otherAnimal is it’s too close, in this case if it’s inside 
        /// AIParameters.separationDistance.
        /// </summary>
        /// <param name="otherAnimal">the Animal to react to</param>
        /// <param name="aiParams">the Behaviors' parameters</param>
        public override void Update(Animal otherAnimal, AIParameters aiParams)
        {
            base.ResetReaction();

            Vector3 pushDirection = Vector3.Zero;
            float weight = aiParams.PerMemberWeight;

            if (Animal.ReactionDistance > 0.0f &&
                Animal.ReactionDistance <= aiParams.SeparationDistance)
            {
                //The otherAnimal is too close so we figure out a pushDirection
                //vector in the opposite direction of the otherAnimal and then weight
                //that reaction based on how close it is vs. our separationDistance

                pushDirection = Animal.Location - Animal.ReactionLocation;
                Vector3.Normalize(ref pushDirection, out pushDirection);

                //push away
                weight *= (1 -
                    (float)Animal.ReactionDistance / aiParams.SeparationDistance);

                pushDirection *= weight;

                reacted = true;
                reaction += pushDirection;
            }
        }
コード例 #3
0
ファイル: AlignBehavior.cs プロジェクト: khoatle/game
        /// <summary>
        /// AlignBehavior.Update infuences the owning animal to move in same the 
        /// direction as the otherAnimal that it sees.
        /// </summary>
        /// <param name="otherAnimal">the Animal to react to</param>
        /// <param name="aiParams">the Behaviors' parameters</param>
        public override void Update(Animal otherAnimal, AIParameters aiParams)
        {
            base.ResetReaction();

            if (otherAnimal != null)
            {
                reacted = true;
                reaction = otherAnimal.Direction * aiParams.PerMemberWeight;
            }
        }
コード例 #4
0
ファイル: AlignBehavior.cs プロジェクト: khoatle/game
 public AlignBehavior(Animal animal)
     : base(animal)
 {
 }
コード例 #5
0
ファイル: SeparationBehavior.cs プロジェクト: khoatle/game
 public SeparationBehavior(Animal animal)
     : base(animal)
 {
 }
コード例 #6
0
ファイル: CohesionBehavior.cs プロジェクト: khoatle/game
 public CohesionBehavior(Animal animal)
     : base(animal)
 {
 }
コード例 #7
0
ファイル: Fish.cs プロジェクト: khoatle/game
        /// <summary>
        /// React to an Animal based on it's type
        /// </summary>
        /// <param name="animal"></param>
        public void ReactTo(Animal animal, ref AIParameters AIparams)
        {
            if (animal != null)
            {
                //setting the the reactionLocation and reactionDistance here is
                //an optimization, many of the possible reactions use the distance
                //and location of theAnimal, so we might as well figure them out
                //only once !
                Vector3 otherLocation = animal.Location;
                ClosestLocation(ref location, ref otherLocation,
                    out reactionLocation);
                reactionDistance = Vector3.Distance(location, reactionLocation);

                //we only react if theAnimal is close enough that we can see it
                if (reactionDistance < AIparams.DetectionDistance)
                {
                    Behaviors reactions = behaviors[animal.AnimalType];
                    foreach (Behavior reaction in reactions)
                    {
                        reaction.Update(animal, AIparams);
                        if (reaction.Reacted)
                        {
                            aiNewDir += reaction.Reaction;
                            aiNumSeen++;
                        }
                    }
                }
            }
        }
コード例 #8
0
ファイル: Behavior.cs プロジェクト: khoatle/game
 /// <summary>
 /// Abstract function that the subclass must impliment. Figure out the 
 /// Behavior reaction here.
 /// </summary>
 /// <param name="otherAnimal">the Animal to react to</param>
 /// <param name="aiParams">the Behaviors' parameters</param>
 public abstract void Update(Animal otherAnimal, AIParameters aiParams);
コード例 #9
0
ファイル: Behavior.cs プロジェクト: khoatle/game
 protected Behavior(Animal animal)
 {
     this.animal = animal;
 }