public void RemoveCollider(Collider c) { for (int i = 0; i < collisions.Count; i++) { if (collisions[i].c1 == c) { collisions[i].c2.InvokeCollisionEnded(collisions[i]); if (onCollidionEnded != null) onCollidionEnded.Invoke(collisions[i]); collisions.RemoveAt(i); i--; continue; } if (collisions[i].c2 == c) { collisions[i].c1.InvokeCollisionEnded(collisions[i]); if (onCollidionEnded != null) onCollidionEnded.Invoke(collisions[i]); collisions.RemoveAt(i); i--; continue; } } colliders.Remove(c); }
public static bool AreColliding(Collider c1, Collider c2, out AABB CollisionArea) { if (c1 is AABB) { if (c2 is AABB) return AreColliding(c1 as AABB, c2 as AABB, out CollisionArea); } throw new NotImplementedException("Collision checker not registered for types \"" + c1.GetType().ToString() + "\" and \"" + c2.GetType().ToString() + "\""); }
public void OnColliderMoved(Collider c) { AABB a; for (int i = 0; i < colliders.Count; i++) { if (colliders[i] != c && ColliderGroupManager.CanCollide(c.Group, colliders[i].Group) && c.ShouldCheckForCollision(colliders[i])) { if (CollisionChecker.AreColliding(c, colliders[i], out a)) { RegisterCollision(c, colliders[i], a); } } } }
public virtual bool ShouldCheckForCollision(Collider c) { return (Size.X + Size.Y + c.Size.X + c.Size.Y) / 2 >= DistanceToApprox(c); }
public virtual double DistanceToApprox(Collider c) { return Math.Abs(c.Center.X - Center.X) + Math.Abs(c.Center.Y - Center.Y); }
public virtual double DistanceTo(Collider c) { return Math.Sqrt(Math.Pow(c.Center.X - Center.X, 2) + Math.Pow(c.Center.Y - Center.Y, 2)); }
public void AddCollider(Collider c) { if (!colliders.Contains(c)) colliders.Add(c); }
private CollisionInfo RegisterCollision(Collider c1, Collider c2, AABB intersection) { for (int i = 0; i < collisions.Count; i++) { if ((collisions[i].c1 == c1 && collisions[i].c2 == c2) || (collisions[i].c1 == c2 && collisions[i].c2 == c1)) { return collisions[i]; } } CollisionInfo c = new CollisionInfo(c1, c2, intersection); collisions.Add(c); c1.InvokeCollisionStarted(c); c2.InvokeCollisionStarted(c); if (onCollisionStarted != null) onCollisionStarted.Invoke(c); return c; }
public CollisionInfo(Collider c1, Collider c2, AABB intersection) { this.c1 = c1; this.c2 = c2; this.intersection = intersection; }