예제 #1
0
    static void Main(string[] args)
    {
        CombatLogger combatLogger = new CombatLogger();
        EventLogger  eventLogger  = new EventLogger();
        TargetLogger targetLogger = new TargetLogger();

        combatLogger.SetSuccessor(eventLogger);
        eventLogger.SetSuccessor(targetLogger);

        IAttacker pesho  = new Warrior("Pesho", 10, combatLogger);
        IAttacker stamat = new Warrior("Stamat", 20, combatLogger);

        IAttackGroup attackGroup = new AttackGroup();

        attackGroup.AddMember(pesho);
        attackGroup.AddMember(stamat);

        ITarget target = new Dragon("Drago", 30, 200, combatLogger);

        ((ISubject)target).Register((IObserver)pesho);
        ((ISubject)target).Register((IObserver)stamat);

        IExecutor executor           = new CommandExecutor();
        ICommand  groupTargetCommand = new GroupTargetCommand(attackGroup, target);
        ICommand  groupAttackCommand = new GroupAttackCommand(attackGroup);

        executor.ExecuteCommand(groupAttackCommand);
        executor.ExecuteCommand(groupTargetCommand);
        executor.ExecuteCommand(groupAttackCommand);
        executor.ExecuteCommand(groupAttackCommand);
    }
예제 #2
0
    // 站立
    public void StandBy()
    {
        // 清理攻击数据
        _lastAttackActionIndex = -1;
        _lastAttackGroup       = AttackGroup.EMPTY;

        SetAction(AnimationAction.IDLE);
    }
예제 #3
0
 public static void FloorSpikeTargetPlayer(Boss b, AttackGroup a, FloorSpike.Data d,
                                           RuntimeAnimatorController animator)
 {
     if (b.player != null)
     {
         FloorSpike(b, d, animator, b.player.transform.position.x);
     }
     a.StartCooldown();
 }
예제 #4
0
    // Summon multiple floor spikes.
    public static void FloorSpikes(Boss b, AttackGroup a, FloorSpike.Data d,
                                   RuntimeAnimatorController animator, float count)
    {
        Room room      = b.room;
        int  trueCount = Mathf.FloorToInt(count);

        for (int i = 0; i < trueCount; ++i)
        {
            FloorSpike(b, d, animator, room.GetRandomFloorXPosition());
        }
        a.StartCooldown();
    }
예제 #5
0
    // 设置攻击序号,这些序号跟controller中的配置相关
    private void SetAttackList(AttackGroup group, List <int> list)
    {
        list.Clear();
        switch (group)
        {
        case AttackGroup.EMPTY:
            list.AddRange(new[] { 1, 2, 3, 4, 5 });
            break;

        case AttackGroup.LSLASH:
            list.AddRange(new[] { 11, 12, 13, 14 });
            break;

        case AttackGroup.RSLASH:
            list.AddRange(new[] { 21, 22, 23, 24 });
            break;

        case AttackGroup.LWAND:
            list.Add(31);
            break;

        case AttackGroup.RWAND:
            list.Add(41);
            break;

        case AttackGroup.POLEARM:
            list.AddRange(new[] { 51, 52, 53 });
            break;

        case AttackGroup.RIFLE:
            list.Add(61);
            break;

        case AttackGroup.BOW:
            list.AddRange(new[] { 71, 72 });
            break;

        case AttackGroup.CROSSBOW:
            list.Add(81);
            break;

        case AttackGroup.LPISTOL:
            list.Add(91);
            break;

        case AttackGroup.RPISTOL:
            list.Add(101);
            break;
        }
    }
