コード例 #1
0
        public override void Update(GameTime gameTime)
        {
            base.Update(gameTime);
            for (int i = 0; i < objects.Count; ++i)
            {
                ICollidableObject obj1 = objects[i];
                for (int j = i + 1; j < objects.Count; j++)
                {
                    ICollidableObject obj2 = objects[j];
                    if (obj1.CheckCollision(obj2))
                    {
                        if (!collidingObjects.Contains(obj1))
                        {
                            collidingObjects.Add(obj1);
                            collidingObjects.Add(obj2);

                            if (this.ObjectsCollided != null)
                            {
                                CollisionEventArgs args = new CollisionEventArgs(obj1, obj2);
                                this.ObjectsCollided(this, args);
                            }
                        }
                    }
                    else
                    {
                        collidingObjects.Remove(obj1);
                        collidingObjects.Remove(obj2);
                    }
                }
            }
        }
コード例 #2
0
        public static CollisionLifetimeEntry Acquire(ICollidableObject a, ICollidableObject b, float timeOfCollision)
        {
            var instance = Acquire();

            instance.Reset(a, b, timeOfCollision);
            return(instance);
        }
コード例 #3
0
 public void AddCollidable(ICollidableObject collidable)
 {
     if (!objects.Contains(collidable))
     {
         this.objects.Add(collidable);
     }
 }
コード例 #4
0
        protected void CheckCollisionFor(ICollidableObject primary, ICollidableObject secondary)
        {
            CollisionRuleEntry collisionRule;

            if (CollisionRules.CanCollide(primary.CollisionClass, secondary.CollisionClass, out collisionRule))
            {
                ICollisionLifetimeEntry collisionEntry = null;
                //Check the collision lifetime tracker.  If there is already a collision lifetime entry being tracked, do nothing and return.
                if (_collisionLifetimes.Contains(primary, secondary, out collisionEntry))
                {
                    //The specified entities have collided before.  Check to see if this collision time is last the cooldown period
                    if ((collisionRule != null) &&
                        !collisionEntry.CanCollideAgain(collisionRule.Cooldown, Globals.TotalGameTimeSeconds))
                    {
                        return;
                    }
                }

                if (CollisionChecker.AreInCollision(primary, secondary))
                {
                    if (collisionRule == null || collisionRule.TrackLifeTime)
                    {
                        _collisionLifetimes.Add(primary, secondary, Globals.TotalGameTimeSeconds);
                    }
                    _onCollision.Notify(new CollisionEventArgs(primary, secondary));
                }
            }
        }
コード例 #5
0
        private void Detach()
        {
            _a.OnReleased.Remove(_onTrackedCollidablesReleased);
            _b.OnReleased.Remove(_onTrackedCollidablesReleased);

            _a = null;
            _b = null;
        }
コード例 #6
0
        public bool Intersects(ICollidableObject collidableObject)
        {
            if (null == collidableObject || null == CollisionExtent)
            {
                return(false);
            }

            return(CollisionExtent.Intersects(CollisionMode, collidableObject.CollisionExtent, collidableObject.CollisionMode));
        }
コード例 #7
0
        public static int GetCombinedHash(ICollidableObject a, ICollidableObject b)
        {
            if (null == a || null == b)
            {
                return(InvalidCombinedHash);
            }

            return(a.GetHashCode() ^ b.GetHashCode());
        }
コード例 #8
0
        /// <summary>
        /// Checks to see if this class contains a collision record for the two specified collidable objects.
        /// </summary>
        /// <param name="a">The first collision participant.  Order does not matter.</param>
        /// <param name="b">The second collision participant.  Order does not matter.</param>
        /// <returns>True if these two entities have collided in the past, false otherwise.</returns>
        public bool Contains(ICollidableObject a, ICollidableObject b)
        {
            if (null == a || null == b)
            {
                return(false);
            }

            return(_entries.ContainsKey(a.GetHashCode() ^ b.GetHashCode()));
        }
コード例 #9
0
        public void Execute(IGameObject gameObject, IGameObject collidedWith)
        {
            ICollidableObject trigger = (ICollidableObject)collidedWith;

            if (Game1.GetLevel().Players.Any(e => !e.BoundingBox.Intersects(trigger.BoundingBox)))
            {
                return;
            }
            ((CameraFocusTrigger)collidedWith).ActivateTrigger();
        }
コード例 #10
0
        public static CollisionInteractionType GetCollisionInteractionType(ICollidableObject a, ICollidableObject b)
        {
            CollisionInteractionType type = CollisionInteractionType.Invalid;

            if ((null == a) || (null == b))
            {
                return(type);
            }

            if (a == b)
            {
                return(type);
            }

            return(GetCollisionInteractionType(a.CollisionMode, b.CollisionMode));
        }
コード例 #11
0
        public bool Add(ICollidableObject a, ICollidableObject b, float timeOfCollision)
        {
            int hash = CollisionLifetimeEntry.GetCombinedHash(a, b);

            if (_entries.ContainsKey(hash))
            {
                //There is already a collision recorded for this entry, update the latest time at which it occured instead.
                _entries[hash].TimeOfCollision = timeOfCollision;
                return(true);
            }
            else
            {
                var toAdd = CollisionLifetimeEntry.Acquire(a, b, timeOfCollision);
                _entries.Add(hash, toAdd);
                return(base.Add(toAdd));
            }
        }
