public void Add(DanmakuCollision obj)
 {
     if (!Set.ContainsKey(obj.Danmaku))
     {
         Set[obj.Danmaku] = obj;
     }
 }
        public DanmakuCollisionList AsReadOnly()
        {
            int count = Set.Count;

            DanmakuCollision[] readonlyData = new DanmakuCollision[count];
            Set.Values.CopyTo(readonlyData, 0);
            return(new DanmakuCollisionList(readonlyData, count));
        }
 public void Add(DanmakuCollision obj)
 {
     if (Contains(obj))
     {
         return;
     }
     CheckCapacity(1);
     Array[Count++] = obj;
 }
        void CheckCapacity(int count)
        {
            if (Count + count <= Capacity)
            {
                return;
            }
            var newArray = new DanmakuCollision[Capacity * kGrowthFactor];

            System.Array.Copy(Array, 0, newArray, 0, Count);
            Array = newArray;
        }
Example #5
0
        internal static unsafe void TestPoolCollisions(DanmakuPool pool)
        {
            var layersPtr = (int * )(pool.CollisionMasks.GetUnsafePtr());
            var count     = pool.ActiveCount;

            for (var i = 0; i < count; i++)
            {
                if (*layersPtr++ == 0)
                {
                    continue;
                }
                var layerMask   = pool.CollisionMasks[i];
                var oldPosition = pool.OldPositions[i];
                var direction   = pool.Positions[i] - oldPosition;
                var distance    = direction.magnitude;
                var hits        = Physics2D.CircleCastNonAlloc(oldPosition, pool.ColliderRadius, direction, raycastCache, distance, layerMask);
                if (hits <= 0)
                {
                    continue;
                }
                var danmaku = new Danmaku(pool, i);
                for (var j = 0; j < hits; j++)
                {
                    var collider = raycastCache[j].collider;
                    List <DanmakuCollider> danmakuColliders;
                    if (!ColliderMap.TryGetValue(collider, out danmakuColliders))
                    {
                        continue;
                    }
                    var collision = new DanmakuCollision
                    {
                        Danmaku    = danmaku,
                        RaycastHit = raycastCache[j]
                    };
                    foreach (var dCollider in danmakuColliders)
                    {
                        if (dCollider != null && dCollider.isActiveAndEnabled)
                        {
                            dCollider.AddDanmaku(collision);
                        }
                    }
                }
            }
        }
 public bool Contains(DanmakuCollision obj)
 {
     if (Count <= 1024)
     {
         bool contained = false;
         for (var i = 0; i < Count; i++)
         {
             contained |= Array[i].Danmaku == obj.Danmaku;
         }
         return(contained);
     }
     else
     {
         for (var i = 0; i < Count; i++)
         {
             if (Array[i].Danmaku == obj.Danmaku)
             {
                 return(true);
             }
         }
         return(false);
     }
 }
Example #7
0
 internal void AddDanmaku(DanmakuCollision danmaku) => collidedDanmaku.Add(danmaku);