Esempio n. 1
0
    public IEnumerator CooldownIndicator(Moves move, AttackEnum attackEnum)
    {
        _images[(int)attackEnum].color = Color.grey;

        for (float i = move._coolDown; i > 0;)
        {
            if (move._isReadyAnimating)
            {
                if (move._coolDown >= 1)
                {
                    yield return(new WaitForSeconds(1));

                    i--;
                    _timerText[(int)attackEnum].text = i + "";
                }
                else
                {
                    i = 0;
                }
            }
            else
            {
                yield return(new WaitForEndOfFrame());
            }
        }
        _timerText[(int)attackEnum].text = "";
        _images[(int)attackEnum].color   = Color.white;
    }
Esempio n. 2
0
    /// <summary>
    /// 设置攻击效果
    /// </summary>
    /// <param name="skill">攻击模式</param>
    /// <param name="target">目标</param>
    private void setAttackEffect(AttackEnum skill, GameCharacter target)
    {
        switch (skill)
        {
        case AttackEnum.NORMAL_ATTACK:
            if (IsFacingRight == true)
            {
                target.Rbody2D.AddForce(new Vector2(1.5f, 0), ForceMode2D.Impulse);
            }
            else
            {
                target.Rbody2D.AddForce(new Vector2(-1.5f, 0), ForceMode2D.Impulse);
            }
            break;

        case AttackEnum.JUMP_ATTACK:
            if (IsFacingRight == true)
            {
                target.Rbody2D.AddForce(new Vector2(2.5f, -2.5f), ForceMode2D.Impulse);
            }
            else
            {
                target.Rbody2D.AddForce(new Vector2(-2.5f, -2.5f), ForceMode2D.Impulse);
            }
            break;

        default:
            break;
        }
    }
Esempio n. 3
0
 public void RegisterAttack(AttackEnum ae)
 {
     if (!playerAttacks.Contains(ae))
     {
         playerAttacks.Add(ae);
     }
 }
Esempio n. 4
0
 public virtual void DoneAnimating(AttackEnum attack)
 {
     if (_attack == attack)
     {
         _isReadyAnimating = true;
         Invoke("DoneCooldown", _coolDown);
     }
 }
Esempio n. 5
0
    /// <summary>
    /// 开始攻击
    /// </summary>
    /// <param name="skill">攻击模式</param>
    private void startAttack(AttackEnum skill)
    {
        // 攻击时不可转身
        LockFlip  = true;
        IsHitting = true;
        switch (skill)
        {
        case AttackEnum.NORMAL_ATTACK:
            CurrentSpeed = 0.5f;
            switch (AttackNum)
            {
            case 0:
                MoveAnim.SetBool("normalAttack", true);
                MoveAnim.SetInteger("AttackNum", AttackNum);
                dealDamage(skill, DamageDegree.HEAVY_ATTACK, BasicDamage * 5, MyDamageType);
                break;

            case 1:
                MoveAnim.SetBool("normalAttack", true);
                MoveAnim.SetInteger("AttackNum", AttackNum);
                dealDamage(skill, DamageDegree.HEAVY_ATTACK, BasicDamage * 5, MyDamageType);
                break;

            case 2:
                MoveAnim.SetBool("normalAttack", true);
                MoveAnim.SetInteger("AttackNum", AttackNum);
                dealDamage(skill, DamageDegree.HEAVY_ATTACK, BasicDamage * 3, MyDamageType);
                break;

            default:
                MoveAnim.SetBool("normalAttack", true);
                MoveAnim.SetInteger("AttackNum", AttackNum);
                dealDamage(skill, DamageDegree.HEAVY_ATTACK, BasicDamage * 3, MyDamageType);
                break;
            }

            //Invoke("finishNormalAttack", 0.5f);
            break;

        case AttackEnum.JUMP_ATTACK:
            CurrentSpeed     = 0.5f;
            Rbody2D.velocity = new Vector2(0, 0);
            MoveAnim.SetBool("jumpAttack", true);
            dealDamage(skill, DamageDegree.LIGHT_ATTACK, BasicDamage, MyDamageType);
            //Invoke("finishJumpAttack", 0.3f);
            break;

        case AttackEnum.SPEEL_ATTACK:
            MoveAnim.SetBool("speelAttack", true);
            dealDamage(skill, DamageDegree.LIGHT_ATTACK, BasicDamage, MyDamageType);
            Invoke("finishSpeelAttack", 0.3f);
            break;

        default:
            break;
        }
    }
