public void Process(Entity toProcess, GameTime gameTime)
        {
            if (!IsApplicableTo(toProcess))
            {
                return;
            }

            // TODO pass this in so it can be controlled
            Random rand = new Random();

            RandomPositionOffsetComponent offset = (RandomPositionOffsetComponent)toProcess.components[typeof(RandomPositionOffsetComponent)];
            int minX = (int)Math.Min(offset.Maximum.X, offset.Minimum.X);
            int maxX = (int)Math.Max(offset.Maximum.X, offset.Minimum.X);

            int minY = (int)Math.Min(offset.Maximum.Y, offset.Minimum.Y);
            int maxY = (int)Math.Max(offset.Maximum.Y, offset.Minimum.Y);

            int x = rand.Next(minX, maxX);
            int y = rand.Next(minY, maxY);

            PositionDeltaComponent delta = new PositionDeltaComponent();
            if (toProcess.components.ContainsKey(typeof(PositionDeltaComponent)))
            {
                delta = (PositionDeltaComponent)toProcess.components[typeof(PositionDeltaComponent)];
                delta.Delta += new Vector2(x, y);
            }
            else
            {
                delta.Delta = new Vector2(x, y);
                toProcess.AddComponent(delta);
            }

            toProcess.RemoveComponent(offset);
        }
        private Entity createExplosionEntity(Game game, AABBComponent parentAABB)
        {
            Entity expl = new Entity();

            //Component: Has a texture
            TextureComponent tex = new TextureComponent();
            tex.Texture = game.Content.Load<Texture2D>("explosion");
            tex.SourceRect = tex.Texture.Bounds;
            expl.AddComponent(tex);

            //Component: Has an animation
            AnimationComponent anim = new AnimationComponent();
            anim.CurrentFrameIndex = 0;
            anim.FrameDuration = 45;
            anim.Looping = false;
            anim.NumFrames = 12;
            anim.TimeSinceFrameChange = 0;
            expl.AddComponent(anim);

            //Component: Is rendered at a specific layer (just behind the player)
            RenderLayerComponent layer = new RenderLayerComponent();
            layer.LayerID = 9;
            expl.AddComponent(layer);

            //Component: Has a bounding box
            AABBComponent aabb = new AABBComponent();
            aabb.Height = 134;
            aabb.Width = 134;
            expl.AddComponent(aabb);

            //Component: Destroys itself once its animation completes
            DestroyedWhenAnimationCompleteComponent destructor = new DestroyedWhenAnimationCompleteComponent();
            expl.AddComponent(destructor);

            //Component: Is offset such that it is concentric with its parent
            PositionDeltaComponent delta = new PositionDeltaComponent();
            float deltaX = parentAABB.Width / 2.0f - aabb.Width / 2.0f;
            float deltaY = parentAABB.Height / 2.0f - aabb.Height / 2.0f;
            delta.Delta = new Vector2(deltaX, deltaY);
            expl.AddComponent(delta);

            //Component: Plays an explosion sound
            SoundEffectComponent soundEffect = new SoundEffectComponent();
            soundEffect.effect = game.Content.Load<SoundEffect>("freesoundsorg/87529__robinhood76__01448-distant-big-explosion-2");
            expl.AddComponent(soundEffect);

            return expl;
        }
        public void Process(Entity toProcess, GameTime gameTime)
        {
            if (!IsApplicableTo(toProcess))
            {
                return;
            }

            KeyboardState currentKeyboardState = Keyboard.GetState();

            Vector2 pos = new Vector2();

            float speed = ((MoveSpeedComponent)toProcess.components[typeof(MoveSpeedComponent)]).MoveSpeed;

            // Use the Keyboard
            if (currentKeyboardState.IsKeyDown(Keys.Left))
            {
                pos.X -= speed;
            }
            if (currentKeyboardState.IsKeyDown(Keys.Right))
            {
                pos.X += speed;
            }
            if (currentKeyboardState.IsKeyDown(Keys.Up))
            {
                pos.Y -= speed;
            }
            if (currentKeyboardState.IsKeyDown(Keys.Down))
            {
                pos.Y += speed;
            }

            // Indicate that the player entity should be translated
            PositionDeltaComponent delta = new PositionDeltaComponent();
            delta.Delta = pos;
            toProcess.AddComponent(delta);
        }