Ejemplo n.º 1
0
 /**
  * Each frame, the current state must provide five things:
  *
  *  Vector3 targetPosition = the position in the world that the helicopter should fly to
  *  float currSpeed = the speed that the helicopter should move towards that position
  *  Quaternion desiredSpotlightRotation = the Quaternion representation of the rotation that the spotlight should rotate towards
  *  float spotlightMoveSpeed = the speed that the spotlight should rotate towards that rotation
  *  bool newDirection = For this frame, newDirection = 1 if movingRight should be changed, 0 if it should stay the same.
  */
 private void updateState()
 {
     state                        = state.updateState(Time.deltaTime);
     movingRight                  = (state.newDirection()) ? !movingRight : movingRight;
     transform.position           = Vector3.MoveTowards(transform.position, state.getTargetPosition(), state.getCurrSpeed() * Time.deltaTime);
     spotlight.transform.rotation = Quaternion.RotateTowards(spotlight.transform.rotation, state.getTargetSpotlightRotation(), state.getSpotlightRotationSpeed() * Time.deltaTime);
 }
Ejemplo n.º 2
0
    public SearchInFrenzyState(HeliScript helicopter, float deltaTime, PursuitState comingFrom, HelicopterState afterLosing)
    {
        Debug.Log("Searching");
        //Initializing default, independent vals for behavioral variables
        this.helicopter = helicopter;
        this.comingFrom = comingFrom;
        goBackToPursuit = false;
        ifLost          = afterLosing;

        //Interacting with the frenzy controller
        frenzy = GameObject.Find("FrenzyController").GetComponent <FrenzyMode>();

        rootPos    = frenzy.getLastKnownPlayerPosition();
        rootPos.y += helicopter.vertDistanceFromPlayerInChase;

        //Getting the actual player we're chasing down
        player          = GameObject.Find("Player");
        lastSeenToRight = player.transform.position.x > rootPos.x;


        targetPosition          = rootPos + new Vector3(searchDist, 0, 0);
        targetSpotlightRotation = helicopter.getSpotlight().transform.rotation;
        //These two variables are never updated during pursuit state
        currSpeed = helicopter.speed * helicopter.frenzySpeedBonus;
        spotlightRotationSpeed = helicopter.spotlightRotationSpeedChase;

        //Updates to be ready for the first frame
        updateState(deltaTime);
    }
Ejemplo n.º 3
0
    /**
     * The default constructor for FlipState.
     * This makes the assumption that we can finish this FlipState with
     * the position of the helicopter after the flip as the root, and then
     * begin the movement pattern from there (starting sine wave at t=0).
     * Because of this, this shouldn't be called by IdleState, as it can
     * result in the helicopter repeatedly changing it's anchor height after
     * every flip, over time making the helicopter descend or ascend significantly
     */
    public FlipState(HeliScript helicopter, float deltaTime, HelicopterState toReturnTo)
    {
        //Initializing default, independent vals for behavioral variables
        this.helicopter  = helicopter;
        timeIntoFlip     = 0f;
        haveFlipped      = false;
        flippedThisFrame = false;
        rootPosition     = toReturnTo.getTargetPosition();
        rootPosition.y  -= helicopter.yOffsetMovement.indexedValue();         //since we adjust for bob, remove from root position
        this.toReturnTo  = toReturnTo;
        justSawPlayer    = false;
        initialSpeed     = (helicopter.getMovingRight()) ? helicopter.speed : -helicopter.speed;

        //initalize debug vars
        //currSpeedDebug = new List<float>();
        //targetPositionDebug = new List<float> ();

        //Shortcuts for accessing frequent variables without reaching back into helicopter each time
        lengthOfFlipInSeconds       = helicopter.flipTime;
        halfwayPoint                = lengthOfFlipInSeconds / 2;
        spotlightRotationBeforeFlip = helicopter.getSpotlight().transform.rotation;

        //Only need to calculate new spotlight rotation once, as it is simply the negated spotlight's rotation along the z axis
        targetSpotlightRotation = calculateNewSpotlightRotation();

        //Similarly, only need to calculate spotlight rotation speed once, as it's just the value that is scaled by time
        //to allow the spotlight to rotate smoothly and end exactly on the rotation point at helicopter.flipTime seconds
        spotlightRotationSpeed = calculateSpotlightRotationSpeed(targetSpotlightRotation.eulerAngles.z);
        //Must call this once during the constructor so that we have values initiated for the first frame of it's instantiation
        updateState(deltaTime);
    }