コード例 #12
0
        private void Attach(ICollidableObject a, ICollidableObject b)
        {
            if (null == a)
            {
                throw new ArgumentNullException("a");
            }

            if (null == b)
            {
                throw new ArgumentNullException("b");
            }

            _a = a;
            _b = b;

            _a.OnReleased.Add(_onTrackedCollidablesReleased);
            _b.OnReleased.Add(_onTrackedCollidablesReleased);
        }
コード例 #13
0
        public void Execute(IGameObject gameObject, IGameObject collidedWith)
        {
            ICollidableObject door = (ICollidableObject)collidedWith;

            if (Game1.GetLevel().CurrentWorldState >= WorldState.Transitioning || Game1.GetLevel().Players.Any(e => !e.BoundingBox.Intersects(door.BoundingBox)))
            {
                return;
            }
            Game1.GetLevel().CurrentWorldState = WorldState.Transitioning;
            foreach (var player1 in Game1.GetLevel().Players)
            {
                var player = (IPhysicsObject)player1;
                player.IsKinematic = true;
            }
            DoorTransitionTrigger trigger = (DoorTransitionTrigger)collidedWith;

            trigger.ActivateTrigger();
        }
コード例 #14
0
        /// <summary>
        /// Checks to see if this class contains a collision record for the two specified collidable objects.
        /// </summary>
        /// <param name="a">The first collision participant.  Order does not matter.</param>
        /// <param name="b">The second collision participant.  Order does not matter.</param>
        /// <param name="entry">The out parameter containing the collision record details.</param>
        /// <returns>True if these two entities have collided in the past, false otherwise.</returns>
        public bool Contains(ICollidableObject a, ICollidableObject b, out ICollisionLifetimeEntry entry)
        {
            entry = null;
            if (null == a || null == b)
            {
                return(false);
            }

            int hashCode = a.GetHashCode() ^ b.GetHashCode();

            if (_entries.ContainsKey(hashCode))
            {
                entry = _entries[hashCode];
                return(true);
            }
            else
            {
                return(false);
            }
        }
コード例 #15
0
        public static bool AreInCollision(ICollidableObject a, ICollidableObject b)
        {
            if ((null == a) || (null == b))
            {
                return(false);
            }

            if ((!a.IsCollidable) || (!b.IsCollidable))
            {
                return(false);
            }

            CollisionInteractionType collisionType = GetCollisionInteractionType(a, b);

            if (collisionType == CollisionInteractionType.Invalid)
            {
                return(false);
            }

            return(a.Intersects(b));
        }
コード例 #16
0
 public void RemoveCollidable(ICollidableObject collidable)
 {
     objects.Remove(collidable);
     collidingObjects.Remove(collidable);
 }
コード例 #17
0
 /// <summary>
 ///
 /// </summary>
 public void Add(ICollidableObject item)
 {
     collisionManager.Add(item);
 }
コード例 #18
0
 /// <summary>
 /// Remove item from the list of objects
 /// </summary>
 public void Remove(ICollidableObject item)
 {
     objectList.Remove(item);
 }
コード例 #19
0
ファイル: CollisionEvent.cs プロジェクト: raphaelmun/MonoXen
 public CollisionEventArgs(ICollidableObject a, ICollidableObject b)
 {
     _a = a;
     _b = b;
 }
コード例 #20
0
 /// <summary>
 /// Remove item from the list of objects
 /// </summary>
 public void Remove(ICollidableObject item)
 {
     objectList.Remove(item);
 }
コード例 #21
0
 public void Remove(ICollidableObject item)
 {
     collisionManager.Remove(item);
 }
コード例 #22
0
 public bool Remove(ICollidableObject a, ICollidableObject b)
 {
     return(Remove(a.GetHashCode() ^ b.GetHashCode()));
 }
コード例 #23
0
 private void Reset(ICollidableObject a, ICollidableObject b, float timeOfCollision)
 {
     Attach(a, b);
     TimeOfCollision = timeOfCollision;
 }
コード例 #24
0
 public void Remove(ICollidableObject item)
 {
     collisionManager.Remove(item);
 }
コード例 #25
0
 /// <summary>
 /// 
 /// </summary>
 public void Add(ICollidableObject item)
 {
     collisionManager.Add(item);
 }
コード例 #26
0
 public CollisionEventArgs(ICollidableObject source, ICollidableObject target)
 {
     this.SourceObject = source;
     this.TargetObject = target;
 }
コード例 #27
0
 /// <summary>
 /// Add item to the list of objects to check for collision
 /// </summary>
 public void Add(ICollidableObject item)
 {
     objectList.Add(item);
 }
コード例 #28
0
 public CollisionObject(ICollidableObject item1, ICollidableObject item2)
 {
     Item1 = item1;
     Item2 = item2;
 }
コード例 #29
0
 public CollisionObject(ICollidableObject item1, ICollidableObject item2)
 {
     Item1 = item1;
     Item2 = item2;
 }
コード例 #30
0
 /// <summary>
 /// Add item to the list of objects to check for collision
 /// </summary>
 public void Add(ICollidableObject item)
 {
     objectList.Add(item);
 }