예제 #6
0
    // All attacking logic is handled here
    protected void HandleAttack()
    {
        isAttacking = animator.GetCurrentAnimatorStateInfo(0).IsTag("attack");

        // Punching timer to reset attack combination
        punchTimer.Update(Time.deltaTime);
        if (punchTimer.IsExpired())
        {
            punchTimer.Reset();
        }

        // Start next attack only when previous attack is finished
        if (!isAttacking)
        {
            currentAttack      = Attack.None;
            currentAttackGroup = AttackGroup.None;

            if (Input.GetKeyDown(KeyCode.J))
            {
                // Sword attaks
                currentAttackGroup = AttackGroup.KingdudeSword;
                currentAttack      = swordCombo.Next();
            }
            else if (Input.GetKeyDown(KeyCode.K))
            {
                // Punch attacks
                currentAttackGroup = AttackGroup.KingdudePunch;
                if (!punchTimer.IsClickSequential)
                {
                    punchCombo.Reset();
                }
                currentAttack = punchCombo.Next();
                punchTimer.RegisterSequencialClick();
            }
            else if (Input.GetKeyDown(KeyCode.L))
            {
                // Sword dash
                currentAttackGroup = AttackGroup.KingdudeDash;
                currentAttack      = Attack.KingdudeSwordDash;
            }

            if (currentAttack != Attack.None)
            {
                this.animator.SetInteger("attackGroup", (int)currentAttackGroup);
                this.animator.SetTrigger("attack");
                this.animator.SetInteger("attackType", (int)currentAttack);
            }
        }
    }
예제 #7
0
    public static void SpawnOrb(Boss b, AttackGroup a, BossOrb.Data d, string positionName,
                                RuntimeAnimatorController animator)
    {
        Transform spawnLocation, center, bottom;

        b.transforms.TryGetValue(positionName, out spawnLocation);
        b.transforms.TryGetValue("CenterTop", out center);
        b.transforms.TryGetValue("CenterBottom", out bottom);
        GameObject obj = Instantiate(b.prefabOrb, spawnLocation);

        obj.transform.localPosition = Vector3.zero;
        BossOrb orb = obj.GetComponent <BossOrb>();

        orb.SetData(d);
        orb.SetCenterAndBottom(center.position, bottom.position);
        orb.SetAnimatorController(animator);
        orb.IdleFinished += a.StartCooldown;
        orb.SetTarget(b.player ? b.player.transform : b.transform);
    }
예제 #8
0
    // 攻击
    public void Attack()
    {
        // 只有站立和跑步的时候可以切换到攻击
        AnimatorStateInfo animatorState = _animator.GetCurrentAnimatorStateInfo(0);

        if (animatorState.IsName(IDLE_NAME) || animatorState.IsName(RUN_NAME))
        {
            int index = 0;
            if (_leftHandAttackGroup != AttackGroup.EMPTY)
            {
                // 如果有左手动画,则左右手轮流播放
                if (_lastAttackGroup == _rightHandAttackGroup)
                {
                    // 如果上次播放的是右手动画,则此次播放左手动画
                    index            = GetRandomAction(_leftHandAttackList, _lastAttackActionIndex);
                    _lastAttackGroup = _leftHandAttackGroup;
                }
                else
                {
                    // 其余情况播放右手动画
                    index            = GetRandomAction(_rightHandAttackList, _lastAttackActionIndex);
                    _lastAttackGroup = _rightHandAttackGroup;
                }
            }
            else
            {
                index = GetRandomAction(_rightHandAttackList, _lastAttackActionIndex);
            }

            SetAction(AnimationAction.ATTACK, index);

            // 延迟几帧清理设置的动画参数
            _actor.AddFrameEvent(() =>
            {
                // 仅需要处理参数
                SetAction(AnimationAction.IDLE);
            });
        }
    }
예제 #9
0
 // 设置左手的攻击动画组别
 public void SetLeftHandAttackGroup(AttackGroup attackGroup)
 {
     _leftHandAttackGroup = attackGroup;
     SetAttackList(_leftHandAttackGroup, _leftHandAttackList);
 }
예제 #10
0
 // 设置右手攻击动画组别
 public void SetRightHandAttackGroup(AttackGroup attackGroup)
 {
     _rightHandAttackGroup = attackGroup;
     SetAttackList(_rightHandAttackGroup, _rightHandAttackList);
 }