public bool BoxCollidersHaveCollided(IBoxCollidable subject, IBoxCollidable target)
        {
            if (PositionedColliderBoundingBoxRequiresUpdate(subject)) { PositionBoxColliderBoundingBox(subject); }
            if (PositionedColliderBoundingBoxRequiresUpdate(target)) { PositionBoxColliderBoundingBox(target); }

            return BoundingBoxesHaveCollided(subject.PositionedCollisionBoundingBox, target.PositionedCollisionBoundingBox);
        }
        public bool BoxAndCircularCollidersHaveCollided(IBoxCollidable subject, ICircularCollidable target)
        {
            if (PositionedColliderBoundingBoxRequiresUpdate(subject)) { PositionBoxColliderBoundingBox(subject); }
            if (PositionedColliderBoundingCircleRequiresUpdate(target)) { PositionCircularColliderBoundingCircle(target); }

            return target.PositionedCollisionBoundingCircle.Intersects(subject.PositionedCollisionBoundingBox);
        }
Ejemplo n.º 3
0
        public virtual void AddCollidableObject(ICollidable toAdd)
        {
            IBoxCollidable box = toAdd as IBoxCollidable;

            if ((box != null) && (!_boxColliders.Contains(box)))
            {
                _boxColliders.Add(box); return;
            }

            ICircularCollidable circle = toAdd as ICircularCollidable;

            if ((circle != null) && (!_circularColliders.Contains(circle)))
            {
                _circularColliders.Add(circle); return;
            }

            IPolygonCollidable poly = toAdd as IPolygonCollidable;

            if ((poly != null) && (!_polygonColliders.Contains(poly)))
            {
                _polygonColliders.Add(poly); return;
            }

            ICompoundPolygonCollidable compound = toAdd as ICompoundPolygonCollidable;

            if ((compound != null) && (!_compoundPolygonColliders.Contains(compound)))
            {
                _compoundPolygonColliders.Add(compound); return;
            }
        }
Ejemplo n.º 4
0
        public virtual void RemoveCollidableObject(ICollidable toRemove)
        {
            IBoxCollidable box = toRemove as IBoxCollidable;

            if ((box != null) && (_boxColliders.Contains(box)))
            {
                _boxColliders.Remove(box); return;
            }

            ICircularCollidable circle = toRemove as ICircularCollidable;

            if ((circle != null) && (_circularColliders.Contains(circle)))
            {
                _circularColliders.Remove(circle); return;
            }

            IPolygonCollidable poly = toRemove as IPolygonCollidable;

            if ((poly != null) && (_polygonColliders.Contains(poly)))
            {
                _polygonColliders.Remove(poly); return;
            }

            ICompoundPolygonCollidable compound = toRemove as ICompoundPolygonCollidable;

            if ((compound != null) && (_compoundPolygonColliders.Contains(compound)))
            {
                _compoundPolygonColliders.Remove(compound); return;
            }
        }
Ejemplo n.º 5
0
        private bool PositionedColliderBoundingBoxRequiresUpdate(IBoxCollidable toCheck)
        {
            if (!toCheck.WorldPositionIsFixed)
            {
                return(true);
            }

            return((toCheck.PositionedCollisionBoundingBox == Rectangle.Empty) || (toCheck.PositionedCollisionBoundingBox == null));
        }
Ejemplo n.º 6
0
        protected void CheckIndividualBoxColliderToAllTypes(IBoxCollidable subject)
        {
            if (subject.Collidable)
            {
                CheckIndividualBoxColliderToAllBoxColliders(subject);
                CheckIndividualBoxColliderToAllCircularColliders(subject);

                // TODO
                //CheckIndividualBoxColliderToAllPolygonColliders(_boxColliders[i]);
                //CheckIndividualBoxColliderToAllCompoundPolygonColliders(_boxColliders[i]);
            }
        }
Ejemplo n.º 7
0
        public bool BoxCollidersHaveCollided(IBoxCollidable subject, IBoxCollidable target)
        {
            if (PositionedColliderBoundingBoxRequiresUpdate(subject))
            {
                PositionBoxColliderBoundingBox(subject);
            }
            if (PositionedColliderBoundingBoxRequiresUpdate(target))
            {
                PositionBoxColliderBoundingBox(target);
            }

            return(BoundingBoxesHaveCollided(subject.PositionedCollisionBoundingBox, target.PositionedCollisionBoundingBox));
        }
Ejemplo n.º 8
0
        public bool BoxAndCircularCollidersHaveCollided(IBoxCollidable subject, ICircularCollidable target)
        {
            if (PositionedColliderBoundingBoxRequiresUpdate(subject))
            {
                PositionBoxColliderBoundingBox(subject);
            }
            if (PositionedColliderBoundingCircleRequiresUpdate(target))
            {
                PositionCircularColliderBoundingCircle(target);
            }

            return(target.PositionedCollisionBoundingCircle.Intersects(subject.PositionedCollisionBoundingBox));
        }
