// 显示攻击范围 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); } } }); }); }
// 显示范围 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); } } }); } }