public Vector2d[] GetVert2d() { // 先求矩形坐标系中四个点位置 Vector2d v1 = new Vector2d(-e.x, e.y); Vector2d v2 = new Vector2d(e.x, e.y); Vector2d v3 = new Vector2d(e.x, -e.y); Vector2d v4 = new Vector2d(-e.x, -e.y); v1 = center + FPCollide.Rotate(v1, ang); v2 = center + FPCollide.Rotate(v2, ang); v3 = center + FPCollide.Rotate(v3, ang); v4 = center + FPCollide.Rotate(v4, ang); Vector2d[] list = new Vector2d[4]; list[0] = v1; list[1] = v2; list[2] = v3; list[3] = v4; return(list); }
public override void InitPos(ref Vector2d startPos, ref Vector2d startDir) { // 修正起始位置XZ Vector3 deltaPos = m_triggerData.vBulletDeltaPos; float randomDir = m_triggerData.iCurveHeight; Vector2d vL = FPCollide.Rotate(startDir.normalized, 90) * new FixedPoint(deltaPos.x); // 左右偏移 Vector2d vF = startDir.normalized * new FixedPoint(deltaPos.z); // 前后偏移 startPos = m_caster.GetPos() + vL + vF; // 随机方向 //if (randomDir != 0) //{ // int dirDelta = (int)randomDir; // float random = GameManager.Inst.GetRand(-dirDelta, dirDelta + 1, 0); // startDir = FPCollide.Rotate(startDir.normalized, (int)random); //} // 修正起始方向 if (m_triggerData.dirDelta != 0) { startDir = FPCollide.Rotate(startDir, m_triggerData.dirDelta); } }
/// <summary> /// 通过距离,已优化 /// </summary> public void MoveCheck(Collider a, Collider b) { if (!a.active || !b.active) { return; } if (a == b) { return; } if (a is Polygon && b is Polygon) // 障碍之间不检测 { return; } if (!m_rolePush) // 角色不碰撞时,都是圆时,不处理 { if (a is Circle && b is Circle) { return; } } else { if (a is Circle && b is Circle) // 如果角色需要碰撞,并且都是圆,很远时,不处理 { FPCollide.GetDis2(ref m_dis2, ref a.c, ref b.c); if (m_dis2 > CircleCircleDis2) { return; } } } if (a is Circle && b is Polygon) // 角色和障碍太远不处理 { FPCollide.GetDis2(ref m_dis2, ref a.c, ref b.c); if (m_dis2 > CirclePolygonDis2) { return; } } eColliderType type1 = a.GetColliderType(); eColliderType type2 = b.GetColliderType(); switch (type1) { case eColliderType.Circle: switch (type2) { case eColliderType.Circle: CheckCircleAndCircle(a as Circle, b as Circle); break; case eColliderType.Polygon: CheckPolygonAndCircle(b as Polygon, a as Circle); break; } break; } }
public static bool GetAtkTarget(CCreature m_creature, BtDatabase m_dataBase, int lookDis) { // 仇恨值高的优先作为目标 int hTargetUid = m_creature.m_ai.GetHightHatred(); CCreature hTargetCC = CCreatureMgr.Get(hTargetUid); if (hTargetUid != -1 && hTargetCC != null && !hTargetCC.IsDie()) // 有仇恨对象,并且没死 { m_dataBase.SetData <int>((int)eAIParam.INT_TARGET_UID, hTargetUid); } // 如果有目标,判断是否距离足够远,远了就清空目标,继续找附近的 int targetUid = m_dataBase.GetData <int>((int)eAIParam.INT_TARGET_UID); CCreature targetCC = CCreatureMgr.Get(targetUid); if (targetCC == null || FPCollide.GetDis2(targetCC.GetPos(), m_creature.GetPos()) > new FixedPoint(20 * 20) || targetCC.IsDie()) // 隐藏时,不作为目标 { targetUid = 0; } else { return(true); } targetUid = m_creature.GetTarget(lookDis); // 如果没有目标,检测玩家附近的单位,锁定目标 //FixedPoint m_minDis2 = new FixedPoint(999999); //List<long> list = CCreatureMgr.GetCreatureList(); //for (int i = 0; i < list.Count; i++) //{ // CCreature cc = CCreatureMgr.Get(list[i]); // FixedPoint abDis2 = FPCollide.GetDis2(m_creature.GetPos(), cc.GetPos()); // if (abDis2 > new FixedPoint(lookDis * lookDis)) // continue; // if (cc.IsDie() || cc.GetUid() == m_creature.GetUid()) // continue; // //if (m_creature.bCamp(cc)) // // continue; // if (abDis2 < new FixedPoint(lookDis * lookDis)) // 如果目标在视线范围内 // { // if (abDis2 < m_minDis2) // { // targetUid = (int)cc.GetUid(); // m_minDis2 = abDis2; // } // } //} if (targetUid != 0) { m_dataBase.SetData <int>((int)eAIParam.INT_TARGET_UID, targetUid); return(true); } //m_creature.DestoryDownUpSkill(); // 无目标,结束机枪 return(false); }
/// <summary> /// 服务器收到所有人准备后,开始游戏 /// </summary> public void Start(SC_BattleInfo battleInfo) { m_fspMgr = new FspManager(); m_fspMgr.Init(); Debug.Log("开始加载场景,开始汇报场景进度"); LoginModule loginHero = (LoginModule)LayoutMgr.Inst.GetLogicModule(LogicModuleIndex.eLM_PanelLogin); loginHero.SetVisible(false); SelectHeroModule selectHero = (SelectHeroModule)LayoutMgr.Inst.GetLogicModule(LogicModuleIndex.eLM_PanelSelectHero); selectHero.SetVisible(false); MainModule mainModule = (MainModule)LayoutMgr.Inst.GetLogicModule(LogicModuleIndex.eLM_PanelMain); mainModule.SetVisible(false); JoyStickModule js = (JoyStickModule)LayoutMgr.Inst.GetLogicModule(LogicModuleIndex.eLM_PanelJoyStick); js.SetVisible(true); HeadModule head = (HeadModule)LayoutMgr.Inst.GetLogicModule(LogicModuleIndex.eLM_PanelHead); head.SetVisible(true); SetRandSeed(10); CMap map = CMapMgr.Create(1); map.Create(); for (int i = 0; i < battleInfo.playerInfo.Count; i++) { PlayerInfo playerInfo = battleInfo.playerInfo[i]; int uid = (int)playerInfo.uid; if (EGame.m_openid.Equals(uid.ToString())) { EGame.m_uid = uid; } CCreature master = CCreatureMgr.Create(EThingType.Player, uid); master.Create(playerInfo.heroIndex, uid.ToString(), new Vector2d(60, 60 + i * 4), FPCollide.GetVector(60)); master.m_ai = new CCreatureAI(master, eAILevel.HARD); master.m_aiType = eAIType.Player; master.StartAi(false); } for (int i = 0; i < 1; i++) { CCreature test1 = CCreatureMgr.Create(EThingType.Player, 3000 + i); test1.Create(3, "测试" + i, new Vector2d(50 + i * 2, 60), FPCollide.GetVector(-220)); test1.m_ai = new CCreatureAI(test1, eAILevel.EASY); test1.StartAi(true); } for (int i = 0; i < 1; i++) { CCreature test1 = CCreatureMgr.Create(EThingType.Player, 2000 + i); test1.Create(2, "测试" + i, new Vector2d(50 + i * 2, 60), FPCollide.GetVector(-220)); test1.m_ai = new CCreatureAI(test1, eAILevel.EASY); test1.StartAi(true); } for (int i = 0; i < 1; i++) { CCreature test1 = CCreatureMgr.Create(EThingType.Player, 1000 + i); test1.Create(1, "测试" + i, new Vector2d(50 + i * 2, 60), FPCollide.GetVector(-220)); test1.m_ai = new CCreatureAI(test1, eAILevel.EASY); test1.StartAi(true); } m_bRunning = true; }
/// <summary> /// 通过BUFF区域检测触发 /// </summary> public virtual void Trigger() { if (m_triggerData.ShapeType == (int)eBuffTriggerShapeType.Circle) { FPSphere tSphere = new FPSphere(); tSphere.c = GetPos(); tSphere.r = new FixedPoint(m_triggerData.Length); List <long> list = CCreatureMgr.GetCreatureList(); for (int i = 0; i < list.Count; i++) { CCreature creature = CCreatureMgr.Get(list[i]); if (m_caster.bCamp(creature) || creature.IsDie()) { continue; } FPSphere playerS = new FPSphere(); playerS.c = creature.GetPos(); playerS.r = creature.GetR(); if (FPCollide.bSphereSphere(tSphere, playerS)) { OnHitAddBuff(m_caster, creature); } } } else if (m_triggerData.ShapeType == (int)eBuffTriggerShapeType.Sector) { List <long> list = CCreatureMgr.GetCreatureList(); for (int i = 0; i < list.Count; i++) { CCreature creature = CCreatureMgr.Get(list[i]); if (m_caster.bCamp(creature) || creature.IsDie()) { continue; } FPSphere playerS = new FPSphere(); playerS.c = creature.GetPos(); playerS.r = creature.GetR(); FPSector sec = new FPSector(); sec.pos = GetPos(); sec.dir = GetDir(); sec.angle = new FixedPoint(m_triggerData.Width); sec.r = new FixedPoint(m_triggerData.Length); if (FPCollide.bSectorInside(sec, creature.GetPos())) { OnHitAddBuff(m_caster, creature); } } } else if (m_triggerData.ShapeType == (int)eBuffTriggerShapeType.Rect) { List <long> list = CCreatureMgr.GetCreatureList(); for (int i = 0; i < list.Count; i++) { CCreature creature = CCreatureMgr.Get(list[i]); if (m_caster.bCamp(creature) || creature.IsDie()) { continue; } FPSphere playerS = new FPSphere(); playerS.c = creature.GetPos(); playerS.r = creature.GetR(); Vector2d pos = GetPos(); int angle = (int)FPCollide.GetAngle(GetDir()).value; FPObb obb = new FPObb(pos, new Vector2d(m_triggerData.Width, m_triggerData.Length), angle); if (FPCollide.bSphereOBB(playerS, obb)) { OnHitAddBuff(m_caster, creature); } } } if (m_triggerData.PosType == (int)eBuffTriggerPosType.CasterStartPos_SkillDir) { // 障碍碰撞 if (CMapMgr.m_map.IsblockNotAirWal((int)m_curPos.x.value, (int)m_curPos.y.value)) { Destory(); return; } if (PhysicsManager.Inst.IsblockNotAirWal((int)m_curPos.x, (int)m_curPos.y)) { Destory(); return; } // 子弹碰撞 FPSphere cur = new FPSphere(); cur.c = GetPos(); cur.r = GetR(); foreach (KeyValuePair <long, CBuffTrigger> item in CBuffTriggerMgr.m_dicSkill) { CBuffTrigger tri = item.Value; if (tri.m_triggerData.PosType == (int)eBuffTriggerPosType.CasterStartPos_SkillDir && tri != this && tri.m_caster != m_caster) { FPSphere triItem = new FPSphere(); triItem.c = tri.GetPos(); triItem.r = tri.GetR(); if (FPCollide.bSphereSphere(cur, triItem)) { Destory(); tri.Destory(); } } } } }