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 } } }
public CollisionArgs(COLLISION_SIDE side) { Side = side; }