コード例 #1
0
        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);
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
ファイル: PhysicalSystem.cs プロジェクト: mengtest/fs
        /// <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;
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        /// <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;
        }
コード例 #6
0
        /// <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();
                        }
                    }
                }
            }
        }