コード例 #1
0
 public Vector2 checkCollisions(CollisionObjectInterface obj, Vector2 newPosition)
 {
     if(checkObjectCollisions(obj, newPosition))
     {
         return obj.getPosition();
     }
     return checkBoundsCollisions(obj, newPosition);
 }
コード例 #2
0
        protected Vector2 checkTranslationalCollisionsSingleHeight(CollisionObjectInterface obj, Vector2 velocity, HeightEnum height)
        {
            float radius = obj.getRadius() + velocity.Length();
            Vector2 position = obj.getPosition();
            ConvexPolygonInterface movingObjectPolygon = obj.getBounds(height);
            Height objectHeight = obj.getHeight();

            Vector2 translate, tempVelocity = velocity;
            float dist;
            List<Vector2> collisions = new List<Vector2>();
            foreach (CollisionObjectInterface cObj in objects_)
            {
                dist = distanceBetweenPoints(position, cObj.getPosition());
                if (cObj != obj && objectHeight.collides(cObj.getHeight()) && dist < radius + cObj.getRadius())
                {
                    dist = radius + cObj.getRadius() - dist;
                    //translate = checkCollision(movingObjectPolygon, cObj.getBounds(tileHeight), dist, velocity);
                    translate = cObj.checkCollisionWith(obj, this, height, dist, tempVelocity);
                    if (translate != Vector2.Zero)
                    {
                        obj.collidedInto(cObj);
                        cObj.collidedWith(obj);
                        //velocity += translate;
                        //movingObjectPolygon.rotate(direction, newPosition);
                        position = movingObjectPolygon.getCenter();
                        translate = obj.checkCollisionInto(cObj, this, Height.getHeight(height), dist, translate);
                        if (translate != Vector2.Zero)
                        {
                            collisions.Add(translate);
                            tempVelocity += translate;
                        }
                    }
                }
            }
            if (collisions.Count == 0)
            {
                movingObjectPolygon.translate(velocity);
                return velocity;
            }
            if (collisions.Count == 1)
            {
                movingObjectPolygon.translate(velocity + collisions[0]);
                return (velocity + collisions[0]);
            }
            velocity += correctMultipleCollisions(velocity, collisions);
            movingObjectPolygon.translate(velocity);
            return velocity;
        }
コード例 #3
0
        protected Vector2 checkTranslationalCollisionsMultiHeight(CollisionObjectInterface obj, Vector2 velocity)
        {
            float radius = obj.getRadius() + velocity.Length();
            Vector2 position = obj.getPosition();
            ConvexPolygonInterface movingObjectPolygonLow = obj.getBounds(HeightEnum.LOW);
            ConvexPolygonInterface movingObjectPolygonHigh = obj.getBounds(HeightEnum.HIGH);
            Height objectHeight = obj.getHeight(), otherObjectHeight;
            Height translationHeight;
            Vector2 tempVelocity = velocity;

            Vector2 translate = Vector2.Zero, translateHigh = Vector2.Zero, translateLow = Vector2.Zero;
            float dist;
            List<Vector2> collisions = new List<Vector2>();
            foreach (CollisionObjectInterface cObj in objects_)
            {
                dist = distanceBetweenPoints(position, cObj.getPosition());
                otherObjectHeight = cObj.getHeight();
                if (cObj != obj && objectHeight.collides(otherObjectHeight) && dist < radius + cObj.getRadius())
                {
                    dist = radius + cObj.getRadius() - dist;
                    //translate = checkCollision(movingObjectPolygon, cObj.getBounds(tileHeight), dist, velocity);
                    //translate = cObj.checkCollisionWith(obj, this, tileHeight, dist, velocity);
                    translateHigh = Vector2.Zero;
                    translateLow = Vector2.Zero;
                    translationHeight = new Height(false, false);
                    if (otherObjectHeight.blocksLow_)
                    {
                        translateLow = cObj.checkCollisionWith(obj, this, HeightEnum.LOW, dist, tempVelocity);
                    }
                    if (otherObjectHeight.blocksHigh_)
                    {
                        translateHigh = cObj.checkCollisionWith(obj, this, HeightEnum.HIGH, dist, tempVelocity);
                    }
                    if (translateLow.LengthSquared() > translateHigh.LengthSquared())
                    {
                        translate = translateLow;
                        translationHeight.blocksLow_ = true;
                    }
                    else
                    {
                        translate = translateHigh;
                        translationHeight.blocksHigh_ = true;
                    }
                    if (translate != Vector2.Zero)
                    {
                        obj.collidedInto(cObj);
                        cObj.collidedWith(obj);
                        //velocity += translate;
                        //movingObjectPolygon.rotate(direction, newPosition);
                        position = movingObjectPolygonHigh.getCenter();
                        translate = obj.checkCollisionInto(cObj, this, translationHeight, dist, translate);
                        if (translate != Vector2.Zero)
                        {
                            bool isInCollisions = false;
                            for (int i = 0; i < collisions.Count; i++ )
                            {
                                if (translate.Equals(collisions[i]))
                                {
                                    isInCollisions = true;
                                    break;
                                }
                                /*
                                float cos = ConvexPolygon.dotProduct(translate, collisions[i]) / (translate.Length() * collisions[i].Length());
                                if (cos >= 0.99f && cos <= 1.01f)
                                {
                                    if (collisions[i].LengthSquared() < translate.LengthSquared())
                                    {
                                        collisions[i] = translate;
                                    }
                                    isInCollisions = true;
                                    break;
                                }
                                */
                            }
                            if (!isInCollisions)
                            {
                                collisions.Add(translate);
                                //movingObjectPolygonHigh.translate(translate);
                                //movingObjectPolygonLow.translate(translate);
                                tempVelocity += translate;
                            }
                        }
                    }
                }
            }
            if (collisions.Count == 0)
            {
                movingObjectPolygonHigh.translate(velocity);
                movingObjectPolygonLow.translate(velocity);
                return velocity;
            }
            if (collisions.Count == 1)
            {
                movingObjectPolygonHigh.translate(velocity + collisions[0]);
                movingObjectPolygonLow.translate(velocity + collisions[0]);
                return (velocity + collisions[0]);
            }
            velocity += correctMultipleCollisions(velocity, collisions);
            movingObjectPolygonHigh.translate(velocity);
            movingObjectPolygonLow.translate(velocity);
            return velocity;
        }
