Beispiel #1
0
    public override void InitData()
    {
        type      = ShapeType.arc;
        arcRadius = ToolMethod.Config2Logic(arcRadiusCon);

        arcCenter = ToolGameVector.ChangeGameVectorConToGameVector2(arcCenterCon) + basePosition;
    }
Beispiel #2
0
    public void InitSelf(ObjectType _objType, int _objID)
    {
        isInDestory = false;
        objUid      = new ObjectUid(_objType, _objID);

        basePosition = ToolGameVector.ChangeGameVectorConToGameVector2(baseCenter);
        baseRadius   = ToolMethod.Config2Logic(baseRadiusCon);
        InitData();
    }
Beispiel #3
0
    /// <summary>
    /// 圆和多边形的碰撞
    /// </summary>
    /// <returns><c>true</c>, if circle and polygon was collided, <c>false</c> otherwise.</returns>
    /// <param name="_c1">圆心.</param>
    /// <param name="_radius1">圆半径.</param>
    /// <param name="vectexs">多边形顶点.</param>
    /// <param name="normalDir">多边形每条边的法向量.</param>
    /// <param name="_amend">位置修正.</param>
    public static bool CollideCircleAndPolygon(GameVector2 _c1, int _radius1, GameVec2Con[] vectexs, int[] normalDir, out GameVector2 _amend)
    {
        _amend = GameVector2.zero;
        Vector3 _circleCenter = ToolGameVector.ChangeGameVectorToVector3(_c1);

        for (int i = 0; i < vectexs.Length; i++)
        {
            Vector3 lineBegin = ToolGameVector.ChangeGameVectorConToVector3(vectexs [i]);
            int     endIndex  = (i + 1) % vectexs.Length;
            Vector3 lineEnd   = ToolGameVector.ChangeGameVectorConToVector3(vectexs [endIndex]);

            Vector3 _circleVec = _circleCenter - lineBegin;
            Vector3 _line      = lineEnd - lineBegin;
            Vector3 _cross     = Vector3.Cross(_circleVec, _line);
            if (_cross.z < 0)
            {
                //在线段的左侧,即多边形的外侧
                Vector3 vecProj    = Vector3.Project(_circleVec, _line);              //投影点
                float   disLine    = _line.magnitude;
                float   proj_begin = vecProj.magnitude;
                float   proj_end   = (vecProj - _line).magnitude;
                float   projlengh  = proj_begin + proj_end;
                if ((disLine + 1) >= projlengh)
                {
                    //投影在线段上
                    int dis       = (int)Mathf.Sqrt(_circleVec.sqrMagnitude - vecProj.sqrMagnitude);
                    int disRadius = _radius1 / 100;
                    if (dis < disRadius)
                    {
                        int amendDis = 1 + (int)(_radius1 / 100 - dis);
                        _amend = amendDis * BattleData.Instance.GetSpeed(normalDir [i]);
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }
                else
                {
                    Vector3 newLineBegin;
                    Vector3 newLineEnd;
                    //投影不在当前线段上
                    bool isSameDir = Vector3.Dot(vecProj, _line) > 0f ? true : false; //为0的时候是垂直,不会出现该情况
                    int  normalIndex;
                    int  linePointIndex;                                              //2条线段的交点
                    if (isSameDir)
                    {
                        //同向
                        newLineBegin = lineEnd;
                        int newEndIndex = (i + 2) % vectexs.Length;
                        newLineEnd     = ToolGameVector.ChangeGameVectorConToVector3(vectexs [newEndIndex]);
                        normalIndex    = endIndex;
                        linePointIndex = endIndex;
                    }
                    else
                    {
                        //反向
                        if (i == 0)
                        {
                            newLineBegin = ToolGameVector.ChangeGameVectorConToVector3(vectexs [vectexs.Length - 1]);
                        }
                        else
                        {
                            newLineBegin = ToolGameVector.ChangeGameVectorConToVector3(vectexs [i - 1]);
                        }
                        newLineEnd     = lineBegin;
                        normalIndex    = vectexs.Length - 1;
                        linePointIndex = i;
                    }
                    Vector3 newCircleVec  = _circleCenter - newLineBegin;
                    Vector3 _newline      = newLineEnd - newLineBegin;
                    Vector3 newVecProj    = Vector3.Project(newCircleVec, _newline);                  //投影点
                    float   newdisLine    = _newline.magnitude;
                    float   newproj_begin = newVecProj.magnitude;
                    float   newproj_end   = (newVecProj - _newline).magnitude;
                    float   newprojlengh  = newproj_begin + newproj_end;
                    if ((newdisLine + 1) >= newprojlengh)
                    {
                        //投影在线段上
                        int dis       = (int)Mathf.Sqrt(newCircleVec.sqrMagnitude - newVecProj.sqrMagnitude);
                        int disRadius = _radius1 / 100;
                        if (dis < disRadius)
                        {
                            int amendDis = 1 + (int)(_radius1 / 100 - dis);
                            _amend = amendDis * BattleData.Instance.GetSpeed(normalDir [normalIndex]);
                            return(true);
                        }
                        else
                        {
                            return(false);
                        }
                    }
                    else
                    {
                        bool isNewSameDir = Vector3.Dot(newVecProj, _newline) > 0f ? true : false;
                        if (isNewSameDir != isSameDir)
                        {
                            //夹角处
                            GameVector2 _point = ToolGameVector.ChangeGameVectorConToGameVector2(vectexs [linePointIndex]);
                            GameVector2 _outAmend;
                            bool        _result = ToolGameVector.CollidePointAndCircle(_c1, _point, _radius1, out _outAmend);
                            _amend = _outAmend;
                            return(_result);
                        }
                    }
                }
            }
        }
        return(false);
    }