コード例 #1
0
    /// <summary>
    /// 创建单位
    /// </summary>
    private void CreateItems()
    {
        quadtree = new TargetList <Holder>(Width * 0.5f, Heght * 0.5f, Width, Heght, 1);
        var random = new Random(DateTime.Now.Millisecond);

        for (var i = 0; i < ItemCount; i++)
        {
            var circle = new CircleGraphics(new Vector2(random.Next(0, Width), random.Next(0, Heght)), random.Next(1, 10));
            var holder = new Holder();
            holder.Direction           = new Vector2(random.Next(-10, 10), random.Next(-10, 10));
            holder.MyCollisionGraphics = circle;
            quadtree.Add(holder);
        }
    }
コード例 #2
0
    /// <summary>
    /// 生成行为单元
    /// </summary>
    /// <returns>行为单元对象</returns>
    public override IFormula GetFormula(FormulaParamsPacker paramsPacker)
    {
        if (paramsPacker == null)
        {
            return(null);
        }
        IFormula result = null;

        // 替换替换符的数据
        ReplaceData(paramsPacker);

        // 数据本地化
        var myReceivePos  = ReceivePos;
        var myTargetCamps = TargetCamps;
        var clusterData   = paramsPacker.ReleaseMember.ClusterData;
        var myFormulaType = FormulaType;
        var myScopeType   = ScopeType;
        var myTargetCount = TargetCount;
        var myIsFollowDir = IsFollowDir;

        // 目标权重筛选数据
        var targetSelectData = TargetSelectDataId > 0 ? new SelectWeightData(SData_armyaim_c.Single.GetDataOfID(TargetSelectDataId)) : null;

        result = new Formula((callback, scope) =>
        {
            // 检测范围
            ICollisionGraphics graphics = null;

            var pos       = Utils.V3ToV2WithouY(GetPosByType(myReceivePos, paramsPacker, scope));
            var plusAngle = 0f;
            if (myIsFollowDir)
            {
                plusAngle = Utils.GetAngleWithZ(clusterData.Direction);
            }
            // 获取图形对象
            switch (myScopeType)
            {
            case GraphicType.Circle:
                // 圆形
                graphics = new CircleGraphics(pos, Arg1);
                break;

            case GraphicType.Rect:
                // 矩形
                graphics = new RectGraphics(pos, Arg1, Arg2, Arg3 + plusAngle);
                break;

            case GraphicType.Sector:
                // 扇形
                graphics = new SectorGraphics(pos, Arg3 + plusAngle, Arg1, Arg2);
                break;
            }

            // 获取周围单位DisplayOwner列表
            var packerList = FormulaParamsPackerFactroy.Single.GetFormulaParamsPackerList(graphics,
                                                                                          paramsPacker.StartPos,
                                                                                          myTargetCamps,
                                                                                          paramsPacker.Skill,
                                                                                          paramsPacker.TargetMaxCount);

            // 根据权重数据筛选目标
            if (targetSelectData != null)
            {
                packerList = TargetSelecter.TargetFilter(targetSelectData, clusterData, packerList);

                // 对他们释放技能(技能编号)
                if (packerList != null)
                {
                    var counter       = 0;
                    var completeCount = 0;
                    var allCount      = packerList.Count;
                    foreach (var packer in packerList)
                    {
                        // 如果设置了数量上限, 并且超过数量上限则跳出
                        if (myTargetCount > 0 && counter >= myTargetCount)
                        {
                            break;
                        }
                        // 执行子行为链
                        if (SubFormulaItem != null)
                        {
                            var subSkill = new SkillInfo(packer.SkillNum);
                            FormulaParamsPackerFactroy.Single.CopyPackerData(paramsPacker, packer);
                            subSkill.DataList = packer.DataList;
                            subSkill.AddActionFormulaItem(SubFormulaItem);
                            //subSkill.GetFormula(packer);
                            SkillManager.Single.DoSkillInfo(subSkill, packer, true, () =>
                            {
                                // 执行完成, 回调
                                completeCount++;
                                if (completeCount >= myTargetCount || completeCount >= allCount)
                                {
                                    callback();
                                }
                            });
                        }
                        counter++;
                    }
                }
            }
        }, myFormulaType);


        return(result);
    }