Esempio n. 1
0
 public void GetCollidableObjects(XboxHashSet<CollisionBody> list, CollisionBody container)
 {
     float minX = 0, minY = 0, maxX = 0, maxY = 0;
     container.BuildAABB(out minX, out minY, out maxX, out maxY);
     this.GetCollidableObjects(list, container, minX, minY, maxX, maxY);
 }
Esempio n. 2
0
        /// <summary>
        /// Verifica si este cuerpo esta colisionando o va a colisionar
        /// con otro cuerpo dado
        /// </summary>
        /// <param name="polygon">Cuerpo con el cual se hará la verificacion</param>
        /// <param name="distance">Distancia por la cual se movera este cuerpo</param>
        /// <param name="result">Referencia del objeto que contendrá la información necesaria sobre 
        /// si se esta intersectando, si se intersectará y la distancia necesaria 
        /// para evitar una intersección</param>
        public CollisionResult Intersect(CollisionBody secondBody, ref Vector2 distance)
        {
            bool intersect = true;
            bool willIntersect = true;

            float minX = 0, minY = 0, maxX = 0, maxY = 0;
            this.BuildAABB(out minX, out minY, out maxX, out maxY);

            float minSecondX = 0, minSecondY = 0, maxSecondX = 0, maxSecondY = 0;
            secondBody.BuildAABB(out minSecondX, out minSecondY, out maxSecondX, out maxSecondY);

            if (minX > maxSecondX || maxX < minSecondX || minY > maxSecondY || maxY < minSecondY) intersect = false;

            minX += distance.X;
            maxX += distance.X;
            minY += distance.Y;
            maxY += distance.Y;

            if (minX > maxSecondX || maxX < minSecondX || minY > maxSecondY ||maxY < minSecondY) willIntersect = false;

            if (!intersect && !willIntersect)
            {
                CollisionResult result = new CollisionResult();
                result.triggeringBody = this;
                result.affectedBody = secondBody;
                return result;
            }

            if (secondBody.GetType() == typeof(Box))
            {
                return this.IntersectWithBox((Box)secondBody, ref distance);
            }
            else if (secondBody.GetType() == typeof(Polygon))
            {
                return this.IntersectWithPolygon((Polygon)secondBody, ref distance);
            }
            else
            {
                return this.IntersectWithSphere((Sphere)secondBody, ref distance);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Obtiene todos los CollisionBody que se encuentren en rango
        /// de un CollisionBody especifico para así poder minimizar
        /// los calculos de colisión
        /// </summary>
        /// <param name="body">Body utilizado para la busqueda</param>
        /// <returns>Lista de bodies en rango</returns>
        public XboxHashSet<CollisionBody> GetBodyGroup(CollisionBody body)
        {
            //this.bodyGroupList.Clear();
            this.bodyGroupHashSet.Clear();

            QuadTreeNode root;
            if (this.layersRoots.TryGetValue(body.Layer, out root))
            {
                float minX = 0, minY = 0, maxX = 0, maxY = 0;
                body.BuildAABB(out minX, out minY, out maxX, out maxY);

                if (body.lastBigNode.depth == 0)
                {
                    root.GetCollidableObjects(this.bodyGroupHashSet, body, minX, minY, maxX, maxY);
                }
                else
                {
                    body.lastBigNode.GetCollidableObjects(this.bodyGroupHashSet, body, minX, minY, maxX, maxY);
                }
            }
            return this.bodyGroupHashSet;
        }
Esempio n. 4
0
        /// <summary>
        /// Remueve un CollisionBody tanto de la lista global de bodies
        /// como de su capa respectiva
        /// </summary>
        /// <param name="body">CollisionBody a remover</param>
        public void removeContainer(CollisionBody body)
        {
            QuadTreeNode root;
            if (this.layersRoots.TryGetValue(body.Layer, out root))
            {
                float minX = 0, minY = 0, maxX = 0, maxY = 0;
                body.BuildAABB(out minX, out minY, out maxX, out maxY);
                root.RemoveObject(body, minX, minY, maxX, maxY);
            }

            this.bodyGlobalSet.Remove(body);
        }
Esempio n. 5
0
        /// <summary>
        /// Agrega un CollisionBody tanto a la lista global de bodies
        /// como a su capa respectiva
        /// </summary>
        /// <param name="body">CollisionBody a agregar</param>
        public void addContainer(CollisionBody body)
        {
            if (!this.layersRoots.ContainsKey(body.Layer))
            {
                QuadTreeNode root = new QuadTreeNode();
                root.reset(/*null, */layerX, layerY, layerWidth, layerHeight, 1, this.maxNodeCapacity, this.nodeDepth);
                this.layersRoots.Add(body.Layer, root);
            }

            float minX = 0, minY = 0, maxX = 0, maxY = 0;
            body.BuildAABB(out minX, out minY, out maxX, out maxY);

            this.layersRoots[body.Layer].AddObject(body, minX, minY, maxX, maxY);
            this.bodyGlobalSet.Add(body);
        }