Пример #1
0
        public void WasShot()
        {
            hitpoints--;
            if (hitpoints <= 0)
            {
                IsExpired = true;
            }


            float     hue          = (float)((3 * GameRoot.GameTime.TotalGameTime.TotalSeconds) % 6);
            Color     color        = ColorUtil.HSVToColor(hue, 0.25f, 1);
            const int numParticles = 150;
            float     startOffset  = rand.NextFloat(0, MathHelper.TwoPi / numParticles);

            for (int i = 0; i < numParticles; i++)
            {
                Vector2 sprayVel = MathUtil.FromPolar(MathHelper.TwoPi * i / numParticles + startOffset, rand.NextFloat(8, 16));
                Vector2 pos      = Position + 2f * sprayVel;
                var     state    = new ParticleState()
                {
                    Velocity         = sprayVel,
                    LengthMultiplier = 1,
                    Type             = ParticleType.IgnoreGravity
                };

                GameRoot.ParticleManager.CreateParticle(Art.LineParticle, pos, color, 90, 1.5f, state);
            }

            Sound.Explosion.Play(0.5f, rand.NextFloat(-0.2f, 0.2f), 0);
        }
Пример #2
0
        /// <summary>
        /// Handles death for the ship
        /// </summary>
        public void Kill()
        {
            // Remove a life
            PlayerStatus.RemoveLife();

            // Reset the position
            Position = new Vector2(GameBase.ScreenSize.X / 2, GameBase.ScreenSize.Y - 10);

            // Set the frames until respawn as 120 if the game is not over, and 300 if the game is over
            framesUntilRespawn = PlayerStatus.IsGameOver ? 300 : 120;

            // Create a yellow explosion colour
            Color explosionColor = new Color(0.8f, 0.8f, 0.4f);

            // Create death particles
            for (int i = 0; i < 1200; i++)
            {
                // Define the particle speed and colour
                float speed = 18f * (1f - 1 / rand.NextFloat(1f, 10f));
                Color color = Color.Lerp(Color.White, explosionColor, rand.NextFloat(0, 1));

                // Create a new particle state
                var state = new ParticleState()
                {
                    Velocity         = rand.NextVector2(speed, speed),
                    Type             = ParticleType.None,
                    LengthMultiplier = 1
                };

                // Create the individual particle
                GameBase.ParticleManager.CreateParticle(Art.LineParticle, Position, color, 190, 1.5f, state);
            }
        }
Пример #3
0
        public void WasShot()
        {
            IsExpired = true;
            PlayerStatus.AddPoints(PointValue);
            PlayerStatus.IncreaseMultiplier();

            float hue1   = rand.NextFloat(0, 6);
            float hue2   = (hue1 + rand.NextFloat(0, 2)) % 6f;
            Color color1 = ColorUtil.HSVToColor(hue1, 0.5f, 1);
            Color color2 = ColorUtil.HSVToColor(hue2, 0.5f, 1);

            for (int i = 0; i < 120; i++)
            {
                float speed = 18f * (1f - 1 / rand.NextFloat(1, 10));
                var   state = new ParticleState()
                {
                    Velocity         = rand.NextVector2(speed, speed),
                    Type             = ParticleType.Enemy,
                    LengthMultiplier = 1
                };

                Color color = Color.Lerp(color1, color2, rand.NextFloat(0, 1));
                GameRoot.ParticleManager.CreateParticle(Art.LineParticle, Position, color, 190, 1.5f, state);
            }

            Sound.Explosion.Play(0.5f, rand.NextFloat(-0.2f, 0.2f), 0);
        }
