Beispiel #1
0
        public void Remove(Collider collider)
        {
            if (!ColliderList.Contains(collider))
            {
                return;
            }

            /*
             * foreach (Cell cell in GetCells(collider.WorldTransform))
             * {
             *  if (cell.Colliders.Contains(collider))
             *  {
             *      cell.Colliders.Remove(collider);
             *  }
             * }
             */
            // OR
            ForEach((cell) => { if (cell.Colliders.Contains(collider))
                                {
                                    cell.Colliders.Remove(collider);
                                }
                    });

            ComputedCollision.Remove(collider);

            ColliderList.Remove(collider);
        }
Beispiel #2
0
        public void Reset()
        {
            ForEach((cell) => cell.Colliders.Clear());

            ComputedCollision.Clear();

            ColliderList.Clear();
        }
Beispiel #3
0
        public IEnumerable <Collider> GetCollisions(Collider collider)
        {
            if (!ComputedCollision.ContainsKey(collider))
            {
                return(null);
            }

            return(ComputedCollision[collider]);
        }
Beispiel #4
0
        public bool HasCollision(Collider collider)
        {
            if (ComputedCollision.ContainsKey(collider) && ComputedCollision[collider].Count > 0)
            {
                return(true);
            }

            return(false);
        }
Beispiel #5
0
        public void ComputeCollision(Collider collider)
        {
            if (!ComputedCollision.ContainsKey(collider) || !collider.Collidable)
            {
                return;
            }

            Pair <Collider> test_pair = new Pair <Collider>(collider, null);

            IEnumerable <Cell> to_test;

            ColliderPhysics colliderPhy = null;
            Vector2         velocity    = Vector2.Zero;

            if (collider is ColliderPhysics)
            {
                colliderPhy = collider as ColliderPhysics;
                velocity    = colliderPhy.Velocity * GameCore.DeltaTime;
                to_test     = GetCells(GetTransformVelocity(colliderPhy.WorldTransform, velocity));
            }
            else
            {
                to_test = GetCells(collider.WorldTransform);
            }

            foreach (Cell cell in to_test)
            {
                foreach (Collider other in cell.Colliders)
                {
                    test_pair.second = other;

                    if (collider == other || !other.Collidable || CollisionPair.Contains(test_pair))
                    {
                        continue;
                    }

                    if (colliderPhy.IsNotNull())
                    {
                        if (SweptAABB(colliderPhy, other, velocity, out Vector3 normal))
                        {
                            ComputedCollision[collider].Add(other);
                            ComputedCollision[other].Add(collider);
                            CollisionPair.Add(new Pair <Collider>(collider, other, normal));
                        }
                    }
                    else if (collider.WorldTransform.IntersectBox(other.WorldTransform))
                    {
                        ComputedCollision[collider].Add(other);
                        ComputedCollision[other].Add(collider);
                        CollisionPair.Add(new Pair <Collider>(collider, other));
                    }
                }
            }
        }