public void AddInteractors(IInteracter interact) { if (typeof(Shot).IsAssignableFrom(interact.GetCollider().BaseType)) this.shotInteractors.Add(interact); else this.interactors.Add(interact); }
/// <summary> /// 円形あたり判定と長方形あたり判定を持つオブジェクトどうしのあたり判定を行う /// </summary> /// <param name="circle"></param> /// <param name="square"></param> /// <returns></returns> public static bool IsInteractCircleSquare(IInteracter circle, IInteracter square) { //円の中に長方形の4点のうちどれかがあるかどうか判定 for (int i = 0; i < 4; i++) { if (PointCircleInteractHelper(((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[i], circle.GetPosition(), ((CircleCollider)(circle.GetCollider())).Radius)) { return true; } } //ここまで //長方形の中に物体が入り込んでいるかどうかを判定判定 double theta = GetThetaHelper(((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[0], ((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[1], circle.GetPosition());//3点の成す角1 double theta2 = GetThetaHelper(((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[2], ((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[3], circle.GetPosition());//3点の成す角2 if (0 <= theta && theta <= Math.PI / 2 && 0 <= theta2 && theta2 <= Math.PI / 2) return true; //ここまで //線分と点との距離を求める for (int i = 0; i < 4; i++) { double d = GetDistanceHelper( circle.GetPosition().PosX, circle.GetPosition().PosY, ((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[i].PosX, ((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[i].PosY, ((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[(i + 1) % 4].PosX, ((SquareCollider)(square.GetCollider())).SquarePosition.SquarePosition[(i + 1) % 4].PosY); if (d < ((CircleCollider)(circle.GetCollider())).Radius) { return true; } } return false; }
public static bool IsInteractCircleCircle(IInteracter obj1, IInteracter obj2) { //円と円のあたり判定 int x0 = obj2.GetPosition().PosX; int x1 = obj1.GetPosition().PosX; int y0 = obj2.GetPosition().PosY; int y1 = obj1.GetPosition().PosY; int d = ((CircleCollider)obj1.GetCollider()).Radius + ((CircleCollider)obj2.GetCollider()).Radius; return (x0 - x1) * (x0 - x1) + (y0 - y1) * (y0 - y1) < d * d; }
private bool IsCollition(IInteracter obj1, IInteracter obj2) { if (obj1.GetCollider().BaseType == obj2.GetCollider().BaseType) return false; if (obj1.GetCollider().NoCollitionTypes != null) { foreach (var noCollitionObject in obj1.GetCollider().NoCollitionTypes) { if (noCollitionObject.IsAssignableFrom(obj2.GetCollider().BaseType)) return false; } } if (obj2.GetCollider().NoCollitionTypes != null) { foreach (var noCollitionObject in obj2.GetCollider().NoCollitionTypes) { if (noCollitionObject.IsAssignableFrom(obj1.GetCollider().BaseType)) return false; } } if (obj1.GetCollider().GetSharpType() == ColliderBase.SharpType.Circle) { if (obj2.GetCollider().GetSharpType() == ColliderBase.SharpType.Circle) { return CollitionCalculator.IsInteractCircleCircle(obj1, obj2); } else { return CollitionCalculator.IsInteractCircleSquare(obj1, obj2); } } else { if (obj2.GetCollider().GetSharpType() == ColliderBase.SharpType.Circle) { return CollitionCalculator.IsInteractCircleSquare(obj2, obj1); } else { return CollitionCalculator.IsInteractSquareSquare(obj1, obj2); } } }