Пример #1
0
 protected void ErrorClose(string error)
 {
     UIViewManager.Instance.HideView(this);
     UtilityHelper.LogError(error);
 }
Пример #2
0
        //开始战斗
        private void Fight()
        {
            battleState = BattleState.Fighting;

            BattleUnit actionUnit = null;

            do
            {
                //连接渲染器,则一步一更新
                //没有连接渲染器,则一直计算直到结束
                actionUnit = actionQueue.Dequeue();

                if (actionUnit == null)
                {
                    battleState = BattleState.End;
                    break;
                }

                if (actionUnit.CanAction)
                {
                    HeroActionState state = actionUnit.BattleAction();

                    switch (state)
                    {
                    case HeroActionState.Normal:
                        battleState = BattleState.Fighting;
                        break;

                    case HeroActionState.WaitForPlayerChoose:
                        battleState = BattleState.WaitForPlayer;
                        break;

                    case HeroActionState.Error:
                        battleState = BattleState.Exception;
                        break;

                    case HeroActionState.Warn:
                        battleState = BattleState.Exception;
                        UtilityHelper.LogWarning(string.Format("Warning: battle action state warning -> {0}", actionUnit.ToString()));
                        break;

                    default:
                        break;
                    }
                }

                //考虑是否在放回队列
                CalculateNextAction(actionUnit);

                if (battleFieldEvents.Count > EGameConstL.BattleFieldMaxActions)
                {
                    UtilityHelper.LogError("Battle actions overflow max limit.");
                    battleState = BattleState.Exception;
                }
                else
                {
                    //只在这种情况下做战斗结束的判断
                    if (!actionUnit.CanAction ||
                        actionUnit.targetBattleUnit == null ||
                        !actionUnit.targetBattleUnit.CanAction)
                    {
                        CheckBattleEnd();
                    }
                }
            } while (battleFieldRenderer == null &&
                     battleState != BattleState.End &&
                     battleState != BattleState.Exception);

            //连接了渲染器,一步一表现
            if (battleFieldRenderer != null)
            {
                if (battleState == BattleState.WaitForPlayer)
                {
                    battleFieldRenderer.PlayBattle(null);
                }

                else
                {
                    battleFieldRenderer.PlayBattle(Run);
                }
            }
            else
            {
                Run();
            }
        }