Ejemplo n.º 9
0
 private void CheckIndividualBoxColliderToAllCircularColliders(IBoxCollidable subject)
 {
     if (subject.Collidable)
     {
         int circularColliderCount = _circularColliders.Count;
         for (int i = 0; i < circularColliderCount; i++)
         {
             if ((_circularColliders[i].Collidable) && (BoxAndCircularCollidersHaveCollided(subject, _circularColliders[i])))
             {
                 subject.HandleCollision(_circularColliders[i]);
                 _circularColliders[i].HandleCollision(subject);
             }
         }
     }
 }
Ejemplo n.º 10
0
 private void CheckIndividualBoxColliderToAllBoxColliders(IBoxCollidable subject)
 {
     if (subject.Collidable)
     {
         int boxColliderCount = _boxColliders.Count;
         for (int i = 0; i < boxColliderCount; i++)
         {
             if ((_boxColliders[i] != subject) && (_boxColliders[i].Collidable) && (BoxCollidersHaveCollided(subject, _boxColliders[i])))
             {
                 subject.HandleCollision(_boxColliders[i]);
                 _boxColliders[i].HandleCollision(subject);
             }
         }
     }
 }
Ejemplo n.º 11
0
        private void CheckAndHandleTileImpact(int mapX, int mapY)
        {
            if (!_map.CellIsOccupied(mapX, mapY))
            {
                return;
            }

            IBoxCollidable collisionTile = (IBoxCollidable)_map.GetTile(mapX, mapY);

            if ((collisionTile.Collidable) && (_collisionController.BoxAndCircularCollidersHaveCollided(collisionTile, this)))
            {
                collisionTile.HandleCollision(this);
                this.HandleCollision(collisionTile);
            }
        }
Ejemplo n.º 12
0
        private void PositionBoxColliderBoundingBox(IBoxCollidable sourceCollidable)
        {
            if (sourceCollidable.PositionedCollisionBoundingBox == null)
            {
                sourceCollidable.PositionedCollisionBoundingBox = Rectangle.Empty;
            }

            Rectangle temp = sourceCollidable.PositionedCollisionBoundingBox;

            temp.X      = (int)sourceCollidable.WorldPosition.X + sourceCollidable.CollisionBoundingBox.X;
            temp.Y      = (int)sourceCollidable.WorldPosition.Y + sourceCollidable.CollisionBoundingBox.Y;
            temp.Width  = sourceCollidable.CollisionBoundingBox.Width;
            temp.Height = sourceCollidable.CollisionBoundingBox.Height;

            sourceCollidable.PositionedCollisionBoundingBox = temp;
        }
        protected void CheckIndividualBoxColliderToAllTypes(IBoxCollidable subject)
        {
            if (subject.Collidable)
            {
                CheckIndividualBoxColliderToAllBoxColliders(subject);
                CheckIndividualBoxColliderToAllCircularColliders(subject);

                // TODO
                //CheckIndividualBoxColliderToAllPolygonColliders(_boxColliders[i]);
                //CheckIndividualBoxColliderToAllCompoundPolygonColliders(_boxColliders[i]);
            }
        }
 private void CheckIndividualBoxColliderToAllCircularColliders(IBoxCollidable subject)
 {
     if (subject.Collidable)
     {
         int circularColliderCount = _circularColliders.Count;
         for (int i = 0; i < circularColliderCount; i++)
         {
             if ((_circularColliders[i].Collidable) && (BoxAndCircularCollidersHaveCollided(subject, _circularColliders[i])))
             {
                 subject.HandleCollision(_circularColliders[i]);
                 _circularColliders[i].HandleCollision(subject);
             }
         }
     }
 }
        private void PositionBoxColliderBoundingBox(IBoxCollidable sourceCollidable)
        {
            if (sourceCollidable.PositionedCollisionBoundingBox == null)
            {
                sourceCollidable.PositionedCollisionBoundingBox = Rectangle.Empty;
            }

            Rectangle temp = sourceCollidable.PositionedCollisionBoundingBox;

            temp.X = (int)sourceCollidable.WorldPosition.X + sourceCollidable.CollisionBoundingBox.X;
            temp.Y = (int)sourceCollidable.WorldPosition.Y + sourceCollidable.CollisionBoundingBox.Y;
            temp.Width = sourceCollidable.CollisionBoundingBox.Width;
            temp.Height = sourceCollidable.CollisionBoundingBox.Height;

            sourceCollidable.PositionedCollisionBoundingBox = temp;
        }
 private void CheckIndividualBoxColliderToAllBoxColliders(IBoxCollidable subject)
 {
     if (subject.Collidable)
     {
         int boxColliderCount = _boxColliders.Count;
         for (int i = 0; i < boxColliderCount; i++)
         {
             if ((_boxColliders[i] != subject) && (_boxColliders[i].Collidable) && (BoxCollidersHaveCollided(subject, _boxColliders[i])))
             {
                 subject.HandleCollision(_boxColliders[i]);
                 _boxColliders[i].HandleCollision(subject);
             }
         }
     }
 }
        private bool PositionedColliderBoundingBoxRequiresUpdate(IBoxCollidable toCheck)
        {
            if (!toCheck.WorldPositionIsFixed) { return true; }

            return ((toCheck.PositionedCollisionBoundingBox == Rectangle.Empty) || (toCheck.PositionedCollisionBoundingBox == null));
        }