예제 #1
0
        //Constructor
        public Slime(Rectangle p, bool a, int t)
        {
            this.position = p;
            this.timesHit = t;
            this.active   = a;
            LeftBound     = new Rectangle(800, 100, 10, 10);
            RightBound    = new Rectangle(1200, 100, 10, 10);

            startPositionX = p.X;
            startPositionY = p.Y;

            currentSlimeState = SlimeState.MoveRight;

            flip = SpriteEffects.FlipHorizontally;
            previousSlimeState = currentSlimeState;

            //Setting hitbox
            hitbox = new Rectangle(position.X, position.Y, 108, 108);

            //At the end of the hurt animation, it will revert to the previous Slime State it was in (Moving left or right)
            hurtTimer          = new Timer();
            hurtTimer.Interval = 2000;
            hurtTimer.Elapsed += HurtTimerState;

            //Animation Initializers
            frameSize.X    = 108;
            frameSize.Y    = 108;
            currentFrame.X = 0;
            currentFrame.Y = 0;
            numFrames      = 4;
            frameRate      = 200;
        }
예제 #2
0
    protected override void Start()
    {
        time       = 0.0f;
        slimeState = SlimeState.STOP;

        base.Start();
    }
예제 #3
0
    private void ExecuteAction(SlimeState state)
    {
        if (!canAct_)
        {
            slimeActor_.move(0f, 0f);
            return;
        }

        Vector2 distToPlayer;

        switch (state)
        {
        case SlimeState.ATTACK:
            if (!cooldown_)
            {
                StartCoroutine(Attack());
            }
            slimeActor_.move(0f, 0f);
            break;

        case SlimeState.MOVE_TO_PLAYER:
            distToPlayer = player_.position - transform.position;
            slimeActor_.move(distToPlayer.y, distToPlayer.x);
            break;

        case SlimeState.FLEE:
            distToPlayer = -(player_.position - transform.position);
            slimeActor_.move(distToPlayer.y, distToPlayer.x);
            break;

        default:
            slimeActor_.move(0f, 0f);
            break;
        }
    }
예제 #4
0
 void Update()
 {
     RecalculateScores();
     state_ = stateScore_.FirstOrDefault(x => x.Value == stateScore_.Values.Max()).Key;
     foreach (SlimeState state in Enum.GetValues(typeof(SlimeState)))
     {
         stateScore_[state] = 0;
     }
     ExecuteAction(state_);
 }
예제 #5
0
 //Basic AI Code that makes it go left and right
 //Move*
 public void MoveRight(Rectangle RightBound)
 {
     if (position.X < RightBound.X)
     {
         position.X += 2;
     }
     else if (position.X >= RightBound.X)
     {
         currentSlimeState = SlimeState.MoveLeft;
     }
 }
예제 #6
0
 public void MoveLeft(Rectangle LeftBound)
 {
     if (position.X > LeftBound.X)
     {
         position.X -= 2;
     }
     else if (position.X <= LeftBound.X)
     {
         currentSlimeState = SlimeState.MoveRight;
     }
 }
예제 #7
0
 public void SetState(SlimeState newState)
 {
     if (_isinit)
     {
         _states[_currentState].enabled = false;
         _states[_currentState].EndState();
     }
     _currentState = newState;
     _states[_currentState].BeginState();
     _states[_currentState].enabled = true;
     _anim.SetInteger("CurrentState", (int)_currentState);
 }
예제 #8
0
    public void SetState(SlimeState newState)
    {
        foreach (SlimeFSMState fsm in states.Values)
        {
            fsm.enabled = false;
            //Debug.Log(fsm);
        }

        states[newState].enabled = true;
        states[newState].beginState();
        currentState = newState;
        anim.SetInteger("CurrentState", (int)currentState);
    }
예제 #9
0
 void flying()
 {
     flyingTimer += Time.deltaTime;
     flyingVel    = flyingVel.normalized + Vector3.up * flyingForce;
     if (flyingTimer < timeFlying)
     {
         cc.Move(flyingVel);
     }
     else
     {
         flyingTimer       = 0;
         currentSlimeState = SlimeState.still;
     }
 }
예제 #10
0
 public void SetState(SlimeState newState)
 {
     if (currentState == SlimeState.DEAD)
     {
         return;
     }
     foreach (SlimeFSMState fsm in states.Values)
     {
         fsm.enabled = false;
     }
     states[newState].enabled = true;
     states[newState].BeginState();
     currentState = newState;
     slani.SetInteger("CurrentState", (int)currentState);
 }
예제 #11
0
 //Collision*
 public void Hurt(Glitch glitch)
 {
     if (this.Position.Intersects(glitch.Position) == true)
     {
         if (timesHit < 2)
         {
             timesHit++;
             //set a timer that makes the slime hurt for 1-2 seconds
             currentSlimeState = SlimeState.Hurt;
         }
         else
         {
             Dead();
         }
     }
 }