Ejemplo n.º 4
0
    void Start()
    {
        frenzy = GameObject.Find("FrenzyController").GetComponent <FrenzyMode>();

        //Gets important components for behavior
        sr        = GetComponent <SpriteRenderer> ();
        spotlight = GameObject.Find("2DLight");
        initializeSinusoidals();


        //begins helicopter behavior
        state = new IdleState(this, Time.deltaTime);
    }
Ejemplo n.º 5
0
 /**
  * Checks to see if a new state is required, and if so, returns that new state
  */
 public HelicopterState updateState(float deltaTime)
 {
     //Logic for checking whether there should be a new state
     if (toDoFirst != null)
     {
         HelicopterState temp = toDoFirst;
         toDoFirst = null;
         return(temp);
     }
     if (helicopter.transform.position.Equals(targetPosition))
     {
         return(nextState);
     }
     return(this);
 }
Ejemplo n.º 6
0
    //Constructor run when creating IdleState
    public ReturnToStateState(HeliScript helicopter, float deltaTime, HelicopterState toReturnTo)
    {
        this.helicopter         = helicopter;
        nextState               = toReturnTo;
        targetPosition          = nextState.getTargetPosition();
        spotlightRotationSpeed  = nextState.getSpotlightRotationSpeed();
        targetSpotlightRotation = nextState.getTargetSpotlightRotation();
        currSpeed               = helicopter.speed;

        if ((helicopter.getMovingRight() && toReturnTo.getTargetPosition().x < helicopter.transform.position.x) ||
            (!helicopter.getMovingRight() && toReturnTo.getTargetPosition().x > helicopter.transform.position.x))
        {
            //We gotta turn around first
            toDoFirst = new FlipState(helicopter, deltaTime, this);
        }

        updateState(deltaTime);
    }
Ejemplo n.º 7
0
    //rootState needs to be the staet that the helicopter will return to after the player escapes
    public PursuitState(HeliScript helicopter, float deltaTime, HelicopterState rootState)
    {
        //Initializing default, independent vals for behavioral variables
        this.helicopter     = helicopter;
        this.cameFrom       = rootState;
        heightFromPlayer    = helicopter.vertDistanceFromPlayerInChase;
        timeSincePlayerSeen = 0f;

        //Getting the actual player we're chasing down
        player = GameObject.Find("Player");

        //Interacting with the frenzy controller
        frenzy = GameObject.Find("FrenzyController").GetComponent <FrenzyMode>();
        frenzy.canSeePlayer(this.helicopter);

        //These two variables are never updated during pursuit state
        currSpeed = helicopter.speed * helicopter.frenzySpeedBonus;
        spotlightRotationSpeed = helicopter.spotlightRotationSpeedChase;

        //Updates to be ready for the first frame
        updateState(deltaTime);
    }
Ejemplo n.º 8
0
 public void findPlayer()
 {
     state = new SearchInFrenzyState(this, 0.1f, new PursuitState(this, 0.1f, state), state);
 }
Ejemplo n.º 9
0
 /**
  * Don't use this unless it's an emergency!
  * State behavior should *always* be handled by the states themselves
  * The only time this is called is when the player dies.
  * Messing with the states through HeliScript breaks
  * the discretized finite state machine logic that controls its AI
  */
 public void resetState()
 {
     state = new IdleState(this, Time.deltaTime);
 }