/// <summary> /// Changes the <c>Screen</c> to the specified one. /// </summary> public void ChangeScreen(ScreenState state) { Unload(); switch (state) { case ScreenState.GAME: CurrentScreen = new GameScreen(); break; case ScreenState.MENU: CurrentScreen = new MenuScreen(); break; case ScreenState.READY: CurrentScreen = new PlayerReadyScreen(); break; case ScreenState.AFTER: CurrentScreen = new AfterScreen(); break; } CurrentScreen.LoadContent(Content); }
/// <summary> /// Updates the logic of the stage 0. /// </summary> /// <param name="gameTime"></param> public override void Update(GameTime gameTime) { if (!isOver) { base.Update(gameTime); } else { for (int i = 0; i < Players.Length; i++) { if (Players[i] != null) { Players[i].Position += new Vector2(0, -5); } } } float dt = (float)gameTime.ElapsedGameTime.TotalMilliseconds; spawnTimer += dt; spawnTimer2 += dt; StageTimer += dt; vortexSpawnTimer += dt; switch (StageNumber) { case 0: if (StageTimer > 5000f) { SetStage(StageNumber + 1); } break; case 1: CurrentDialogue = Dialogues[0]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); MediaPlayer.Play(snailChan); } break; case 2: if (StageTimer > 5000f) { SetStage(StageNumber + 1); } break; case 3: CurrentDialogue = Dialogues[1]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 4: // 18 seconds if (StageTimer < 14000f) { if (spawnTimer > 1500f) { spawnTimer = 0; SpawnSinEnemy(new Vector2(-100, 70), true); } if (spawnTimer2 > 1500f) { spawnTimer2 = 0; SpawnSinEnemy(new Vector2(-100, 500), true); } } if (StageTimer > 18000f) { SetStage(StageNumber + 1); } break; case 5: CurrentDialogue = Dialogues[2]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 6: if (spawnTimer > 1500f) { spawnTimer = 0; SpawnSinEnemy(new Vector2(-100, 70), true); if (rand.NextDouble() > 0.8f) { SpawnSinEnemy(new Vector2(ScreenManager.GetInstance().Width + 100, 100), false); } } if (spawnTimer2 > 1500f) { spawnTimer2 = 0; SpawnSinEnemy(new Vector2(-100, 500), true); } if (StageTimer > 18000f) { CurrentDialogue = Dialogues[3]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } } break; case 7: if (StageTimer < 25000f) { if (spawnTimer > 1500f) { spawnTimer = 0; SpawnSinEnemy(new Vector2(-100, 70), true); if (rand.NextDouble() > 0.8f) { SpawnSinEnemy(new Vector2(ScreenManager.GetInstance().Width + 100, 100), false); } } if (spawnTimer2 > 1500f) { spawnTimer2 = 0; SpawnSinEnemy(new Vector2(-100, 500), true); } if (vortexSpawnTimer > 3000f) { SpawnVortexEnemy(new Vector2(-100, ScreenManager.GetInstance().Height / 2), new Vector2(300, 0), 8000f); vortexSpawnTimer = 0; } } if (StageTimer > 30000f) { SetStage(StageNumber + 1); } break; case 8: CurrentDialogue = Dialogues[4]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 9: if (StageTimer > 7000f) { SetStage(StageNumber + 1); } break; case 10: CurrentDialogue = Dialogues[5]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 11: if (StageTimer > 5000f) { SetStage(StageNumber + 1); } break; case 12: // Boss fight if (!spawnedBoss) { Texture2D bossTexture = Content.Load <Texture2D>("TestBoss"); boss = new CorruptedSunBoss(Players, 100 + GetPlayerCount() * 50) { Texture = bossTexture, Size = new Point(bossTexture.Width * 5, bossTexture.Height * 5), BulletTexture = blank, Color = Color.White, vortexEnemyTexture = Content.Load <Texture2D>("Vortex"), Blank = blank, sunBullet = Content.Load <Texture2D>("SunBullet"), }; AddEnemy(boss); spawnedBoss = true; } else { if ((float)boss.Health / boss.MAX_HEALTH < 0.5f) { CurrentDialogue = Dialogues[6]; } } if (Enemies.Count == 0) { SetStage(StageNumber + 1); } break; case 13: CurrentDialogue = Dialogues[7]; if (CurrentDialogue.FinishedPlaying) { // end level isOver = true; bool isReallyOver = false; for (int i = 0; i < Players.Length; i++) { if (Players[i] != null && Players[i].Position.Y > 0) { isReallyOver = false; break; } else { isReallyOver = true; } } // now end level if (isReallyOver) { ScreenManager.GetInstance().ChangeScreen(ScreenState.AFTER); AfterScreen s = (AfterScreen)ScreenManager.GetInstance().CurrentScreen; s.Players = Players; s.Stage = 0; MediaPlayer.Stop(); } } break; } if (CurrentDialogue != null) { CurrentDialogue.Update(gameTime); } }
/// <summary> /// Updates the stage. /// </summary> /// <param name="gameTime"></param> public override void Update(GameTime gameTime) { float dt = (float)gameTime.ElapsedGameTime.TotalMilliseconds; StageTimer += dt; spawnTimer += dt; vortexSpawnTimer += dt; CurrentDialogue?.Update(gameTime); if (!isOver) { base.Update(gameTime); } else { for (int i = 0; i < Players.Length; i++) { if (Players[i] != null) { Players[i].Position += new Vector2(0, -5); } } } switch (StageNumber) { case 1: if (StageTimer >= 5000f) { SetStage(StageNumber + 1); MediaPlayer.Play(cosmoFunk); } break; case 0: CurrentDialogue = Dialogues[0]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 2: CurrentDialogue = Dialogues[1]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 3: // spawn robots with invis if (spawnTimer > 700f) { spawnTimer = 0; if (rand.NextDouble() > .50 || StageTimer < 7000f) { SpawnInvisSinEnemy(new Vector2(-100, rand.Next(100, 500)), true); } else if (StageTimer > 7000f) { SpawnInvisSinEnemy(new Vector2(ScreenManager.GetInstance().Width + 100, rand.Next(100, 500)), false); } if (vortexSpawnTimer > 9000 && StageTimer > 18000f) { vortexSpawnTimer = 0; SpawnVortexEnemy(new Vector2(-100, -100), new Vector2(200, 200), 7000f); SpawnVortexEnemy(new Vector2(ScreenManager.GetInstance().Width + 100, -100), new Vector2(-200, 200), 7000f); } if (StageTimer > 36000f) { SetStage(StageNumber + 1); } } break; case 4: CurrentDialogue = Dialogues[2]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 5: if (StageTimer >= 5000f) { SetStage(StageNumber + 1); } break; case 6: // summon asteroid hell upon the players if (spawnTimer > 70 && StageTimer < 30000) { spawnTimer = 0; Vector2 pos = new Vector2(rand.Next(-100, ScreenManager.GetInstance().Width + 100), -90); float scale = (float)(rand.NextDouble() * (Sprite.SCALE - 3) + 3f); float speed = 1000 / (float)Math.Sqrt(scale); Texture2D aster = asteroidTextures[rand.Next(0, 5)]; float xSpeed = (float)((rand.NextDouble() - 0.5f) * 100f); Asteroid a = new Asteroid(Bullet.EntitySide.ENEMY, 7000f, new Vector2(xSpeed, speed)) { Texture = aster, Position = pos, Size = new Point((int)(aster.Width * scale), (int)(aster.Height * scale)), Health = (int)(Math.Ceiling(scale / 2)), Color = Color.White, InitVelocity = new Vector2(xSpeed, speed), }; Bullets.Add(a); } if (StageTimer > 33000) { SetStage(StageNumber + 1); } break; case 7: CurrentDialogue = Dialogues[3]; if (CurrentDialogue.FinishedPlaying) { Texture2D asteroidBoss = Content.Load <Texture2D>("AsteroidBoss"); aBoss = new AsteroidBoss(Players, 70 + GetPlayerCount() * 30) { Texture = asteroidBoss, Position = new Vector2(ScreenManager.GetInstance().Width / 2, -300), Size = new Point(asteroidBoss.Width * Sprite.SCALE, asteroidBoss.Height * Sprite.SCALE), BulletTexture = asteroidTextures[3], }; AddEnemy(aBoss); SetStage(StageNumber + 1); } break; case 8: if (StageTimer >= 5000f) { SetStage(StageNumber + 1); } break; case 9: if (aBoss != null && !aBoss.IsActive) { SetStage(StageNumber + 1); } break; case 10: CurrentDialogue = Dialogues[4]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 11: CurrentDialogue = Dialogues[5]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } CurrentDialogue = Dialogues[5]; break; case 12: CurrentDialogue = Dialogues[6]; if (CurrentDialogue.FinishedPlaying) { SetStage(StageNumber + 1); } break; case 13: if (StageTimer >= 5000f) { SetStage(StageNumber + 1); } break; case 14: sBoss = new SpinnerBoss(Players, 100 + GetPlayerCount() * 50) { Position = new Vector2(100, 100), }; AddEnemy(sBoss); SetStage(StageNumber + 1); break; case 15: // SPAWN SPINNER BOSS if (Enemies.Count == 0) { SetStage(StageNumber + 1); } break; case 16: CurrentDialogue = Dialogues[7]; if (CurrentDialogue.FinishedPlaying) { isOver = true; bool isReallyOver = false; for (int i = 0; i < Players.Length; i++) { if (Players[i] != null && Players[i].Position.Y > 0) { isReallyOver = false; break; } else { isReallyOver = true; } } // now end level if (isReallyOver) { ScreenManager.GetInstance().ChangeScreen(ScreenState.AFTER); AfterScreen s = (AfterScreen)ScreenManager.GetInstance().CurrentScreen; s.Players = Players; s.Stage = 1; MediaPlayer.Stop(); } } break; } }