Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
                }
            }
        }