Пример #4
0
        /// <summary>
        /// Kills an enemy
        /// </summary>
        /// <param name="isNewLife">Checks to see whether or not the player died and the enemy needs to
        ///                         be killed without generating new subenemies. False by default</param>
        public void KillEnemy(bool isNewLife = false)
        {
            // Expire the entity
            IsExpired = true;

            // Check to see if the enemy was not killed by virtue of a new life
            if (!isNewLife)
            {
                // Add points and increase the multiplier
                PlayerStatus.AddPoints(PointValue);
                PlayerStatus.IncreaseMultiplier();

                // Create 2 random hues
                float hue1 = rand.NextFloat(0, 6);
                float hue2 = (hue1 + rand.NextFloat(0, 2)) % 6f;

                // Extract the colours from the two hues
                Color color1 = ColorUtil.HSVToColor(hue1, 0.5f, 1);
                Color color2 = ColorUtil.HSVToColor(hue2, 0.5f, 1);

                // Create a particle explosion of 120 particles
                for (int i = 0; i < 120; i++)
                {
                    // Set the particle speed
                    float speed = 18f * (1f - 1 / rand.NextFloat(1, 10));

                    // Create a new particle state
                    var state = new ParticleState()
                    {
                        Velocity         = rand.NextVector2(speed, speed),
                        Type             = ParticleType.Enemy,
                        LengthMultiplier = 1
                    };

                    // Lerp the colour between the two colours defined above
                    Color color = Color.Lerp(color1, color2, rand.NextFloat(0, 1));

                    // Create the particle
                    GameBase.ParticleManager.CreateParticle(Art.LineParticle, Position, color, 190, 1.5f, state);
                }

                // Play an explosion sound
                Sound.Explosion.Play(0.5f, rand.NextFloat(-0.2f, 0.2f), 0);

                // NOTE: I use different X velocities to add to the illusion of weight
                // If the enemy is a large meteor, spawn in two middle meteors
                if (Type == EnemyType.LargeMeteor)
                {
                    EntityManager.Add(MiddleMeteor(Position, new Vector2(5, -6)));
                    EntityManager.Add(MiddleMeteor(Position, new Vector2(-5, -6)));
                }
                // If the enemy is a middle meteor, spawn in two small meteors
                else if (Type == EnemyType.MiddleMeteor)
                {
                    EntityManager.Add(SmallMeteor(Position, new Vector2(7, -6)));
                    EntityManager.Add(SmallMeteor(Position, new Vector2(-7, -6)));
                    EntityManager.Add(SmallMeteor(Position, new Vector2(0, 6)));
                }
            }
        }
Пример #5
0
        public static ParticleState GetRandom(float minVel, float maxVel)
        {
            var state = new ParticleState();

            state.Velocity         = rand.NextVector2(minVel, maxVel);
            state.Type             = ParticleType.None;
            state.LengthMultiplier = 1;

            return(state);
        }
Пример #6
0
        public override void Update()
        {
            var entities = EntityManager.GetNearbyEntities(Position, 250);

            foreach (var entity in entities)
            {
                if (entity is Enemy && !(entity as Enemy).IsActive)
                {
                    continue;
                }

                // bullets are repelled by black holes and everything else is attracted
                if (entity is Bullet)
                {
                    entity.Velocity += (entity.Position - Position).ScaleTo(0.3f);
                }
                else
                {
                    var dPos   = Position - entity.Position;
                    var length = dPos.Length();

                    entity.Velocity += dPos.ScaleTo(MathHelper.Lerp(2, 0, length / 250f));
                }
            }

            // The black holes spray some orbiting particles. The spray toggles on and off every quarter second.
            if ((GameRoot.GameTime.TotalGameTime.Milliseconds / 250) % 2 == 0)
            {
                Vector2 sprayVel = MathUtil.FromPolar(sprayAngle, rand.NextFloat(12, 15));
                Color   color    = ColorUtil.HSVToColor(5, 0.5f, 0.8f); // light purple
                Vector2 pos      = Position + 2f * new Vector2(sprayVel.Y, -sprayVel.X) + rand.NextVector2(4, 8);
                var     state    = new ParticleState()
                {
                    Velocity         = sprayVel,
                    LengthMultiplier = 1,
                    Type             = ParticleType.Enemy
                };

                GameRoot.ParticleManager.CreateParticle(Art.LineParticle, pos, color, 190, 1.5f, state);
            }

            // rotate the spray direction
            sprayAngle -= MathHelper.TwoPi / 50f;

            GameRoot.Grid.ApplyImplosiveForce((float)Math.Sin(sprayAngle / 2) * 10 + 20, Position, 200);
        }
Пример #7
0
        public void Kill()
        {
            PlayerStatus.RemoveLife();
            framesUntilRespawn = PlayerStatus.IsGameOver ? 300 : 120;

            Color explosionColor = new Color(0.8f, 0.8f, 0.4f);                 // yellow

            for (int i = 0; i < 1200; i++)
            {
                float speed = 18f * (1f - 1 / rand.NextFloat(1f, 10f));
                Color color = Color.Lerp(Color.White, explosionColor, rand.NextFloat(0, 1));
                var   state = new ParticleState()
                {
                    Velocity         = rand.NextVector2(speed, speed),
                    Type             = ParticleType.None,
                    LengthMultiplier = 1
                };

                GameRoot.ParticleManager.CreateParticle(Art.LineParticle, Position, color, 190, 1.5f, state);
            }
        }