public CollisionPart(float angle, float radius, float distance, CircleCollisionSystem parent) { Parent = parent; BaseAngle = angle; Radius = radius; Distance = distance; }
static bool GetSingleMultiCollisionPredict(CircleCollisionSystem single, CircleCollisionSystem multi) { if (multi.IsNeedPredict()) { return single.IsCollision(multi.GetPredictateCollisionTarget(), single.GetCollisionTarget()); } else { return true; } }
static bool GetSingleSingleCollision(CircleCollisionSystem c1, CircleCollisionSystem c2) { return c1.IsCollision(c1.GetCollisionTarget(), c2.GetCollisionTarget()); }
static bool GetSingleMultiCollision(CollisionTarget single, CircleCollisionSystem multi) { return multi.Collisions.Any(i => multi.IsCollision(i.GetCollisionTarget(), single)); }
static bool GetSingleMultiCollision(CircleCollisionSystem single, CircleCollisionSystem multi) { if (!GetSingleMultiCollisionPredict(single, multi)) { return false; } return GetSingleMultiCollision(single.GetCollisionTarget(), multi); }
static bool GetMultiMultiCollisionPredict(CircleCollisionSystem c1, CircleCollisionSystem c2) { bool p1 = c1.IsNeedPredict(); bool p2 = c2.IsNeedPredict(); if (!p1 && !p2) { return true; } if (p1 && p2) { return c1.IsCollision(c1.GetPredictateCollisionTarget(), c2.GetPredictateCollisionTarget()); } if (p1 && !p2) { return GetSingleMultiCollision(c1.GetPredictateCollisionTarget(), c2); } if (!p1 && p2) { return GetSingleMultiCollision(c2.GetPredictateCollisionTarget(), c1); } return true; }
static bool GetMultiMultiCollision(CircleCollisionSystem c1, CircleCollisionSystem c2) { if (!GetMultiMultiCollisionPredict(c1, c2)) { return false; } return c1.Collisions .Select(i => i.GetCollisionTarget()) .Any(i => c2.Collisions .Select(j => j.GetCollisionTarget()) .Any(j => c1.IsCollision(i, j)) ); }
public bool GetCollision(CircleCollisionSystem target) { if (IsCollision(GetCollisionTarget(), target.GetCollisionTarget()))//コア判定 { return true; } bool mul1 = IsMultiCollision(); bool mul2 = target.IsMultiCollision(); if (!mul1 && !mul2)//single-singleならend { return false; } if (mul1 && mul2) { return GetMultiMultiCollision(this, target); } if (!mul1 && mul2) { return GetSingleMultiCollision(this, target); } if (mul1 && !mul2) { return GetSingleMultiCollision(target, this); } throw new Exception(); }