示例#1
0
		/// <summary>
		/// This function contains the code that controls the mouse. It decides what the
		/// mouse should do based on the position of the cat: if the cat is too close,
		/// it will attempt to flee. Otherwise, it will idly wander around the screen.
		/// 
		/// </summary>
		private void UpdateMouse ()
		{
			// first, calculate how far away the mouse is from the cat, and use that
			// information to decide how to behave. If they are too close, the mouse
			// will switch to "active" mode - fleeing. if they are far apart, the mouse
			// will switch to "idle" mode, where it roams around the screen.
			// we use a hysteresis constant in the decision making process, as described
			// in the accompanying doc file.
			float distanceFromCat = Vector2.Distance (mousePosition, catPosition);

			// the cat is a safe distance away, so the mouse should idle:
			if (distanceFromCat > MouseEvadeDistance + MouseHysteresis) {
				mouseState = MouseAiState.Wander;
			}
			// the cat is too close; the mouse should run: 
			else if (distanceFromCat < MouseEvadeDistance - MouseHysteresis) {
				mouseState = MouseAiState.Evading;
			}
			// if neither of those if blocks hit, we are in the "hysteresis" range,
			// and the mouse will continue doing whatever it is doing now.

			// the mouse will move at a different speed depending on what state it
			// is in. when idle it won't move at full speed, but when actively evading
			// it will move as fast as it can. this variable is used to track which
			// speed the mouse should be moving.
			float currentMouseSpeed;

			// the second step of the Update is to change the mouse's orientation based
			// on its current state.
			if (mouseState == MouseAiState.Evading) {
				// If the mouse is "active," it is trying to evade the cat. The evasion
				// behavior is accomplished by using the TurnToFace function to turn
				// towards a point on a straight line facing away from the cat. In other
				// words, if the cat is point A, and the mouse is point B, the "seek
				// point" is C.
				//     C
				//   B
				// A
				Vector2 seekPosition = 2 * mousePosition - catPosition;

				// Use the TurnToFace function, which we introduced in the AI Series 1:
				// Aiming sample, to turn the mouse towards the seekPosition. Now when
				// the mouse moves forward, it'll be trying to move in a straight line
				// away from the cat.
				mouseOrientation = TurnToFace (mousePosition, seekPosition, 
					mouseOrientation, MouseTurnSpeed);

				// set currentMouseSpeed to MaxMouseSpeed - the mouse should run as fast
				// as it can.
				currentMouseSpeed = MaxMouseSpeed;
			} else {
				// if the mouse isn't trying to evade the cat, it should just meander
				// around the screen. we'll use the Wander function, which the mouse and
				// tank share, to accomplish this. mouseWanderDirection and
				// mouseOrientation are passed by ref so that the wander function can
				// modify them. for more information on ref parameters, see
				// http://msdn2.microsoft.com/en-us/library/14akc2c7(VS.80).aspx
				Wander (mousePosition, ref mouseWanderDirection, ref mouseOrientation, 
					MouseTurnSpeed);

				// if the mouse is wandering, it should only move at 25% of its maximum
				// speed. 
				currentMouseSpeed = .25f * MaxMouseSpeed;
			}

			// The final step is to move the mouse forward based on its current
			// orientation. First, we construct a "heading" vector from the orientation
			// angle. To do this, we'll use Cosine and Sine to tell us the x and y
			// components of the heading vector. See the accompanying doc for more
			// information.
			Vector2 heading = new Vector2 (
				(float)Math.Cos (mouseOrientation), (float)Math.Sin (mouseOrientation));

			// by multiplying the heading and speed, we can get a velocity vector. the
			// velocity vector is then added to the mouse's current position, moving him
			// forward.
			mousePosition += heading * currentMouseSpeed;
		}
示例#2
0
        /// <summary>
        /// This function contains the code that controls the mouse. It decides what the
        /// mouse should do based on the position of the cat: if the cat is too close,
        /// it will attempt to flee. Otherwise, it will idly wander around the screen.
        ///
        /// </summary>
        private void UpdateMouse()
        {
            // first, calculate how far away the mouse is from the cat, and use that
            // information to decide how to behave. If they are too close, the mouse
            // will switch to "active" mode - fleeing. if they are far apart, the mouse
            // will switch to "idle" mode, where it roams around the screen.
            // we use a hysteresis constant in the decision making process, as described
            // in the accompanying doc file.
            float distanceFromCat = Vector2.Distance(mousePosition, catPosition);

            // the cat is a safe distance away, so the mouse should idle:
            if (distanceFromCat > MouseEvadeDistance + MouseHysteresis)
            {
                mouseState = MouseAiState.Wander;
            }
            // the cat is too close; the mouse should run:
            else if (distanceFromCat < MouseEvadeDistance - MouseHysteresis)
            {
                mouseState = MouseAiState.Evading;
            }
            // if neither of those if blocks hit, we are in the "hysteresis" range,
            // and the mouse will continue doing whatever it is doing now.

            // the mouse will move at a different speed depending on what state it
            // is in. when idle it won't move at full speed, but when actively evading
            // it will move as fast as it can. this variable is used to track which
            // speed the mouse should be moving.
            float currentMouseSpeed;

            // the second step of the Update is to change the mouse's orientation based
            // on its current state.
            if (mouseState == MouseAiState.Evading)
            {
                // If the mouse is "active," it is trying to evade the cat. The evasion
                // behavior is accomplished by using the TurnToFace function to turn
                // towards a point on a straight line facing away from the cat. In other
                // words, if the cat is point A, and the mouse is point B, the "seek
                // point" is C.
                //     C
                //   B
                // A
                Vector2 seekPosition = 2 * mousePosition - catPosition;

                // Use the TurnToFace function, which we introduced in the AI Series 1:
                // Aiming sample, to turn the mouse towards the seekPosition. Now when
                // the mouse moves forward, it'll be trying to move in a straight line
                // away from the cat.
                mouseOrientation = TurnToFace(mousePosition, seekPosition,
                                              mouseOrientation, MouseTurnSpeed);

                // set currentMouseSpeed to MaxMouseSpeed - the mouse should run as fast
                // as it can.
                currentMouseSpeed = MaxMouseSpeed;
            }
            else
            {
                // if the mouse isn't trying to evade the cat, it should just meander
                // around the screen. we'll use the Wander function, which the mouse and
                // tank share, to accomplish this. mouseWanderDirection and
                // mouseOrientation are passed by ref so that the wander function can
                // modify them. for more information on ref parameters, see
                // http://msdn2.microsoft.com/en-us/library/14akc2c7(VS.80).aspx
                Wander(mousePosition, ref mouseWanderDirection, ref mouseOrientation,
                       MouseTurnSpeed);

                // if the mouse is wandering, it should only move at 25% of its maximum
                // speed.
                currentMouseSpeed = .25f * MaxMouseSpeed;
            }

            // The final step is to move the mouse forward based on its current
            // orientation. First, we construct a "heading" vector from the orientation
            // angle. To do this, we'll use Cosine and Sine to tell us the x and y
            // components of the heading vector. See the accompanying doc for more
            // information.
            Vector2 heading = new Vector2(
                (float)Math.Cos(mouseOrientation), (float)Math.Sin(mouseOrientation));

            // by multiplying the heading and speed, we can get a velocity vector. the
            // velocity vector is then added to the mouse's current position, moving him
            // forward.
            mousePosition += heading * currentMouseSpeed;
        }