public override void LoadContent() { base.LoadContent(); Game.EngineComponents.Get <AudioManager>().PreloadSoundEffects("Audio/countDownLong", "Audio/countDownShort"); Game.CurrentGameMode.ClearScore(); AddPlayersWithBarns(locs, rotations); // Border trees Entity border; AddEntity(border = new Entity(this, EntityType.Game, new Vector2(0, 0), new SpriteComponent("joinscreen_outerBorder", new Vector2(screenWidth, screenWidth / 3.84f * 2.245f), new Vector2(0.5f, 0.5f), layerDepth: 0.9f) )); var triangulated = Triangulate.ConvexPartition(GameConstants.BoundingGameFieldTop, TriangulationAlgorithm.Earclip); triangulated.AddRange(Triangulate.ConvexPartition(GameConstants.BoundingGameFieldRight, TriangulationAlgorithm.Earclip)); triangulated.AddRange(Triangulate.ConvexPartition(GameConstants.BoundingGameFieldBottom, TriangulationAlgorithm.Earclip)); triangulated.AddRange(Triangulate.ConvexPartition(GameConstants.BoundingGameFieldLeft, TriangulationAlgorithm.Earclip)); var fixtureList = FixtureFactory.AttachCompoundPolygon(triangulated, 1, border.Body); border.AddComponent(new PhysicsComponent(fixtureList[0].Shape)); // Background AddEntity(new Entity(this, EntityType.Game, new Vector2(0, 0), // src image 6000x3508 new SpriteComponent("background", new Vector2(screenWidth, screenWidth / 3.84f * 2.245f), new Vector2(0.5f, 0.5f), layerDepth: -1.0f) )); // HUD // src image 1365x460 if (spawnAnyUI) { timeComponentBackground = new HUDComponent("timer_bg", new Vector2(1.365f / 0.46f * 0.1f, 1f * 0.1f), new Vector2(0.5f, 0f)); this.timeComponent100 = new HUDTextComponent(MainFont, 0.07f, "", color: countdownColor, offset: timeComponentBackground.LocalPointToWorldPoint(new Vector2(0.35f, 0.5f)), origin: new Vector2(0.5f, 0.5f) ); this.timeComponent10 = new HUDTextComponent(MainFont, 0.07f, "", color: countdownColor, offset: timeComponentBackground.LocalPointToWorldPoint(new Vector2(0.425f, 0.5f)), origin: new Vector2(0.5f, 0.5f) ); this.timeComponent1 = new HUDTextComponent(MainFont, 0.07f, "", color: countdownColor, offset: timeComponentBackground.LocalPointToWorldPoint(new Vector2(0.5f, 0.5f)), origin: new Vector2(0.5f, 0.5f) ); AddEntity(new Entity(this, EntityType.UI, new Vector2(0.5f, 0f), timeComponentBackground, timeComponent100, timeComponent10, timeComponent1 )); if (!IsCountdownRunning) { timeComponentBackground.Opacity = timeComponent100.Opacity = timeComponent10.Opacity = timeComponent1.Opacity = 0f; } UpdateCountdown(0); // Add pause overlay AddEntity(new Entity(this, EntityType.UI, pauseOverlayComponents.AddAndReturn(new HUDComponent(Game.Debug.DebugRectangle, Vector2.One, layerDepth: 0.99f) { Color = Color.Black, MaintainAspectRation = false, OnVirtualUIScreen = false, }))); AddEntity(new Entity(this, EntityType.UI, new Vector2(0.5f, 0.25f), pauseTextOverlayComponents.AddAndReturn(new HUDTextComponent(MainFont, 0.2f, "Game Paused", origin: new Vector2(0.5f, 0.5f), layerDepth: 1f)))); pauseTextOverlayComponents.AddRange( AddEntity(pauseMenuList = new HUDListEntity(this, new Vector2(0.5f, 0.5f), layerDepth: 1f, menuEntries: new[] { new HUDListEntity.ListEntry("Resume", TogglePause), new HUDListEntity.ListEntry("Rejoin", BackToJoinScreen) , new HUDListEntity.ListEntry("Back to main menu", BackToMainMenu) }) { Enabled = false }) .GetAllComponents <HUDTextComponent>().ToList()); // make overlay invisible // [FOREACH PERFORMANCE] Should not allocate garbage pauseOverlayComponents.ForEach(c => c.Opacity = 0f); // [FOREACH PERFORMANCE] Should not allocate garbage pauseTextOverlayComponents.ForEach(c => c.Opacity = 0f); // Add pause controls // [FOREACH PERFORMANCE] Should not allocate garbage foreach (var playerInfo in Game.CurrentGameMode.PlayerInfos) { if (playerInfo.IsKeyboardPlayer) { AddEntity(new Entity(this, EntityType.LayerIndependent, new InputComponent(new InputMapping(i => InputFunctions.KeyboardPause(i), (f) => TogglePause(null))))); } else { AddEntity(new Entity(this, EntityType.LayerIndependent, new InputComponent(playerInfo.GamepadIndex, new InputMapping(i => InputFunctions.Pause(i), (f) => TogglePause(null)), new InputMapping(i => InputFunctions.StartCountdown(i), (f) => StartCountown()) ))); } } var playerInfos = Game.CurrentGameMode.PlayerInfos; var colors = ((PlayerColors[])Enum.GetValues(typeof(PlayerColors))); initialCountdownComponent = new HUDTextComponent(MainFont, 0.25f, Game.CurrentGameMode.PlayerMode == PlayerMode.TwoVsTwo ? "vs" : "free4all", origin: new Vector2(0.5f, 0.5f)); playerName1Component = new HUDTextComponent(MainFont, 0.15f, playerInfos[0].Name, color: colors[0].GetColor(), origin: new Vector2(0f, 0.5f), offset: new Vector2(-0.25f, -0.25f)); playerName2Component = new HUDTextComponent(MainFont, 0.15f, playerInfos.Count > 1 ? playerInfos[1].Name : "name2", color: colors[1].GetColor(), origin: new Vector2(0f, 0.5f), offset: new Vector2(-0.25f, 0.25f)); playerName3Component = new HUDTextComponent(MainFont, 0.15f, playerInfos.Count > 2 ? playerInfos[2].Name : "name3", color: colors[2].GetColor(), origin: new Vector2(1f, 0.5f), offset: new Vector2(0.25f, -0.25f)); playerName4Component = new HUDTextComponent(MainFont, 0.15f, playerInfos.Count > 3 ? playerInfos[3].Name : "name4", color: colors[3].GetColor(), origin: new Vector2(1f, 0.5f), offset: new Vector2(0.25f, 0.25f)); separatorTeam1Component = new HUDTextComponent(MainFont, 0.15f, "&", origin: new Vector2(0.5f, 0.5f), offset: new Vector2(0f, -0.25f)); separatorTeam2Component = new HUDTextComponent(MainFont, 0.15f, "&", origin: new Vector2(0.5f, 0.5f), offset: new Vector2(0f, 0.25f)); Entity countdownEntity; AddEntity(countdownEntity = new Entity(this, EntityType.UI, new Vector2(0.5f, 0.5f), initialCountdownComponent)); if (Game.CurrentGameMode.PlayerMode == PlayerMode.TwoVsTwo) { countdownEntity.AddComponent(playerName1Component); countdownEntity.AddComponent(playerName2Component); countdownEntity.AddComponent(playerName3Component); countdownEntity.AddComponent(playerName4Component); countdownEntity.AddComponent(separatorTeam1Component); countdownEntity.AddComponent(separatorTeam2Component); } } // Camera director AddEntity(new Entity(this, EntityType.LayerIndependent, new CameraDirectorComponent(playerEntities, Game.Camera))); }