コード例 #4
0
        protected Vector2 checkRotationalCollisionsSingleHeight(CollisionObjectInterface obj, ref Vector2 newDirection, HeightEnum height)
        {
            float radius = obj.getRadius();
            Vector2 position = obj.getPosition();
            ConvexPolygonInterface movingObjectPolygon = obj.getBounds(height);
            Vector2 oldDirection = obj.getDirection();
            movingObjectPolygon.rotate(newDirection, position);
            Height objectHeight = obj.getHeight();

            Vector2 translate = Vector2.Zero;
            float dist;
            List<Vector2> collisions = new List<Vector2>();
            foreach (CollisionObjectInterface cObj in objects_)
            {
                dist = distanceBetweenPoints(position, cObj.getPosition());
                if (cObj != obj && objectHeight.collides(cObj.getHeight()) && dist < radius + cObj.getRadius())
                {
                    dist = radius + cObj.getRadius() - dist;
                    //translate = checkCollision(movingObjectPolygon, cObj.getBounds(tileHeight), dist, Vector2.Zero);
                    translate = cObj.checkCollisionWith(obj, this, height, dist, Vector2.Zero);
                    if (translate != Vector2.Zero)
                    {
                        obj.collidedInto(cObj);
                        cObj.collidedWith(obj);
                        //velocity += translate;
                        //movingObjectPolygon.rotate(direction, newPosition);
                        translate = obj.checkCollisionInto(cObj, this, Height.getHeight(height), dist, translate);
                        if (translate != Vector2.Zero)
                        {
                            collisions.Add(translate);
                        }
                    }
                }
            }
            if (collisions.Count == 1)
            {
                return collisions[0];
            }
            if (collisions.Count > 1)
            {
                translate = Vector2.Zero;
                for (int i = 0; i < collisions.Count; i++)
                {
                    Vector2 colVector = collisions[i];
                    for (int j = i; j < collisions.Count; j++)
                    {
                        if (ConvexPolygon.dotProduct(colVector, collisions[j]) / (colVector.Length() * collisions[j].Length()) < 0)
                        {
                            newDirection = oldDirection;
                            movingObjectPolygon.rotate(oldDirection, position);
                            return Vector2.Zero;
                        }
                    }
                    translate += colVector;
                }
                return translate;
            }
            return Vector2.Zero;
        }
