public static ColliderList GenerateSemiEfficientColliderGrid(VirtualMap <char> tileMap, int cellWidth, int cellHeight)
        {
            ColliderList colliders = new ColliderList();

            for (int x = 0; x < tileMap.Columns; x++)
            {
                for (int y = 0; y < tileMap.Rows; y++)
                {
                    if (tileMap.AnyInSegmentAtTile(x, y) && tileMap[x, y] != '0')
                    {
                        int    width  = 1;
                        int    height = 1;
                        Hitbox h      = new Hitbox(cellWidth, cellHeight, x, y);
                        while (tileMap.AnyInSegmentAtTile(x, y) && tileMap[x, y] != '0')
                        {
                            width++;
                            height++;
                            x++;
                            y++;
                        }
                        h.Width  *= width;
                        h.Height *= height;
                        colliders.Add(h);
                    }
                }
            }
            return(colliders.colliders.Length > 0 ? colliders : null);
        }
        public static ColliderList GenerateBetterColliderGrid(VirtualMap <char> tileMap, int cellWidth, int cellHeight)
        {
            ColliderList  colliders        = new ColliderList();
            List <Hitbox> prevCollidersOnX = new List <Hitbox>();
            Hitbox        prevCollider     = null;

            void ExtendOrAdd()
            {
                bool extendedOnX = false;

                foreach (Hitbox hitbox in prevCollidersOnX)
                {
                    if (hitbox.Position.X + hitbox.Width == prevCollider.Position.X &&
                        hitbox.Position.Y == prevCollider.Position.Y &&
                        hitbox.Height == prevCollider.Height)
                    {
                        // Weird check, but hey.
                        extendedOnX   = true;
                        hitbox.Width += cellWidth;
                        prevCollider  = null;
                        break;
                    }
                }
                if (!extendedOnX)
                {
                    colliders.Add(prevCollider);
                    prevCollidersOnX.Add(prevCollider);
                    prevCollider = null;
                }
            }

            for (int x = 0; x < tileMap.Columns; x++)
            {
                for (int y = 0; y < tileMap.Rows; y++)
                {
                    if (tileMap.AnyInSegmentAtTile(x, y) && tileMap[x, y] != '0')
                    {
                        if (prevCollider == null)
                        {
                            prevCollider = new Hitbox(cellWidth, cellHeight, x * cellWidth, y * cellHeight);
                        }
                        else
                        {
                            prevCollider.Height += cellHeight;
                        }
                    }
                    else if (prevCollider != null)
                    {
                        ExtendOrAdd();
                    }
                }

                if (prevCollider != null)
                {
                    ExtendOrAdd();
                }
            }
            return(colliders.colliders.Length > 0 ? colliders : null);
        }
Beispiel #3
0
        public void Add(Collider collider)
        {
            if (ColliderList.Contains(collider))
            {
                return;
            }

            foreach (Cell cell in GetCells(collider.WorldTransform))
            {
                cell.Colliders.Add(collider);
            }

            ComputedCollision[collider] = new HashSet <Collider>();

            ColliderList.Add(collider);
        }
        public static ColliderList GenerateInefficientColliderGrid(VirtualMap <char> tileMap, int cellWidth, int cellHeight)
        {
            ColliderList colliders = new ColliderList();

            for (int x = 0; x < tileMap.Columns; x++)
            {
                for (int y = 0; y < tileMap.Rows; y++)
                {
                    if (tileMap.AnyInSegmentAtTile(x, y) && tileMap[x, y] != '0')
                    {
                        colliders.Add(new Hitbox(cellWidth, cellHeight, x * cellWidth, y * cellHeight));
                    }
                }
            }
            return(colliders.colliders.Length > 0 ? colliders : null);
        }
Beispiel #5
0
 public ComponentCollision() : base("collision")
 {
     _boundingBox = new RectangleF(0.0f, 0.0f, 0.0f, 0.0f);
     ColliderList.Add(this);
 }