예제 #1
0
 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);
 }
예제 #2
0
 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() + "\"");
 }
예제 #3
0
 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);
             }
         }
     }
 }
예제 #4
0
 public virtual bool ShouldCheckForCollision(Collider c)
 {
     return (Size.X + Size.Y + c.Size.X + c.Size.Y) / 2 >= DistanceToApprox(c);
 }
예제 #5
0
 public virtual double DistanceToApprox(Collider c)
 {
     return Math.Abs(c.Center.X - Center.X) + Math.Abs(c.Center.Y - Center.Y);
 }
예제 #6
0
 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));
 }
예제 #7
0
 public void AddCollider(Collider c)
 {
     if (!colliders.Contains(c))
         colliders.Add(c);
 }
예제 #8
0
        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;
        }
예제 #9
0
 public CollisionInfo(Collider c1, Collider c2, AABB intersection)
 {
     this.c1 = c1;
     this.c2 = c2;
     this.intersection = intersection;
 }