Ejemplo n.º 1
0
 // 显示攻击范围
 public void ShowAttackRange(float x, float y, Warrior worrior)
 {
     Debug.Assert(pathATKRange.Count == 0, "path range is not empty now.");
     FC.For(worrior.AttackRange.Length, (i) =>
     {
         int minX = (x - worrior.AttackRange[i]) < 0 ? 0 : (int)(x - worrior.AttackRange[i]);
         int maxX = (x + worrior.AttackRange[i]) >= BattleStage.Map.Width ? BattleStage.Map.Width : (int)(x + worrior.AttackRange[i] + 1);
         int minY = (y - worrior.AttackRange[i]) < 0 ? 0 : (int)(y - worrior.AttackRange[i]);
         int maxY = (y + worrior.AttackRange[i]) >= BattleStage.Map.Height ? BattleStage.Map.Height : (int)(y + worrior.AttackRange[i] + 1);
         FC.For2(minX, maxX, minY, maxY, (tx, ty) =>
         {
             if (MU.ManhattanDist((int)x, (int)y, tx, ty) == worrior.AttackRange[i])
             {
                 var tile = BattleStage.CreateMapTile(tx, ty);
                 pathATKRange.Add(tile);
                 var avatar = BattleStage.GetAvatarAt(tx, ty);
                 if (avatar != null && avatar.Warrior.Team != worrior.Team)
                 {
                     avatar.AttackHint.SetActive(true);
                 }
             }
         });
     });
 }
Ejemplo n.º 2
0
    // 显示范围
    public void ShowRange(int cx, int cy, ActiveSkill skill, Action <int, int> onSelPos)
    {
        Debug.Assert(Range.Count == 0, "path asasrange is not empty now.");
        this.onSelPos = onSelPos;
        var map = BattleStage.Map;

        // 如果无释放范围的技能
        if (!(skill is ISkillWithRange))
        {
            // 需要过滤目标
            if (skill is ISkillWithTargetFilter)
            {
                var targetList = (skill as ISkillWithTargetFilter).AllAvaliableTargets();
                FC.For(targetList.Count, (i) =>
                {
                    var warrior = targetList[i] as Warrior;
                    if (warrior != null)
                    {
                        // 建立用于显示技能范围的地块
                        var avatar  = BattleStage.GetAvatarByWarrior(warrior);
                        var mapTile = BattleStage.CreateMapTile(avatar.X, avatar.Y);
                        mapTile.gameObject.SetActive(false);
                        Range.Add(mapTile);

                        // 显示人物身上的技能标识
                        if (warrior.Team == skill.Owner.Team)
                        {
                            avatar.FriendSkillDec.SetActive(true);
                        }
                        else
                        {
                            avatar.EnemySkillDec.SetActive(true);
                        }
                    }
                    else
                    {
                        Debug.Assert(warrior != null, "the target is not warrior");
                    }
                });
            }
        }
        else // 有释放范围的技能
        {
            var range = (skill as ISkillWithRange).Range;
            FC.SquareFor(cx, cy, range, (x, y) =>
            {
                if (x < 0 || x >= map.Width || y < 0 || y >= map.Height)
                {
                    return;
                }
                var obj = map.GetAt <BattleMapObj>(x, y);
                if (MU.ManhattanDist(x, y, cx, cy) == range)
                {
                    if (obj == null || (obj != null && obj is Hero))
                    {
                        var tile = BattleStage.CreateMapTile(x, y);
                        Range.Add(tile);
                    }
                }
            });
        }
    }