Esempio n. 6
0
    public void TakeDamages(AttackEnum attaque, float damages)
    {
        switch (attaque)
        {
        case AttackEnum.PHYSICAL_FIRE:
            if (physic_fire == true)
            {
                return;
            }
            break;

        case AttackEnum.PHYSICAL_THUNDER:
            if (physic_thunder == true)
            {
                return;
            }
            break;

        case AttackEnum.PHYSICAL_ICE:
            if (physic_ice == true)
            {
                return;
            }
            break;

        case AttackEnum.MAGICAL_FIRE:
            if (magic_fire == true)
            {
                return;
            }
            break;

        case AttackEnum.MAGICAL_THUNDER:
            if (magic_thunder == true)
            {
                return;
            }
            break;

        case AttackEnum.MAGICAL_ICE:
            if (magic_ice == true)
            {
                return;
            }
            break;
        }

        hp = hp - damages;

        PlayerObserver.instance.RegisterAttack(attaque);

        if (hp <= 0)
        {
            Death(attaque);
        }
    }
Esempio n. 7
0
 // 添加攻击效果
 // 限定效果
 public override void setEffect(GameCharacter target, AttackEnum skill)
 {
     switch (skill)
     {
     case AttackEnum.NORMAL_ATTACK:
         if (IsFacingRight == true)
         {
             target.Rbody2D.AddForce(new Vector2(5f, 0), ForceMode2D.Impulse);
         }
         else
         {
             target.Rbody2D.AddForce(new Vector2(-5f, 0), ForceMode2D.Impulse);
         }
         break;
     }
 }
Esempio n. 8
0
    public void ApplyRes(AttackEnum ae)
    {
        switch (ae)
        {
        case AttackEnum.MAGICAL_FIRE:
            foreach (Enemy e in renforts)
            {
                e.magic_fire = true;
            }
            break;

        case AttackEnum.MAGICAL_ICE:
            foreach (Enemy e in renforts)
            {
                e.magic_ice = true;
            }
            break;

        case AttackEnum.MAGICAL_THUNDER:
            foreach (Enemy e in renforts)
            {
                e.magic_thunder = true;
            }
            break;

        case AttackEnum.PHYSICAL_FIRE:
            foreach (Enemy e in renforts)
            {
                e.physic_fire = true;
            }
            break;

        case AttackEnum.PHYSICAL_ICE:
            foreach (Enemy e in renforts)
            {
                e.physic_ice = true;
            }
            break;

        case AttackEnum.PHYSICAL_THUNDER:
            foreach (Enemy e in renforts)
            {
                e.physic_thunder = true;
            }
            break;
        }
    }
Esempio n. 9
0
    /// <summary>
    /// 结束攻击
    /// </summary>
    private void finishAttack(AttackEnum skill)
    {
        switch (skill)
        {
        case AttackEnum.NORMAL_ATTACK:
            Invoke("finishNormalAttack", 0);
            break;

        case AttackEnum.JUMP_ATTACK:
            Invoke("finishJumpAttack", 0);
            break;

        case AttackEnum.SPEEL_ATTACK:
            Invoke("finishSpeelAttack", 0);
            break;
        }
    }
