public override void InitData() { type = ShapeType.arc; arcRadius = ToolMethod.Config2Logic(arcRadiusCon); arcCenter = ToolGameVector.ChangeGameVectorConToGameVector2(arcCenterCon) + basePosition; }
public void InitSelf(ObjectType _objType, int _objID) { isInDestory = false; objUid = new ObjectUid(_objType, _objID); basePosition = ToolGameVector.ChangeGameVectorConToGameVector2(baseCenter); baseRadius = ToolMethod.Config2Logic(baseRadiusCon); InitData(); }
/// <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); }