public void FulFillCollisionLists() { if (PublicUnits == null) { return; } lock (PublicLock) { for (int i = 0; i < PublicUnits.Length; i++) { Unit unit = PublicUnits[i]; unit.ClearPotentialCollisions(); foreach (Unit u in PublicCollisionLists[i]) { unit.AddPotentialCollision(u); } } PublicUnits = null; } }
void UpdatePotentialCollisions() { while (true) { Thread.Sleep(1); if (units.Count == 0) { continue; } lock (units) { SortByX(units); List <int[]> pairs = new List <int[]>(); //List<Unit[]> pairs = new List<Unit[]>(); for (int i = 0; i < units.Count; i++) { Unit object1 = units[i]; //object1.ClearPotentialCollisions(); for (int s = i + 1; s < units.Count; s++) { Unit object2 = units[s]; if (object2.RightBound < object1.LeftBound) { continue; } if (object2.LeftBound > object1.RightBound) { break; } if (object2.TopBound <= object1.BottomBound && object2.BottomBound >= object1.TopBound) { pairs.Add(new int[2] { i, s }); } //pairs.Add(new Unit[2] { object1, object2 }); } } List <List <Unit> > collisionLists = new List <List <Unit> >(); //lock (Unit.UnitsSorted) //{ for (int i = 0; i < units.Count; i++) { collisionLists.Add(new List <Unit>()); } foreach (int[] pair in pairs) { collisionLists[pair[0]].Add(units[pair[1]]); collisionLists[pair[1]].Add(units[pair[0]]); } for (int i = 0; i < units.Count; i++) { Unit unit = units[i]; lock (unit.PotentialCollisions) { unit.ClearPotentialCollisions(); foreach (Unit u in collisionLists[i]) { unit.AddPotentialCollision(u); } } } //} } /*lock (BaseObject.PotentialCollisionsLock) * { * lock (Unit.UnitsSortedLock) * { * foreach (Unit u in units) * u.ClearPotentialCollisions(); * } * * /*foreach (Unit[] pair in pairs) * { * pair[0].AddPotentialCollision(pair[1]); * pair[1].AddPotentialCollision(pair[0]); * }*/ //} /*foreach (int[] pair in pairs) * { * units[pair[0]].AddPotentialCollision(units[pair[1]]); * units[pair[1]].AddPotentialCollision(units[pair[0]]); * }*/ } }