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); } } } }
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; } } } }
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; }