Esempio n. 10
0
 /// <summary>
 /// 执行攻击行为
 /// </summary>
 /// <param name="skill">攻击模式</param>
 /// <param name="damageDegree">伤害类型</param>
 /// <param name="damage">伤害数值</param>
 private void dealDamage(AttackEnum skill, DamageDegree damageDegree, float damage, DamageType damageType)
 {
     // 攻击NPC
     for (int i = 0; i < GameCharacterManager.Instance.NPCList.Count; i++)
     {
         if (checkHit(GameCharacterManager.Instance.NPCList[i]))
         {
             hit(GameCharacterManager.Instance.NPCList[i], damageDegree, damage, damageType);
             setAttackEffect(skill, GameCharacterManager.Instance.NPCList[i]);
             //GameCharacterManager.Instance.NPCList[i].MyAI.setTarget(this);
             GameCharacterManager.Instance.NPCList[i].Target = this;
         }
     }
     // 攻击敌人
     for (int i = 0; i < GameCharacterManager.Instance.EnemyList.Count; i++)
     {
         if (checkHit(GameCharacterManager.Instance.EnemyList[i]))
         {
             hit(GameCharacterManager.Instance.EnemyList[i], damageDegree, damage, damageType);
             setAttackEffect(skill, GameCharacterManager.Instance.EnemyList[i]);
         }
     }
 }
            public            AttackEnum this[int index]
            {
                get
                {
                    switch (Math.Min(Math.Max(index, 0), 2))
                    {
                    case 0:
                        return(PrimaryAttack);

                    case 1:
                        return(SecondaryAttack);

                    case 2:
                        return(SecondaryAttack2);

                    default:
                        return(PrimaryAttack);
                    }
                }
                set
                {
                    switch (Math.Min(Math.Max(index, 0), 2))
                    {
                    case 0:
                        primaryAttack = value;
                        break;

                    case 1:
                        secondaryAttack = value;
                        break;

                    case 2:
                        secondaryAttack2 = value;
                        break;
                    }
                }
            }
Esempio n. 12
0
 public override void DoneAnimating(AttackEnum attack)
 {
     base.DoneAnimating(attack);
     _currentLerpSpeed = _lerpWalkSpeed;
 }
Esempio n. 13
0
 // 添加攻击效果
 /// <summary>
 /// 限定效果
 /// </summary>
 /// <param name="target">目标</param>
 /// <param name="skill">攻击方式</param>
 public virtual void setEffect(GameCharacter target, AttackEnum skill)
 {
 }
Esempio n. 14
0
    /// <summary>
    /// 更新状态
    /// </summary>
    /// <param name="state">状态枚举</param>
    /// <param name="direction">方向</param>
    /// <param name="speed">速度</param>
    /// <param name="jumpForce">跳跃力</param>
    /// <param name="up"></param>
    /// <param name="skill">攻击模式</param>
    public void updateState(StateEnum state, float direction = 0, float speed = 0, float jumpForce = 0, bool up = true, AttackEnum skill = AttackEnum.NORMAL_ATTACK)
    {
        switch (state)
        {
        case StateEnum.IDLE:
            CurrentState = StateEnum.IDLE;
            goToIdle();
            break;

        case StateEnum.WALK:
            if (Rbody2D.velocity.x >= CurrentSpeed && CurrentState != StateEnum.ATTACK)
            {
                CurrentState = StateEnum.WALK;
            }
            goToWalk(direction, speed);
            break;

        case StateEnum.RUN:
            if (Rbody2D.velocity.x >= CurrentSpeed && CurrentState != StateEnum.ATTACK)
            {
                CurrentState = StateEnum.RUN;
            }
            goToRun(direction, speed);
            break;

        case StateEnum.JUMP:
            CurrentState = StateEnum.JUMP;
            goToJump(jumpForce, up);
            break;

        case StateEnum.SPEEL:
            CurrentState = StateEnum.SPEEL;
            goToSpeel();
            break;

        case StateEnum.DEAD:
            CurrentState = StateEnum.DEAD;
            goToDead();
            break;

        case StateEnum.ALIVE:
            CurrentState = StateEnum.ALIVE;
            break;

        case StateEnum.ATTACK:
            CurrentState = StateEnum.ATTACK;
            startAttack(skill);
            break;

        case StateEnum.CROUCH:
            CurrentState = StateEnum.CROUCH;
            startCrouch();
            break;

        case StateEnum.DASH:
            CurrentState = StateEnum.DASH;
            startDash(direction, speed);
            break;

        case StateEnum.ROLL:
            CurrentState = StateEnum.ROLL;
            startRoll(direction);
            break;

        default:
            goToIdle();
            break;
        }
    }