コード例 #5
0
        protected Vector2 checkRotationalCollisionsMultiHeight(CollisionObjectInterface obj, ref Vector2 newDirection)
        {
            float radius = obj.getRadius();
            Vector2 position = obj.getPosition();
            ConvexPolygonInterface movingObjectPolygonHigh = obj.getBounds(HeightEnum.HIGH);
            ConvexPolygonInterface movingObjectPolygonLow = obj.getBounds(HeightEnum.LOW);
            Vector2 oldDirection = obj.getDirection();
            movingObjectPolygonHigh.rotate(newDirection, position);
            movingObjectPolygonLow.rotate(newDirection, position);
            Height objectHeight = obj.getHeight(), otherObjectHeight;
            Height translationHeight;

            Vector2 translate = Vector2.Zero, translateHigh = Vector2.Zero, translateLow = Vector2.Zero;
            Vector2 translateTot = Vector2.Zero;
            float dist;
            List<Vector2> collisions = new List<Vector2>();
            foreach (CollisionObjectInterface cObj in objects_)
            {
                dist = distanceBetweenPoints(position, cObj.getPosition());
                otherObjectHeight = cObj.getHeight();
                if (cObj != obj && objectHeight.collides(otherObjectHeight) && dist < radius + cObj.getRadius())
                {
                    dist = radius + cObj.getRadius() - dist;
                    //translate = checkCollision(movingObjectPolygon, cObj.getBounds(tileHeight), dist, Vector2.Zero);
                    translateHigh = Vector2.Zero;
                    translateLow = Vector2.Zero;
                    translationHeight = new Height(false, false);
                    if (otherObjectHeight.blocksLow_)
                    {
                        translateLow = cObj.checkCollisionWith(obj, this, HeightEnum.LOW, dist, Vector2.Zero);
                    }
                    if (otherObjectHeight.blocksHigh_)
                    {
                        translateHigh = cObj.checkCollisionWith(obj, this, HeightEnum.HIGH, dist, Vector2.Zero);
                    }
                    if (translateLow.LengthSquared() > translateHigh.LengthSquared())
                    {
                        translate = translateLow;
                        translationHeight.blocksLow_ = true;
                    }
                    else
                    {
                        translate = translateHigh;
                        translationHeight.blocksHigh_ = true;
                    }
                    if (translate != Vector2.Zero)
                    {
                        obj.collidedInto(cObj);
                        cObj.collidedWith(obj);
                        //velocity += translate;
                        //movingObjectPolygon.rotate(direction, newPosition);
                        translate = obj.checkCollisionInto(cObj, this, translationHeight, dist, translate);
                        if (translate != Vector2.Zero)
                        {
                            translateTot += translate;
                            movingObjectPolygonLow.rotate(newDirection, position + translateTot);
                            movingObjectPolygonHigh.rotate(newDirection, position + translateTot);
                            collisions.Add(translate);
                        }
                    }
                }
            }
            if (collisions.Count == 1)
            {
                return collisions[0];
            }
            if (collisions.Count > 1)
            {
                translate = Vector2.Zero;
                for (int i = 0; i < collisions.Count; i++)
                {
                    Vector2 colVector = collisions[i];
                    for (int j = i + 1; j < collisions.Count; j++)
                    {
                        if (ConvexPolygon.dotProduct(colVector, collisions[j]) / (colVector.Length() * collisions[j].Length()) < 0)
                        {
                            Console.Out.Write("double:");
                            Console.Out.Write(colVector);
                            Console.Out.Write(collisions[j]);
                            Console.Out.WriteLine(ConvexPolygon.dotProduct(colVector, collisions[j]) / (colVector.Length() * collisions[j].Length()));
                            newDirection = oldDirection;
                            movingObjectPolygonLow.rotate(oldDirection, position);
                            movingObjectPolygonHigh.rotate(oldDirection, position);
                            return Vector2.Zero;
                        }
                        Console.Out.Write(colVector);
                        Console.Out.Write(collisions[j]);
                        Console.Out.WriteLine(ConvexPolygon.dotProduct(colVector, collisions[j]) / (colVector.Length() * collisions[j].Length()));
                    }
                    translate += colVector;
                }
                return translateTot;
            }
            return Vector2.Zero;
        }
コード例 #6
0
 public Vector2 checkCollisions(CollisionObjectInterface obj, Vector2 newPosition)
 {
     Vector2 oldPosition = obj.getPosition();
     float radius = obj.getRadius();
     Vector2 velocity = newPosition - oldPosition;
     ConvexPolygonInterface movingObjectPolygon= obj.getBounds(HeightEnum.LOW);
     ConvexPolygonInterface movingObjectPolygonHigh = obj.getBounds(HeightEnum.HIGH);
     Vector2 direction = obj.getDirection();
     Vector2 position = movingObjectPolygon.getCenter();
     movingObjectPolygon.rotate(direction, position);
     movingObjectPolygonHigh.rotate(direction, position);
     //TODO: Check collisions on rotations
     Vector2 translate;
     float dist;
     List<CollisionObjectInterface> collisions = new List<CollisionObjectInterface>();
     foreach (CollisionObjectInterface cObj in objects_)
     {
         dist = distanceBetweenPoints(position, cObj.getPosition());
         //Console.Out.WriteLine(dist);
         if (cObj != obj && dist < radius + cObj.getRadius())
         {
             dist = radius + cObj.getRadius() - dist;
             translate = checkCollision(movingObjectPolygon, cObj.getBounds(HeightEnum.LOW), dist);
             //Console.Out.WriteLine(translate);
             if (translate != Vector2.Zero)
             {
                 obj.collidedInto(cObj);
                 cObj.collidedWith(obj);
                 newPosition += translate;
                 //movingObjectPolygon.translate(translate);
                 movingObjectPolygon.rotate(direction, newPosition);
                 position = movingObjectPolygon.getCenter();
                 collisions.Add(cObj);
             }
         }
     }
     bool noMoreCollisions = true;
     /*            foreach (CollisionObjectInterface cObj in collisions)
     {
         dist = distanceBetweenPoints(position, cObj.getPosition());
         //Console.Out.WriteLine(dist);
         if (cObj != obj && dist < radius + cObj.getRadius())
         {
             dist = radius + cObj.getRadius() - dist;
             translate = checkCollision(movingObjectPolygon, cObj.getBounds(), dist);
             //Console.Out.WriteLine(translate);
             if (translate != Vector2.Zero)
             {
                 noMoreCollisions = false;
                 break;
             }
         }
     }*/
     if (noMoreCollisions)
     {
         return newPosition;
     }
     movingObjectPolygon.rotate(direction, oldPosition);
     return oldPosition;
 }