Пример #3
0
        /// <summary>
        /// 根据圆心、内外圆半径,获取环形区域
        /// </summary>
        /// <param name="centerRow">中心所在行</param>
        /// <param name="centerColumn">中心所在列</param>
        /// <param name="outerRadius">外圆半径</param>
        /// <param name="innerRadius">内圆半径</param>
        /// <param name="containsCenter">是否包含中心</param>
        /// <param name="grids">结果格子</param>
        /// <param name="filter">过滤器</param>
        public void GetCircularGrids(
            int centerRow, int centerColumn,
            int outerRadius, int innerRadius, bool containsCenter,
            List <GridUnit> grids,
            System.Func <GridUnit, bool> filter = null)
        {
            if (grids == null)
            {
                return;
            }

            grids.Clear();

            outerRadius = outerRadius < 0 ? 0 : outerRadius;
            innerRadius = innerRadius < 0 ? 0 : innerRadius;

            //外圆半径更小
            if (outerRadius <= innerRadius && outerRadius > 0)
            {
                UtilityHelper.LogError(string.Format("Get Circular Grids failed.Outer radius = {0}, InnerRadius = {1}", outerRadius, innerRadius));
                return;
            }

            if (outerRadius == 0 && containsCenter && filter == null)
            {
                grids.Add(GetGridData(centerRow, centerColumn));
                return;
            }

            //按照行移动量来算
            for (int i = 0; i <= outerRadius; ++i)
            {
                //计算每一行的范围
                //行之间的差
                int rowGap = i;
                //移动行后所覆盖的最小、最大横坐标
                int minColumn = 0;
                int maxColumn = 0;

                //奇数行开始时
                if ((centerRow & 1) == (EGameConstL.Map_FirstRowOffset ? 0 : 1))
                {
                    minColumn = Mathf.Max(centerColumn - (rowGap / 2), 0);
                    maxColumn = centerColumn + ((rowGap + 1) / 2);
                }
                //偶数行开始时
                else
                {
                    minColumn = Mathf.Max(centerColumn - ((rowGap + 1) / 2), 0);
                    maxColumn = centerColumn + (rowGap / 2);
                }

                //列范围
                minColumn = Mathf.Max(0, minColumn - (outerRadius - i));
                maxColumn = Mathf.Min(mapWidth - 1, maxColumn + (outerRadius - i));
                //装入所有
                for (int c = minColumn; c <= maxColumn; ++c)
                {
                    if (i == 0)
                    {
                        //设置了内圆半径
                        if (innerRadius == 0 ||
                            (innerRadius > 0 && mapGrids[c, centerRow].Distance(mapGrids[centerColumn, centerRow]) > innerRadius))
                        {
                            if (c != centerColumn || containsCenter)
                            {
                                if (filter == null || filter(mapGrids[c, centerRow]))
                                {
                                    grids.Add(mapGrids[c, centerRow]);
                                }
                            }
                        }
                    }
                    else
                    {
                        int temp = centerRow - i;
                        if (temp >= 0)
                        {
                            //设置了内圆半径
                            if (innerRadius == 0 ||
                                (innerRadius > 0 && mapGrids[c, temp].Distance(mapGrids[centerColumn, centerRow]) > innerRadius))
                            {
                                if (filter == null || filter(mapGrids[c, temp]))
                                {
                                    grids.Add(mapGrids[c, temp]);
                                }
                            }
                        }

                        temp = centerRow + i;
                        if (temp < mapHeight)
                        {
                            //设置了内圆半径
                            if (innerRadius == 0 ||
                                (innerRadius > 0 && mapGrids[c, temp].Distance(mapGrids[centerColumn, centerRow]) > innerRadius))
                            {
                                if (filter == null || filter(mapGrids[c, temp]))
                                {
                                    grids.Add(mapGrids[c, temp]);
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #4
0
 //更新
 public virtual void UpdateView()
 {
     dirty = false;
     UtilityHelper.Log(string.Format("Update View -> {0}, {1}", config.viewName, this.GetInstanceID()));
 }
Пример #5
0
 //点击了技能,在以固定地点为原点的技能情况下
 private void OnBattleUnitAndGridTouched_StateSkill_GridUnitTarget(GridUnit gridTouched, BattleUnit battleUnitTouched)
 {
     //如果当前有点中的格子
     if (selectedGridUnitRenderer != null && selectedGridUnitRenderer.Equals(gridTouched.gridUnitRenderer))
     {
         //点中了重复的格子,判断是否有目标
         bool hasTarget = false;
         for (int i = 0; i < selectedBattleSkillAnalysis.suitableUnits.Count; ++i)
         {
             if (selectedBattleSkillAnalysis.suitableUnits[i].mapGrid.Distance(gridTouched) <= selectedBattleSkillAnalysis.battleSkill.rangeRadius)
             {
                 hasTarget = true;
                 break;
             }
         }
         //有目标,则释放
         if (hasTarget)
         {
             ManualSkill(gridTouched);
         }
         else
         {
             UtilityHelper.Log("范围内没有目标");
         }
     }
     else
     {
         //这个格子不在范围内
         if (manualOperatingBattleUnitRenderer.battleUnit.mapGrid.Distance(gridTouched) <= selectedBattleSkillAnalysis.battleSkill.releaseRadius)
         {
             if (selectedGridUnitRenderer != null)
             {
                 //取消上一个范围显示
                 SetCircularRangeRenderStateActive(false, GridRenderType.SkillEffectRange);
                 //取消可被攻击单位的显示
                 for (int i = 0; i < selectedBattleSkillAnalysis.suitableUnits.Count; ++i)
                 {
                     selectedBattleSkillAnalysis.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal);
                 }
             }
             //设置新的范围显示
             selectedGridUnitRenderer = gridTouched.gridUnitRenderer;
             SetCircularRangeRenderStateActive(
                 true,
                 GridRenderType.SkillEffectRange,
                 gridTouched.row,
                 gridTouched.column,
                 selectedBattleSkillAnalysis.battleSkill.rangeRadius
                 );
             //设置新的可被攻击单位的显示
             for (int i = 0; i < selectedBattleSkillAnalysis.suitableUnits.Count; ++i)
             {
                 if (selectedBattleSkillAnalysis.suitableUnits[i].mapGrid.Distance(gridTouched) <= selectedBattleSkillAnalysis.battleSkill.rangeRadius)
                 {
                     selectedBattleSkillAnalysis.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selected);
                 }
             }
         }
         else
         {
             UtilityHelper.Log("超出区域");
             UIViewManager.Instance.ShowView(UIViewName.BattleFieldUnitInfo, gridTouched, battleUnitTouched);
         }
     }
 }
Пример #6
0
        //某个战斗单位点击了使用技能
        public void BattleUnitUseSkill(BattleUnit battleUnit, SO_BattleSkill skill)
        {
            if (battleUnit == null ||
                battleUnit.battleUnitRenderer == null ||
                !battleUnit.battleUnitRenderer.Equals(manualOperatingBattleUnitRenderer))
            {
                UtilityHelper.LogError("Battle unit use skill failed.");
                UIViewManager.Instance.HideView(UIViewName.BattleFieldPlayerActOption);
                return;
            }

            //获取推算的技能释放结果
            selectedBattleSkillAnalysis = BattleCalculator.Instance.AnalyseBattleSkill(battleUnit, skill);

            if (selectedBattleSkillAnalysis == null)
            {
                UtilityHelper.LogError("Battle unit use skill failed.Error analyse.");
                UIViewManager.Instance.HideView(UIViewName.BattleFieldPlayerActOption);
                return;
            }

            //显示技能释放范围
            if (skill.releaseRadius > 0)
            {
                SetCircularRangeRenderStateActive(
                    true,
                    GridRenderType.SkillReleaseRange,
                    battleUnit.mapGrid.row,
                    battleUnit.mapGrid.column,
                    skill.releaseRadius);
            }

            //根据类型判断技能显示状态
            switch (skill.targetType)
            {
            //对单个目标
            case BattleSkillTargetType.BattleUnit:
                //可以被选中的
                for (int i = 0; i < selectedBattleSkillAnalysis.suitableUnits.Count; ++i)
                {
                    selectedBattleSkillAnalysis.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selectable);
                }

                //不可以被选中的
                for (int i = 0; i < selectedBattleSkillAnalysis.distanceLimit.Count; ++i)
                {
                    selectedBattleSkillAnalysis.distanceLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.NotSelectable);
                }

                //队伍不合适的
                for (int i = 0; i < selectedBattleSkillAnalysis.teamLimit.Count; ++i)
                {
                    selectedBattleSkillAnalysis.teamLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal);
                }

                //设定技能操作类型
                skillOperationType = skill.rangeRadius > 0 ? SkillOperationType.SurroundBattleUnit : SkillOperationType.SingleBattleUnitTarget;
                break;

            //对范围(某一个位置)目标
            case BattleSkillTargetType.GridUnit:
                //以自身为中心攻击周围目标
                if (skill.releaseRadius <= 0)
                {
                    //可以被选中,标记为已被选中
                    for (int i = 0; i < selectedBattleSkillAnalysis.suitableUnits.Count; ++i)
                    {
                        selectedBattleSkillAnalysis.suitableUnits[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Selected);
                    }

                    //不可以被选中的
                    for (int i = 0; i < selectedBattleSkillAnalysis.distanceLimit.Count; ++i)
                    {
                        selectedBattleSkillAnalysis.distanceLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.NotSelectable);
                    }

                    //队伍不合适的
                    for (int i = 0; i < selectedBattleSkillAnalysis.teamLimit.Count; ++i)
                    {
                        selectedBattleSkillAnalysis.teamLimit[i].battleUnitRenderer.UpdateRenderState(BattleUnitRenderState.Normal);
                    }

                    skillOperationType = SkillOperationType.SurroundSelf;

                    //省去一步点击操作,直接展示区域
                    OnBattleUnitAndGridTouched_StateSkill_SurroundSelf(battleUnit.mapGrid, battleUnit);
                }
                //需要指定范围,需要点击目标地块
                else
                {
                    skillOperationType = SkillOperationType.GridUnitTarget;
                }
                break;

            default:
                break;
            }

            //切换操作状态
            manualOperationState = ManualOperationState.Skill;
            UIViewManager.Instance.HideView(UIViewName.BattleFieldPlayerActOption);
        }
Пример #7
0
        //移动
        private IEnumerator PlayMotionAction(BattleHeroMotionAction action)
        {
            if (action == null)
            {
                UtilityHelper.LogError("Error BattleHeroMotionAction");
                yield break;
            }

            AddBattleBeSelected(this, EGameConstL.Color_Cyan);
            AddBattleBeSelected(action.targetUnit.battleUnitRenderer, EGameConstL.Color_Yellow);

            //先显示区域
            UtilityObjs.gridUnits.Clear();
            battleUnit.battleField.battleMap.GetRangeGrids(action.fromGrid.row, action.fromGrid.column, action.moveRange, UtilityObjs.gridUnits);
            for (int i = 0; i < UtilityObjs.gridUnits.Count; ++i)
            {
                if (UtilityObjs.gridUnits[i].GridType == GridType.Obstacle)
                {
                    continue;
                }
                if (UtilityObjs.gridUnits[i].gridUnitRenderer != null)
                {
                    UtilityObjs.gridUnits[i].gridUnitRenderer.GridRenderType = GridRenderType.Range;
                }
            }

            //显示路径
            for (int i = 0; i < action.gridPath.Length; ++i)
            {
                if (action.gridPath[i].gridUnitRenderer)
                {
                    action.gridPath[i].gridUnitRenderer.GridRenderType = GridRenderType.Path;
                }
            }
            //yield return EGameConstL.WaitForTouchedScreen;

            //移动
            for (int i = 0; i < action.gridPath.Length; ++i)
            {
                UpdatePositionByGrid(action.gridPath[i]);
                yield return(EGameConstL.WaitForDotOneSecond);
            }

            //清空范围和路径
            for (int i = 0; i < UtilityObjs.gridUnits.Count; ++i)
            {
                if (UtilityObjs.gridUnits[i].GridType == GridType.Obstacle)
                {
                    continue;
                }
                if (UtilityObjs.gridUnits[i].gridUnitRenderer != null)
                {
                    UtilityObjs.gridUnits[i].gridUnitRenderer.GridRenderType = GridRenderType.Normal;
                }
            }
            for (int i = 0; i < action.gridPath.Length; ++i)
            {
                if (action.gridPath[i].gridUnitRenderer)
                {
                    action.gridPath[i].gridUnitRenderer.GridRenderType = GridRenderType.Normal;
                }
            }

            ClearAllSelectedBattleUnit();
        }
Пример #8
0
        //搜索目标
        private TargetSearchResult SearchTarget(List <BattleAction> actions)
        {
            //按照距离排序敌人
            UtilityObjs.battleUnits.Clear();
            //只考虑可以行动的
            for (int i = 0; i < enemyTeam.battleUnits.Count; ++i)
            {
                if (enemyTeam.battleUnits[i].CanAction)
                {
                    UtilityObjs.battleUnits.Add(enemyTeam.battleUnits[i]);
                }
            }

            //天下无敌了,还有谁??
            if (UtilityObjs.battleUnits.Count == 0)
            {
                return(TargetSearchResult.Inexistence);
            }

            //结果类型
            TargetSearchResult searchResult = TargetSearchResult.InRange;

            //按照距离排序
            UtilityObjs.battleUnits.Sort(delegate(BattleUnit b1, BattleUnit b2)
            {
                return(mapGrid.Distance(b1.mapGrid) - mapGrid.Distance(b2.mapGrid));
            });

            //暂时不添加复杂的逻辑,只选择直线距离最近的
            BattleUnit newTarget     = null;
            GridUnit   newTargetGrid = null;

            for (int i = 0; i < UtilityObjs.battleUnits.Count; ++i)
            {
                //如果当前目标就在范围内
                if (mapGrid.Distance(UtilityObjs.battleUnits[i].mapGrid) <= 1)
                {
                    //设置目标,但是不需要移动
                    newTarget = UtilityObjs.battleUnits[i];
                    toTargetPath.Clear();
                    targetGrid   = null;
                    searchResult = TargetSearchResult.InRange;
                    break;
                }

                //目标不在周围需要移动
                newTargetGrid = battleField.battleMap.GetEmptyGrid(mapGrid, UtilityObjs.battleUnits[i].mapGrid, toTargetPath, mobility);
                if (newTargetGrid == null)
                {
                    //UtilityHelper.LogWarning(battleUnitID + "找不到空格子了,看看下一个吧");
                    continue;
                }
                else
                {
                    newTarget    = UtilityObjs.battleUnits[i];
                    searchResult = TargetSearchResult.NeedMove;
                    break;
                }
            }

            if (newTarget == null)
            {
                UtilityHelper.LogWarning("确实找不到了");
                targetBattleUnit = null;
                targetGrid       = null;
                toTargetPath.Clear();
                if (actions != null)
                {
                    //创建一个warning
                    BattleHeroWarningAction action = new BattleHeroWarningAction(this, "No target:" + battleUnitID);
                    actions.Add(action);
                }
                return(TargetSearchResult.Inexistence);
            }

            //目标不一致,切换目标
            if (targetBattleUnit != newTarget)
            {
                //切换目标
                BattleHeroChangeTargetAction action = new BattleHeroChangeTargetAction(this);
                action.lastTargetUnit = targetBattleUnit;
                action.newTargetUnit  = newTarget;

                //设置当前目标以及格子
                targetBattleUnit = newTarget;
                actions.Add(action);
            }

            //移动的格子重新设置
            targetGrid = newTargetGrid;

            return(searchResult);
        }
Пример #9
0
 public void Init(params object[] args)
 {
     UtilityHelper.Log("Battle unit data manager inited.");
 }