Example #1
0
    private CollBase GetOperaColliderInfo(ColliderInfo colliderInfo)
    {
        CollBase collider = null;
        float    startX   = SkillPlayer.MovePos.x + colliderInfo.StartX;
        float    startZ   = SkillPlayer.MovePos.z + colliderInfo.StartZ;
        float    angle    = colliderInfo.StartAngle;

        if (colliderInfo.CollPosType == CollBase.PosType.SKILL || colliderInfo.CollPosType == CollBase.PosType.SKILL_ROTATE)
        {
            startX = Command.TargetPos.x + colliderInfo.StartX;
            startZ = Command.TargetPos.z + colliderInfo.StartZ;
            //附加操作旋转
            if (colliderInfo.CollPosType == CollBase.PosType.SKILL_ROTATE)
            {
                // 方向盘角度 与场景角度差异修正 修正符号(场景y轴 逆时针旋转 与方向盘顺时针旋转 一致)
                angle = Mathf.Atan2(-Command.SkillDir.z, Command.SkillDir.x) * Mathf.Rad2Deg + colliderInfo.StartAngle;
            }
        }
        switch (colliderInfo.ColliderType)
        {
        case CollBase.ColType.RECTANGLE:
            collider = new CollRectange(startX, startZ, angle, colliderInfo.Width, colliderInfo.Height);
            break;

        case CollBase.ColType.SECTOR:
            collider = new CollSector(startX, startZ, angle, colliderInfo.InCircle, colliderInfo.OutCircle, colliderInfo.Angle);
            break;

        default:
            collider = new CollRadius(startX, startZ, angle, colliderInfo.Radius);
            break;
        }

        return(collider);
    }
Example #2
0
    //圆与矩形
    public static bool RadiusToRectangle(CollRadius CollA, CollRectange CollB)
    {
        //长轴距离过滤
        if (Vector2.Distance(CollA.GetV2Pos(), CollB.GetV2Pos()) > CollB.GetLength() + CollA.Radius)
        {
            return(false);
        }

        //获得圆相对矩形中心的相对坐标
        float newRx = CollA.x - CollB.x;
        float newRy = CollA.y - CollB.y;

        if (Mathf.RoundToInt(CollB.GetCalRotate()) != 0)
        {
            //计算最新角度(与X轴的角度),同数学X Y轴 以矩形中心为坐标中心
            float rotate = Mathf.Atan((CollB.y - CollA.y) / (CollB.x - CollA.x)) * Mathf.Rad2Deg;
            float newrot = rotate - CollB.GetCalRotate(); //减去矩形旋转角度 与矩形同时旋转对应的角度

            float distance = Vector2.Distance(CollA.GetV2Pos(), CollB.GetV2Pos());
            //圆相对矩形的 x y
            newRx = Mathf.Cos(newrot * Mathf.Deg2Rad) * distance;
            newRy = Mathf.Sin(newrot * Mathf.Deg2Rad) * distance;
        }


        //矩形 与圆 相交公式 获得在矩形 x y范围内 与圆心最近的点
        float dx  = Mathf.Min(newRx, CollB.width * 0.5f);
        float dx1 = Mathf.Max(dx, -CollB.width * 0.5f);
        float dy  = Mathf.Min(newRy, CollB.height * 0.5f);
        float dy1 = Mathf.Max(dy, -CollB.height * 0.5f);

        return((dx1 - newRx) * (dx1 - newRx) + (dy1 - newRy) * (dy1 - newRy) <= CollA.Radius * CollA.Radius);
    }
Example #3
0
    public void SetBattleInfo(uint battleId = 0, int camp = 0, Vector3 pos = default(Vector3))
    {
        BattleId         = battleId;
        Camp             = camp;
        MoveDir          = MOVE_DIR.NONE;
        Speed            = CharaDefine.PLAYER_SPEED;
        Collider         = new CollRadius(0, 0, 0, CharaDefine.PLAYER_RADIUS);
        MovePos          = pos;
        BattleBuffCouner = new BuffCounter(this);

        ChangeState(BATTLE_STATE.NONE);
    }
Example #4
0
    //圆与扇形 (暂时不做扇形内圆过滤 如有必需 多算一次小扇形是否相交)
    public static bool RadiusToSector(CollRadius CollA, CollSector CollB)
    {
        //长轴距离过滤
        if (Vector2.Distance(CollA.GetV2Pos(), CollB.GetV2Pos()) > CollB.outCircle + CollA.Radius)
        {
            return(false);
        }

        //扇形最远点 即中轴与x轴夹角 (不做旋转时 扇形对称分布 夹角0)
        float angle = CollB.GetCalRotate();
        float cosA  = Mathf.Cos(angle * Mathf.Deg2Rad);
        float sinA  = Mathf.Sin(angle * Mathf.Deg2Rad);
        //计算最远点坐标
        float x2    = CollB.x + cosA * CollB.outCircle;
        float y2    = CollB.y + sinA * CollB.outCircle;
        float theta = CollB.angle * Mathf.Deg2Rad;

        return(IsCircleIntersectFan(CollA.x, CollA.y, CollA.Radius, CollB.x, CollB.y, x2, y2, theta));
    }
Example #5
0
 //圆与圆碰撞
 public static bool RadiusToRadius(CollRadius CollA, CollRadius CollB)
 {
     return(Vector2.Distance(CollA.GetV2Pos(), CollB.GetV2Pos()) <= (CollA.Radius + CollB.Radius));
 }