Пример #1
0
        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;
            }
        }
Пример #2
0
        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]]);
                 * }*/
            }
        }