Esempio n. 1
0
        public override void Draw(SpriteBatch spriteBatch, SpriteFont spriteFont)
        {
            List <Entity> sprites = world.GetEntities(new[] { typeof(RenderComponent), typeof(PositionComponent) });

            foreach (Entity drawable in sprites)
            {
                PositionComponent pc = (PositionComponent)drawable.components[typeof(PositionComponent)];
                RenderComponent   rc = (RenderComponent)drawable.components[typeof(RenderComponent)];
                if (rc.visible)
                {
                    spriteBatch.Draw(rc.CurrentTexture, new Rectangle((int)pc.position.X - (rc.CurrentTexture.Width / 2), (int)pc.position.Y - (rc.CurrentTexture.Height / 2), rc.CurrentTexture.Width, rc.CurrentTexture.Height), Color.White);

                    if (drawable.HasComponent(typeof(PlayerComponent)))
                    {
                        if (drawable.HasComponent(typeof(ShieldedComponent)))
                        {
                            Texture2D shield = Game1.instance.playerShield;
                            spriteBatch.Draw(shield, new Rectangle((int)(pc.position.X - rc.CurrentTexture.Width / 2) - 25, (int)(pc.position.Y - rc.CurrentTexture.Height / 2) - 30, shield.Width, shield.Height), Color.White);
                        }
                    }
                }
            }

            List <Entity> players = world.GetEntities(new[] { typeof(PlayerComponent) });

            if (players.Count > 0)
            {
                Entity               player = players[0];
                PlayerComponent      pc     = (PlayerComponent)player.components[typeof(PlayerComponent)];
                TakesDamageComponent ptdc   = (TakesDamageComponent)player.components[typeof(TakesDamageComponent)];
                for (int i = 0; i < pc.lives; i++)
                {
                    spriteBatch.Draw(Game1.instance.playerLivesGraphic, new Rectangle(40 * i + 10, 10, Game1.instance.playerLivesGraphic.Width, Game1.instance.playerLivesGraphic.Height), Color.White);
                }

                string scoreText = "" + Math.Truncate(Game1.instance.playerScore);
                spriteBatch.DrawString(spriteFont, scoreText, new Vector2(world.screenRect.Width - spriteFont.MeasureString(scoreText).X - 30, 5), Color.White);

                spriteBatch.Draw(Game1.instance.blank, new Rectangle(8, 43, 150, 12), Color.Black);
                spriteBatch.Draw(Game1.instance.blank, new Rectangle(9, 44, 148, 10), Color.White);
                spriteBatch.Draw(Game1.instance.blank, new Rectangle(9, 44, (int)(((double)ptdc.health / ptdc.maxHealth) * 148), 10), Color.Red);

                if (player.HasComponent(typeof(HasShieldComponent)))
                {
                    HasShieldComponent hasShieldComponent = (HasShieldComponent)player.components[typeof(HasShieldComponent)];
                    spriteBatch.Draw(Game1.instance.blank, new Rectangle(8, 60, 150, 12), Color.Black);
                    spriteBatch.Draw(Game1.instance.blank, new Rectangle(9, 61, 148, 10), Color.White);
                    spriteBatch.Draw(Game1.instance.blank, new Rectangle(9, 61, (int)((hasShieldComponent.shieldPower / hasShieldComponent.maxShieldPower) * 148), 10), Color.Blue);

                    if (hasShieldComponent.shieldCooldown)
                    {
                        spriteBatch.Draw(Game1.instance.blank, new Rectangle(9, 61, (int)(Math.Min((hasShieldComponent.shieldPower / hasShieldComponent.maxShieldPower), 1) * 148), 10), Color.Purple);
                    }
                }
            }
        }
