public override void Draw(SpriteBatch spriteBatch) { if (!Visible) { return; } spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.NonPremultiplied, null, null, null, null, ServiceManager.Camera.GetTransformation()); foreach (var entity in ServiceManager.Entities) { var explosiveComponent = (ExplosiveComponent)entity.GetComponent(typeof(ExplosiveComponent)); if (explosiveComponent != null) { var explosiveRectangles = DetonationHelper.GetBlastRadiusFrom(ServiceManager.Map.TmxMap, entity); foreach (var explosiveRectangle in explosiveRectangles) { spriteBatch.DrawRectangle(explosiveRectangle, Color.Red, 4f); } } } spriteBatch.End(); }
/// <summary> /// Detonates a given entity immediately. This function will signal the removal of the entity /// and inform all clients of the loss of the entity. /// </summary> /// <param name="entity"></param> private void DetonateEntity(Entity entity) { var blastBoxes = DetonationHelper.GetBlastRadiusFrom(ServiceManager.Map, entity); // Detonate and hurt players foreach (var player in ServiceManager.Entities) { var playerTransformComponent = (TransformComponent)player.GetComponent(typeof(TransformComponent)); var playerComponent = (PlayerComponent)player.GetComponent(typeof(PlayerComponent)); // If is a player, attempt to detonate if (playerComponent != null) { var x = playerTransformComponent.LocalPosition.X + 13; var y = playerTransformComponent.LocalPosition.Y + 45; var width = 24; var height = 20; Rectangle playerBoundingBox = new Rectangle((int)x, (int)y, (int)width, (int)height); bool toDestroy = false; foreach (var blastRectangle in blastBoxes) { if (playerBoundingBox.Intersects(blastRectangle)) { toDestroy = true; } } if (toDestroy) { Logger.Instance.Log(Level.Debug, "{} has been bombed! TODO: Do something about it..."); ServiceManager.RemoveEntity(player); ServiceManager.PlayersAlive--; } } } // Remove the entity ServiceManager.RemoveEntity(entity); }
/// <summary> /// This method handles behaviours for when an entity is being removed /// </summary> /// <param name="entity"></param> private void HandleRemovalBehaviour(Entity entity) { // If thie entity had an eplosiv var explosiveComponent = (ExplosiveComponent)entity.GetComponent(typeof(ExplosiveComponent)); var transformComponent = (TransformComponent)entity.GetComponent(typeof(TransformComponent)); // Spawn an explosion if (explosiveComponent != null) { var entitesToAdd = new List <Entity>(); // They're returned in order of up, down, left, right var rectangles = DetonationHelper.GetBlastRadiusFrom(ServiceManager.Map.TmxMap, entity); var up = Math.Ceiling((decimal)(rectangles[0].Height / 32)); var down = Math.Ceiling((decimal)(rectangles[1].Height / 32)); var left = Math.Ceiling((decimal)(rectangles[2].Width / 32)); var right = Math.Ceiling((decimal)(rectangles[3].Width / 32)); // Do damage var list = DetonationHelper.GetDetonatedTiles(ServiceManager.Map.TmxMap, entity, rectangles); foreach (var tile in list) { var location = new Vector2(tile.X * 32, tile.Y * 32); var n = EntityFactory.CreateBreakingBlock(location, "StandardBlock"); ServiceManager.AddEntity(n); } for (int i = 0; i < up - 2; i++) { var x = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition - new Vector2(0, (i * 32 + 32)), ExplosiveType.Up); entitesToAdd.Add(x); } for (int i = 0; i < down - 2; i++) { var x = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition + new Vector2(0, (i * 32 + 32)), ExplosiveType.Down); entitesToAdd.Add(x); } for (int i = 0; i < right - 2; i++) { var x = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition + new Vector2((i * 32 + 32), 0), ExplosiveType.Right); entitesToAdd.Add(x); } for (int i = 0; i < left - 2; i++) { var x = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition - new Vector2((i * 32 + 32), 0), ExplosiveType.Left); entitesToAdd.Add(x); } Entity topEdge = null; if (up != 1) { topEdge = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition - new Vector2(0, (float)(up * 32) - 32), ExplosiveType.UpE); } Entity bottomEdge = null; if (down != 1) { bottomEdge = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition + new Vector2(0, (float)(down * 32) - 32), ExplosiveType.DownE); } Entity leftEdge = null; if (left != 1) { leftEdge = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition - new Vector2((float)(left * 32) - 32, 0), ExplosiveType.LeftE); } Entity rightEdge = null; if (right != 1) { rightEdge = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition + new Vector2((float)(right * 32) - 32, 0), ExplosiveType.RightE); } if (topEdge != null) { entitesToAdd.Add(topEdge); } if (bottomEdge != null) { entitesToAdd.Add(bottomEdge); } if (leftEdge != null) { entitesToAdd.Add(leftEdge); } if (rightEdge != null) { entitesToAdd.Add(rightEdge); } var y = EntityFactory.CreateExplosionSprite(transformComponent.LocalPosition, ExplosiveType.Center); entitesToAdd.Add(y); foreach (var add in entitesToAdd) { ServiceManager.AddEntity(add); } } }