Ejemplo n.º 1
0
        public void Update(float delta)
        {
            for (int i = 0; i < entities.Count; ++i)
            {
                UpdateEntity(i, delta);
            }

            for (int i = 0; i < entities.Count; ++i)
            {
                if (entities[i].HasComponent(out Physics phys))
                {
                    ApplyGravityOnEntity(i, phys, delta); // Apply gravity on entity.
                }
                if (entities[i].IsCollidble)
                {
                    #region Tile Collision
                    if (entities[i].HasComponent(out Collider collider))
                    {
                        foreach (var layer in map.tileLayers)
                        {
                            if (!layer.Properties.ContainsProperty("Collision"))
                            {
                                continue;
                            }

                            foreach (var tile in GetRelevantTiles(layer, entities[i].pos, 8))
                            {
                                if (tile.id == 0 || !tile.rect.Intersects(collider.rect))
                                {
                                    continue;
                                }

                                Rectangle intersection = Rectangle.Intersect(collider.rect, tile.rect);

                                COLLISION_SIDE side = collider.GetIntersectionSide(tile.rect);

                                //Console.WriteLine(side);

                                if (side == COLLISION_SIDE.Top)// && collider.rect.Top < intersection.Top
                                {
                                    entities[i].pos.Y -= intersection.Height;
                                    phys?.Land();

                                    collider.OnCollided(new CollisionArgs(side));
                                    collider.Update(delta);
                                    continue;
                                }
                                else if (side == COLLISION_SIDE.Bottom)// && collider.rect.Bottom > intersection.Top
                                {
                                    entities[i].pos.Y += (intersection.Height);

                                    if (phys?.jump < 0)
                                    {
                                        phys.jump /= 2;
                                    }


                                    collider.OnCollided(new CollisionArgs(side));
                                    collider.Update(delta);
                                    continue;
                                }

                                if (side == COLLISION_SIDE.Left) //&& collider.rect.Y > tile.rect.Y
                                {
                                    entities[i].pos.X -= intersection.Width;
                                    collider.OnCollided(new CollisionArgs(side));
                                    collider.Update(delta);
                                    continue;
                                }
                                else if ((collider.rect.Bottom - phys.gravity) > tile.rect.Top && side == COLLISION_SIDE.Right)  //&& collider.rect.Bottom < tile.rect.Top
                                {
                                    entities[i].pos.X += intersection.Width;
                                    collider.OnCollided(new CollisionArgs(side));
                                    collider.Update(delta);
                                    continue;
                                }
                                #endregion
                            }
                        }
                    }


                    #region Other Colliders

                    // To avoid crash
                    if (collider == null)
                    {
                        continue;
                    }

                    for (int j = 0; j < entities.Count; ++j)
                    {
                        if (i == j)
                        {
                            continue;
                        }

                        if (entities[j].HasComponent(out Collider other))
                        {
                            Rectangle intersection = Rectangle.Intersect(collider.rect, other.rect);

                            COLLISION_SIDE side = collider.GetIntersectionSide(other);

                            if (side != COLLISION_SIDE.None)
                            {
                                other.OnCollided(new CollisionArgs(side));

                                if (entities[j].HasComponent(out Collectible collectible))
                                {
                                    if (entities[i].HasComponent(out Inventory inv))
                                    {
                                        inv.AddToInventory(collectible);
                                    }
                                }


                                if (side == COLLISION_SIDE.Top)
                                {
                                    entities[i].pos.Y -= intersection.Height;
                                    collider.OnCollided(new CollisionArgs(side));
                                    collider.Update(delta);
                                    continue;
                                }
                                else if (side == COLLISION_SIDE.Bottom)
                                {
                                    entities[i].pos.Y += (intersection.Height);
                                    collider.OnCollided(new CollisionArgs(side));
                                    collider.Update(delta);
                                    continue;
                                }

                                if (side == COLLISION_SIDE.Left)
                                {
                                    entities[i].pos.X -= intersection.Width;
                                    collider.OnCollided(new CollisionArgs(side));
                                    collider.Update(delta);
                                    continue;
                                }
                                else if (side == COLLISION_SIDE.Right)
                                {
                                    entities[i].pos.X += intersection.Width;
                                    collider.OnCollided(new CollisionArgs(side));
                                    collider.Update(delta);
                                    continue;
                                }
                            }
                        }
                    }
                    #endregion
                }
            }
        }
Ejemplo n.º 2
0
 public CollisionArgs(COLLISION_SIDE side)
 {
     Side = side;
 }