Esempio n. 15
0
 private void Update()
 {
     if (Time.timeScale == 0)
     {
         return;
     }
     // check alive
     #region check alive
     if (Alive == false)
     {
         Locked           = true;
         Rbody2D.velocity = new Vector2(0, Rbody2D.velocity.y);
         if (!IsDead)
         {
             MoveAnim.SetBool("dead", true);
             goToDead(-1f);
         }
     }
     #endregion
     // Hunger
     #region Hunger
     if (TC.Minutes - TimeOnHold >= 1)
     {
         CurrentHungerValue -= HungerCost;
         TimeOnHold          = TC.Minutes;
     }
     if (CurrentHungerValue <= 0)
     {
         CurrentHungerValue = 0;
         if (!BM.containsBuff("Hungry0"))
         {
             BM.addBuff(BuffStock.findBuff("Hungry0"));
         }
     }
     else if (CurrentHungerValue >= TotalHungerValue)
     {
         CurrentHungerValue = TotalHungerValue;
     }
     #endregion
     // go to crouch
     #region go to crouch
     if ((Input.GetKeyDown(KeyCodeList.Instance.Crouch)) && OnGround == true && CurrentState != StateEnum.ATTACK)
     {
         IsCrouching = true;
     }
     else if (Input.GetKeyUp(KeyCodeList.Instance.Crouch) && CurrentState != StateEnum.ATTACK)
     {
         IsCrouching = false;
     }
     if (IsCrouching == true)
     {
         updateState(StateEnum.CROUCH);
     }
     else if (CurrentState == StateEnum.CROUCH)
     {
         finishCrouch();
     }
     #endregion
     // operation
     #region operation
     if (Locked == false && IsRolling == false && IsCrouching == false)
     {
         // go to jump
         #region    go to jump
         if (Input.GetKeyDown(KeyCodeList.Instance.Jump) && CurrentState != StateEnum.ATTACK &&
             IsHealing == false &&
             IsSpeeling == false)
         {
             if (OnGround == true && OnWall == false)
             {
                 IsJumping = true;
                 OnGround  = false;
                 updateState(StateEnum.JUMP, Direction, CurrentSpeed, CurrentJumpForce * (1 + (CurrentSpeed - WalkingSpeed) * 0.1f));
             }
             else if (ExtraJumpCount > 0 && IsSpeeling == false)
             {
                 // extra jump
                 if (CurrentEnergy >= JumpCost)
                 {
                     ExtraJumpCount--;
                     CurrentEnergy   -= JumpCost;
                     Rbody2D.velocity = new Vector2(0, 0);
                     updateState(StateEnum.JUMP, Direction, CurrentSpeed, CurrentJumpForce * ExtraJumpMultiple);
                 }
             }
         }
         #endregion
         // jump higher
         #region  jump higher
         if (Input.GetKey(KeyCodeList.Instance.Jump) && IsJumping == true)
         {
             if (CurrentJumpDuration > 0)
             {
                 Rbody2D.velocity    += Vector2.up * CurrentJumpForce * DeltaJumpForcePercent;
                 CurrentJumpDuration -= Time.deltaTime;
             }
             else
             {
                 IsJumping = false;
             }
         }
         if (Input.GetKeyUp(KeyCodeList.Instance.Jump))
         {
             IsJumping = false;
         }
         #endregion
         // go to attack
         #region  go to attack
         if (ChainsDuration > 0)
         {
             ChainsDuration -= Time.deltaTime;
         }
         else
         {
             ChainsDuration = 0;
             AttackNum      = 0;
         }
         if (CurrentCoolDown < CoolDown)
         {
             // 更新冷却
             CurrentCoolDown += Time.deltaTime;
         }
         if (CurrentCoolDown >= CoolDown && !IsRolling && !IsHealing)
         {
             if (Input.GetKeyDown(KeyCodeList.Instance.Attack) && OnGround == true)
             {
                 if (IsDashing)
                 {
                     finishDash();
                 }
                 // 重置冷却时间
                 CurrentCoolDown = 0;
                 if (ChainsDuration > 0)
                 {
                     // 连续攻击
                     if (AttackNum < MaxAttackNum)
                     {
                         AttackNum++;
                         ChainsDuration = MaxChainsDuration;
                     }
                     else
                     {
                         AttackNum      = 0;
                         ChainsDuration = MaxChainsDuration;
                     }
                 }
                 else
                 {
                     // 超时,重置
                     AttackNum      = 0;
                     ChainsDuration = MaxChainsDuration;
                 }
                 updateState(StateEnum.ATTACK, Direction, CurrentSpeed, CurrentJumpForce, true, AttackEnum.NORMAL_ATTACK);
                 Skill = AttackEnum.NORMAL_ATTACK;
             }
             if (Input.GetKeyDown(KeyCodeList.Instance.Attack) && OnGround == false && !IsSpeeling)
             {
                 // 重置冷却时间
                 CurrentCoolDown = 0;
                 updateState(StateEnum.ATTACK, Direction, CurrentSpeed, CurrentJumpForce, true, AttackEnum.JUMP_ATTACK);
                 Skill = AttackEnum.JUMP_ATTACK;
             }
             if (Input.GetKeyDown(KeyCodeList.Instance.Attack) && OnWall == true)
             {
                 // 重置冷却时间
                 CurrentCoolDown = 0;
                 updateState(StateEnum.ATTACK, Direction, CurrentSpeed, CurrentJumpForce, true, AttackEnum.SPEEL_ATTACK);
                 Skill = AttackEnum.SPEEL_ATTACK;
             }
         }
         #endregion
         //roll
         #region roll
         if (/*CurrentState != StateEnum.ATTACK && */ !IsRolling && !IsHealing &&
             checkGround() && CurrentEnergy >= RollingCost &&
             Input.GetKeyDown(KeyCodeList.Instance.Roll))
         {
             if (IsDashing)
             {
                 finishDash();
             }
             else
             {
                 CurrentEnergy -= RollingCost;
             }
             IsRolling = true;
             if (CurrentState == StateEnum.ATTACK)
             {
                 finishAttack(Skill);
             }
             MoveAnim.SetBool("roll", true);
             ChainsDuration = MaxChainsDuration;
         }
         #endregion
         // dash
         #region dash
         if (IsRunning && Input.GetKey(KeyCodeList.Instance.Dash) && checkGround() && !IsHealing)
         {
             if (CurrentEnergy > 0)
             {
                 IsDashing      = true;
                 CurrentEnergy -= Time.deltaTime * DashingCost;
             }
             else
             {
                 finishDash();
             }
         }
         else
         {
             finishDash();
         }
         #endregion
     }
     #endregion
     // cure energy
     #region cure energy
     if (!IsDashing && !IsRolling && !(IsRunning && OnGround) && !(IsJumping && ExtraJumpCount < MaxExtraJumpCount))
     {
         CurrentEnergy += Time.deltaTime * EnergyCure;
         if (CurrentEnergy > TotalEnergy)
         {
             CurrentEnergy = TotalEnergy;
         }
         else if (CurrentEnergy < 0)
         {
             CurrentEnergy = 0;
         }
     }
     #endregion
     // cure shield
     #region cure shield
     if (CurrentShieldValue < 0)
     {
         CurrentShieldValue = 0;
     }
     else if (CurrentShieldValue < TotalShieldValue)
     {
         CurrentShieldValue += Time.deltaTime * ShieldCure;
     }
     else if (CurrentShieldValue > TotalShieldValue)
     {
         CurrentShieldValue = TotalShieldValue;
     }
     #endregion
 }
Esempio n. 16
0
 void Death(AttackEnum ae)
 {
     EnemyManager.instance.ApplyRes(ae);
 }