Esempio n. 2
0
        public override void Update(GameTime gameTime)
        {
            List <Entity> thingsThatDoDamage   = world.GetEntities(new[] { typeof(DealsDamageComponent), typeof(PositionComponent), typeof(RenderComponent) });
            List <Entity> thingsThatTakeDamage = world.GetEntities(new[] { typeof(TakesDamageComponent), typeof(PositionComponent), typeof(RenderComponent) });

            foreach (Entity damageDealer in thingsThatDoDamage)
            {
                DealsDamageComponent ddc   = (DealsDamageComponent)damageDealer.components[typeof(DealsDamageComponent)];
                PositionComponent    dd_pc = (PositionComponent)damageDealer.components[typeof(PositionComponent)];
                RenderComponent      dd_rc = (RenderComponent)damageDealer.components[typeof(RenderComponent)];

                Rectangle damageDealerRect = new Rectangle((int)dd_pc.position.X - (dd_rc.CurrentTexture.Width / 2), (int)dd_pc.position.Y - (dd_rc.CurrentTexture.Height / 2), dd_rc.CurrentTexture.Width, dd_rc.CurrentTexture.Height);

                foreach (Entity damageTaker in thingsThatTakeDamage)
                {
                    TakesDamageComponent tdc = (TakesDamageComponent)damageTaker.components[typeof(TakesDamageComponent)];

                    //Bitwise AND the collision masks, a value > 0 means we have objects that can be compared
                    if ((tdc.takesDamageFromMask & ddc.damageTypeMask) == 0)
                    {
                        continue;
                    }

                    PositionComponent td_pc = (PositionComponent)damageTaker.components[typeof(PositionComponent)];
                    if (!damageTaker.HasComponent(typeof(RenderComponent)))
                    {
                        continue;
                    }
                    RenderComponent td_rc           = (RenderComponent)damageTaker.components[typeof(RenderComponent)];
                    Rectangle       damageTakerRect = new Rectangle((int)td_pc.position.X - (td_rc.CurrentTexture.Width / 2), (int)td_pc.position.Y - (td_rc.CurrentTexture.Height / 2), td_rc.CurrentTexture.Width, td_rc.CurrentTexture.Height);
                    if (damageDealerRect.Intersects(damageTakerRect))
                    {
                        if (!damageTaker.HasComponent(typeof(ShieldedComponent)))
                        {
                            tdc.health -= ddc.strength;
                        }

                        //Check if the damage dealer was a laser
                        if (damageDealer.HasComponent(typeof(LaserComponent)))
                        {
                            LaserComponent dd_lc = (LaserComponent)damageDealer.components[typeof(LaserComponent)];

                            //Spawn an explosion at the location of collision
                            Entity explosion = new Entity();
                            explosion.AddComponent(new RenderComponent(dd_lc.explosionTexture));
                            explosion.AddComponent(new PositionComponent(dd_pc.position));
                            explosion.AddComponent(new ExplosionComponent());
                            world.AddEntity(explosion);
                        }

                        world.RemoveEntity(damageDealer);

                        if (tdc.health <= 0)
                        {
                            if (damageTaker.HasComponent(typeof(PlayerComponent)))
                            {
                                PlayerComponent playerComp = (PlayerComponent)damageTaker.components[typeof(PlayerComponent)];
                                playerComp.lives -= 1;
                                damageTaker.RemoveComponent(typeof(RenderComponent));
                            }
                            else
                            {
                                world.RemoveEntity(damageTaker);
                            }

                            if (damageDealer.HasComponent(typeof(LaserComponent)))
                            {
                                int credit = 1;
                                if (damageTaker.HasComponent(typeof(MeteorComponent)))
                                {
                                    MeteorComponent meteorComponent = (MeteorComponent)damageTaker.components[typeof(MeteorComponent)];
                                    if (meteorComponent.isBig)
                                    {
                                        credit = 2;
                                    }
                                }

                                Game1.instance.kills += 1;
                                double multiplier = 1 + Math.Log(GameScreen.timeStayedAlive / 1000);
                                double score      = (credit * multiplier) * 100;
                                Game1.instance.playerScore += score;

                                Entity e = new Entity();
                                e.AddComponent(new PositionComponent(td_pc.position));
                                e.AddComponent(new NotificationComponent("+" + Math.Truncate(score), 200, false));
                                Game1.instance.world.AddEntity(e);
                            }

                            if (damageTaker.HasComponent(typeof(MeteorComponent)))
                            {
                                MeteorComponent meteorComponent = (MeteorComponent)damageTaker.components[typeof(MeteorComponent)];
                                //Spawn small meteors when big ones break
                                if (meteorComponent.isBig)
                                {
                                    Random rand    = new Random();
                                    int    randAmt = rand.Next(2, 6);
                                    for (int i = 0; i < randAmt; i++)
                                    {
                                        Entity newMeteor = new Entity();
                                        newMeteor.AddComponent(new MeteorComponent(false));
                                        newMeteor.AddComponent(new TakesDamageComponent(5, LASER));
                                        newMeteor.AddComponent(new DealsDamageComponent(5, METEOR));
                                        newMeteor.AddComponent(new RenderComponent(Game1.instance.meteorSmall));
                                        newMeteor.AddComponent(new SpeedComponent(new Vector2(rand.Next(-3, 3), rand.Next(2, 5))));
                                        newMeteor.AddComponent(new PositionComponent(new Vector2(td_pc.position.X, td_pc.position.Y)));
                                        world.AddEntity(newMeteor);
                                    }
                                }
                            }
                        }

                        break;
                    }
                }
            }
        }
