private CollisionManager() { this.currentDrawType = DRAW_TYPE.DRAW_ALL; this.bodyGlobalSet = new XboxHashSet<CollisionBody>(); this.bodyGroupList = new List<CollisionBody>(); this.bodyGroupHashSet = new XboxHashSet<CollisionBody>(); this.primitiveBatch = new PrimitiveBatch(Program.GAME.GraphicsDevice); font = Program.GAME.Content.Load<SpriteFont>("MenuFont"); int poolSize = (int)Math.Pow(4, nodeDepth - 2); this.nodeArrayPool = new List<QuadTreeNode[]>(poolSize); for (int i = 0; i < poolSize; i++) { QuadTreeNode[] array = new QuadTreeNode[4]; array[0] = new QuadTreeNode(); array[1] = new QuadTreeNode(); array[2] = new QuadTreeNode(); array[3] = new QuadTreeNode(); this.nodeArrayPool.Add(array); } this.bodySetPool = new List<XboxHashSet<CollisionBody>>(poolSize); for (int i = 0; i < poolSize; i++) { this.bodySetPool.Add(new XboxHashSet<CollisionBody>(maxNodeCapacity + 1)); } }
public QuadTreeNode[] obtainNodeArray() { if (this.nodeArrayPool.Count > 0) { QuadTreeNode[] array = this.nodeArrayPool[0]; nodeArrayPool.RemoveAt(0); return array; } else { QuadTreeNode[] array = null; for (int i = 0; i < 10; i++) { array = new QuadTreeNode[4]; array[0] = new QuadTreeNode(); array[1] = new QuadTreeNode(); array[2] = new QuadTreeNode(); array[3] = new QuadTreeNode(); if (i < 9) nodeArrayPool.Add(array); } return array; } }
public void redeemNodeArray(QuadTreeNode[] array) { this.nodeArrayPool.Add(array); }
/// <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); }