예제 #1
0
        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)));
        }