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); }
/// <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); } }
/// <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; }
/// <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); }
/// <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); }