예제 #12
0
    void Start()
    {
        updatePlayerPos = true;

        flyingTimer       = 0;
        currentSlimeState = SlimeState.moving;
        //finding the ridgedbody
        cc    = gameObject.GetComponent <CharacterController>();
        speed = Random.Range(speed - speedRandomRange, speed + speedRandomRange);
        //define it

        if (parent != null)
        {
            player = GameObject.FindGameObjectWithTag(parent);
        }
        slimes             = player.GetComponent <PlayerController>().slimes;
        randomCircleRadius = player.GetComponent <PlayerController>().slimeRandomDistanceToPlayer;
        newPos             = FindnewPosition();
        playersController  = player.GetComponent <CharacterController>();
        transform.position = new Vector3(transform.position.x, beginYPos, transform.position.z);
    }
예제 #13
0
 void DeadState()
 {
     currentSlimeState = SlimeState.Dead;
 }
예제 #14
0
 void ChasingState()
 {
     currentSlimeState = SlimeState.Chasing;
 }
예제 #15
0
 void IdleState()
 {
     currentSlimeState = SlimeState.Idle;
 }
예제 #16
0
    private void SlimeMove()
    {
        time += Time.deltaTime;

        switch (slimeState)
        {
        case SlimeState.MOVE_RIGHT:
        case SlimeState.MOVE_UP:
        case SlimeState.MOVE_LEFT:
        case SlimeState.MOVE_DOWN:
            if (moveTime <= time)
            {
                slimeState = SlimeState.STOP;
                time       = Random.Range(0.0f, 0.5f);
            }
            break;

        case SlimeState.STOP:
        default:
            if (moveDistance <= time)
            {
                switch (Random.Range(0, 6))
                {
                case 0:
                    slimeState = SlimeState.MOVE_RIGHT;
                    break;

                case 1:
                    slimeState = SlimeState.MOVE_UP;
                    break;

                case 2:
                    slimeState = SlimeState.MOVE_LEFT;
                    break;

                case 3:
                    slimeState = SlimeState.MOVE_DOWN;
                    break;

                default:
                    slimeState = SlimeState.STOP;
                    break;
                }
                time = 0.0f;
            }
            break;
        }

        float tempX = 0f;
        float tempY = 0f;

        switch (slimeState)
        {
        case SlimeState.MOVE_RIGHT:
            tempY = 1;
            break;

        case SlimeState.MOVE_UP:
            tempX = -1;
            break;

        case SlimeState.MOVE_LEFT:
            tempY = -1;
            break;

        case SlimeState.MOVE_DOWN:
            tempX = 1;
            break;

        default:
            break;
        }

        if (!(tempX == 0 && tempY == 0))
        {
            var radian = Mathf.Atan2(tempY, tempX);
            speed.x += accsele * Mathf.Cos(radian);
            speed.y += accsele * Mathf.Sin(radian);
        }
    }
예제 #17
0
 //Timer Function
 //TimerEnd*
 private void HurtTimerState(Object source, System.Timers.ElapsedEventArgs e)
 {
     currentSlimeState = previousSlimeState;
 }
예제 #18
0
 //Monogame Methods
 public void Initialize()
 {
     currentSlimeState = SlimeState.MoveRight;
 }
    // Update is called once per frame
    void Update()
    {
        switch (slimeState)
        {
        case SlimeState.Moving:
            if (!hasInitialisedState)
            {
                slimeMover.enabled  = true;
                hasInitialisedState = true;
            }
            if (slimeMover.IsInRange())
            {
                slimeState          = SlimeState.Attacking;
                slimeMover.enabled  = false;
                hasInitialisedState = false;
            }
            break;

        case SlimeState.Attacking:
            if (!hasInitialisedState)
            {
                hasInitialisedState = true;
            }
            switch (slimeType)
            {
            case SlimeType.Wind:
                if (GetComponent <WindSlimeBehaviour>().WindAttackBehaviour())
                {
                    slimeState          = SlimeState.Moving;
                    hasInitialisedState = false;
                }

                break;

            case SlimeType.Ice:
                GetComponent <IceSlimeBehaviour>().IceAttackBehaviour();
                if (!slimeMover.IsInRange())
                {
                    GetComponent <IceSlimeBehaviour>().StopIceBehaviour();
                    slimeState          = SlimeState.Moving;
                    hasInitialisedState = false;
                }
                break;

            case SlimeType.Earth:
                if (GetComponent <EarthSlimeBehaviour>().EarthAttackBehaviour())
                {
                    slimeState          = SlimeState.Moving;
                    hasInitialisedState = false;
                }
                break;

            case SlimeType.Fire:
                if (slimeMover.IsInRange())
                {
                    GetComponent <FireSlimeBehaviour>().FireAttackBehaviour();
                }
                else
                {
                    slimeState          = SlimeState.Moving;
                    hasInitialisedState = false;
                }

                break;
            }
            break;
        }
    }