コード例 #1
0
        private void CheckCollisionsInGroup(GameTime gameTime, List <ICutlassCollidable> collidableObjects)
        {
            if (collidableObjects == null || collidableObjects.Count <= 1)
            {
                return;
            }

            for (int i = 0; i < collidableObjects.Count; i++)
            {
                ICutlassCollidable first = collidableObjects[i];

                for (int j = i + 1; j < collidableObjects.Count; j++)
                {
                    ICutlassCollidable second = collidableObjects[j];

                    bool collisionCategoriesOverlap = CheckCollisionCategories(first, second);

                    //If both are stationary, or neither is stationary, detect collision but don't do anything about it.
                    if (first.Stationary == second.Stationary)
                    {
                        if (collisionCategoriesOverlap && first.NextFrameBoundingRect.Intersects(second.NextFrameBoundingRect))
                        {
                            first.CollisionDetected(second);
                            second.CollisionDetected(first);
                        }
                    }
                    //If only one is stationary, detect collision and correct non-stationary object
                    else
                    {
                        //contact.A is non-stationary object.
                        CollisionContact collisionContact;

                        if (first.Stationary)
                        {
                            collisionContact = new CollisionContact()
                            {
                                A = second, B = first
                            }
                        }
                        ;
                        else
                        {
                            collisionContact = new CollisionContact()
                            {
                                A = first, B = second
                            }
                        };

                        if (collisionCategoriesOverlap && CalculateCollisionCorrection(gameTime, ref collisionContact) && !IsInternalEdge(collisionContact))
                        {
                            collisionContact.A.CollisionDetectedWithCorrection(collisionContact.B, collisionContact.Normal, collisionContact.Distance);
                            collisionContact.B.CollisionDetected(collisionContact.A);
                        }
                    }
                }
            }
        }