/// <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); } }
/// <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); }