Esempio n. 3
0
        public override void Update(GameTime gameTime)
        {
            keyboardState = Keyboard.GetState();

            Entity        player;
            List <Entity> playerEntities = world.GetEntities(new[] { typeof(PlayerComponent) });

            if (playerEntities.Count == 0)
            {
                player = new Entity();
                PlayerComponent ppc = new PlayerComponent();
                player.AddComponent(ppc);
                player.AddComponent(new HasShieldComponent());
                player.AddComponent(new SpeedComponent(Vector2.Zero));
                player.AddComponent(new TakesDamageComponent(50, DamageSystem.ENEMY ^ DamageSystem.ENEMY_LASER ^ DamageSystem.METEOR));
                world.AddEntity(player);

                ppc.lives = ppc.maxLives;
            }
            else
            {
                player = playerEntities[0];
            }

            if (!player.HasComponent(typeof(RenderComponent)))
            {
                Game1.instance.kills = 0;

                PlayerComponent ppc = (PlayerComponent)player.components[typeof(PlayerComponent)];

                ppc.timeSinceRespawn = 0;
                ppc.laserLevel       = 0;

                //Remove shield upgrade on respawn
                //player.RemoveComponent(typeof(HasShieldComponent));

                TakesDamageComponent ptdc = (TakesDamageComponent)player.components[typeof(TakesDamageComponent)];
                ptdc.health = ptdc.maxHealth;

                RenderComponent prc = new RenderComponent(Game1.instance.shipTextures.ToArray());
                player.AddComponent(prc);
                if (!player.HasComponent(typeof(PositionComponent)))
                {
                    player.AddComponent(new PositionComponent(new Vector2(
                                                                  (world.screenRect.Width / 2) - (prc.CurrentTexture.Width / 2),
                                                                  (world.screenRect.Height / 3) * 2 + (prc.CurrentTexture.Height / 2)
                                                                  )));
                }
                else
                {
                    PositionComponent playerPositionComp = (PositionComponent)player.components[typeof(PositionComponent)];
                    playerPositionComp.position = new Vector2(
                        (world.screenRect.Width / 2) - (prc.CurrentTexture.Width / 2),
                        (world.screenRect.Height / 3) * 2 + (prc.CurrentTexture.Height / 2)
                        );
                }
            }

            PlayerComponent pc = (PlayerComponent)player.components[typeof(PlayerComponent)];
            SpeedComponent  sc = (SpeedComponent)player.components[typeof(SpeedComponent)];
            RenderComponent rc = (RenderComponent)player.components[typeof(RenderComponent)];

            if (pc.lives == 0)
            {
                Game1.instance.PopScreen();
                Game1.instance.PushScreen(new GameOverScreen());
                return;
            }

            sc.motion        = Vector2.Zero;
            pc.lastFireTime += gameTime.ElapsedGameTime.Milliseconds;

            if (player.HasComponent(typeof(HasShieldComponent)))
            {
                HasShieldComponent hasShieldComp = (HasShieldComponent)player.components[typeof(HasShieldComponent)];

                if (!player.HasComponent(typeof(ShieldedComponent)) && hasShieldComp.shieldPower < hasShieldComp.maxShieldPower)
                {
                    hasShieldComp.shieldPower += hasShieldComp.shieldRegenRate * gameTime.ElapsedGameTime.Milliseconds;
                }

                if (hasShieldComp.shieldPower >= hasShieldComp.maxShieldPower)
                {
                    hasShieldComp.shieldPower    = hasShieldComp.maxShieldPower;
                    hasShieldComp.shieldCooldown = false;
                }
                if (player.HasComponent(typeof(ShieldedComponent)))
                {
                    hasShieldComp.shieldPower -= hasShieldComp.shieldDepleteRate * gameTime.ElapsedGameTime.Milliseconds;

                    if (hasShieldComp.shieldPower <= 0)
                    {
                        player.RemoveComponent(typeof(ShieldedComponent));
                        hasShieldComp.shieldCooldown = true;
                        hasShieldComp.shieldPower    = 0;
                    }
                }

                if (!hasShieldComp.shieldCooldown)
                {
                    if (keyboardState.IsKeyDown(Keys.LeftShift) && hasShieldComp.shieldPower >= 0)
                    {
                        if (!player.HasComponent(typeof(ShieldedComponent)))
                        {
                            player.AddComponent(new ShieldedComponent());
                        }
                    }
                    else
                    {
                        player.RemoveComponent(typeof(ShieldedComponent));
                    }
                }
            }

            bool upgradedLasers = false;

            if (Game1.instance.kills > 10 && pc.laserLevel == 0)
            {
                pc.laserLevel  = 1;
                upgradedLasers = true;
            }
            if (Game1.instance.kills > 20 && pc.laserLevel == 1)
            {
                pc.laserLevel  = 2;
                upgradedLasers = true;
            }
            if (Game1.instance.kills > 40 && pc.laserLevel == 2)
            {
                pc.laserLevel  = 3;
                upgradedLasers = true;
            }

            if (upgradedLasers)
            {
                Entity e = new Entity();
                e.AddComponent(new NotificationComponent("Lasers Improved", 2000, true));
                world.AddEntity(e);
            }

            if (keyboardState.IsKeyDown(Keys.Space) && !player.HasComponent(typeof(ShieldedComponent)))
            {
                Shoot(player);
            }

            if (keyboardState.IsKeyDown(Keys.Left))
            {
                rc.currentTexture = 1;
                sc.motion.X       = -1;
            }
            if (keyboardState.IsKeyDown(Keys.Right))
            {
                rc.currentTexture = 2;
                sc.motion.X       = 1;
            }
            if (keyboardState.IsKeyDown(Keys.Up))
            {
                if (keyboardState.IsKeyUp(Keys.Left) && keyboardState.IsKeyUp(Keys.Right))
                {
                    rc.currentTexture = 0;
                }
                sc.motion.Y = -1;
            }
            if (keyboardState.IsKeyDown(Keys.Down))
            {
                if (keyboardState.IsKeyUp(Keys.Left) && keyboardState.IsKeyUp(Keys.Right))
                {
                    rc.currentTexture = 0;
                }
                sc.motion.Y = 1;
            }
            if (keyboardState.IsKeyUp(Keys.Left) && keyboardState.IsKeyUp(Keys.Right))
            {
                rc.currentTexture = 0;
            }

            sc.motion *= 5;
        }