コード例 #1
0
ファイル: Game.cs プロジェクト: yazici/Grey-Infection
        // Carga el nivel indicado en la variable "currentLevel":
        private void LoadLevel()
        {// Comprobamos si hemos llegado al final del juego en modo trial:
            if (Guide.IsTrialMode && (int)Manager.Vars["currentLevel"] > 7)
            {
                Manager.Vars["purchaseAndReturnMenu"] = true;
                Manager.GameStates.ChangeState("endtrial");
            }
            // Comprobamos si hemos llegado al final del juego en modo completo:
            else if (!Guide.IsTrialMode && (int)Manager.Vars["currentLevel"] > 32)
            {
                Manager.GameStates.ChangeState("gameover");
            }
            // Cargamos el nivel:
            else
            {
                // Descargamaos previamente el nivel actual:
                UnloadLevel();

                // Area del escenario para definir los elementos:
                Rectangle boxArea = new Rectangle(0, 0, 1024, 576);

                // Marco del escenario para delimitar el area de accion del jugador:
                {
                    Manager.PhysicEngine.Bodies.Add(new Body(Manager.PhysicEngine, new Rectangle(boxArea.X, boxArea.Y - 64, boxArea.Width, 64), 1, true));
                    Manager.PhysicEngine.Bodies.Add(new Body(Manager.PhysicEngine, new Rectangle(boxArea.X - 64, 0, 64, boxArea.Height), 1, true));
                    Manager.PhysicEngine.Bodies.Add(new Body(Manager.PhysicEngine, new Rectangle(boxArea.Width, 0, 64, boxArea.Height), 1, true));
                }

                // Area de muerte: la zona inferior de la escena matara al jugador si hay colision:
                {
                    Body deathTrigger = new Body(Manager.PhysicEngine, new Rectangle(boxArea.X, boxArea.Height, boxArea.Width, 64), 0);
                    deathTrigger.Tag          = "deathZone";
                    deathTrigger.Trigger      = true;
                    deathTrigger.OnCollision += this.OnCollisionDeathZone;
                    Manager.PhysicEngine.Bodies.Add(deathTrigger);
                }

                // Cargamos los objetos de la escena:
                try
                {
                    GameDefinitions.LevelData level = Serializers.DeserializeFromTitleStorage <GameDefinitions.LevelData>("GameData/Levels/" + (Guide.IsTrialMode ? "Trial/" : "") + Manager.Vars["currentLevel"].ToString() + ".xml");
                    {
                        // Agregamos las pistas:
                        Clue clue;
                        foreach (GameDefinitions.Clue c in level.Clues)
                        {
                            if (c.Texture != "clue_exit" && !c.Texture.StartsWith("level_"))
                            {
                                clue = new Clue();
                                Manager.Scene.AddEntity(clue);
                                clue.Texture  = c.Texture;
                                clue.Location = c.Location;
                                clue.Update(Manager.GameTime);
                            }
                        }

                        // Agregamos los tiles:
                        Tile tile;
                        foreach (GameDefinitions.Tile t in level.Tiles)
                        {
                            tile = new Tile();
                            Manager.Scene.AddEntity(tile);
                            tile.Texture  = t.Texture;
                            tile.Location = t.Location;
                            tile.Tag      = t.Tag;
                            tile.Visible  = t.Active;
                            tile.Update(Manager.GameTime);
                        }

                        // Agregamos una entidad TileGroupQuery para el power-up de mostrar el camino completo:
                        TileGroupQuery tileGroupQuery = new TileGroupQuery();
                        Manager.Scene.AddEntity(tileGroupQuery, "tileGroupQuery");

                        // Agregamos los enemigos:
                        Enemy enemy;
                        foreach (GameDefinitions.Enemy e in level.Enemies)
                        {
                            enemy = new Enemy();
                            Manager.Scene.AddEntity(enemy);
                            enemy.Location   = e.Location;
                            enemy.Invincible = e.Invincible;
                            enemy.Target     = e.Target;
                            enemy.Action     = e.Action;

                            // Si el target no esta vacio lo agregamos a la entidad TileGroupQuery:
                            if (enemy.Target != "" && (enemy.Action == 0 || enemy.Action == 1) && tileGroupQuery.Query.Keys.Contains <string>(enemy.Target))
                            {
                                tileGroupQuery.Query.Add(enemy.Target, enemy.Action == 0 ? false : true);
                            }

                            enemy.PathLength         = e.PathLength;
                            enemy.Step               = e.Step;
                            enemy.Behavior           = e.Behavior;
                            enemy.Type               = e.Type;
                            enemy.Respawn            = e.Respawn;
                            enemy.RespawnDelay       = e.RespawnDelay;
                            enemy.ReversePathAtStart = e.ReversePathAtStart;

                            enemy.Update(Manager.GameTime);

                            // Solo se cuentan las particulas que son sean items o especiales (0 - 2):
                            if (e.Action < 3)
                            {
                                Manager.Vars["enemiesLeft"] = (int)Manager.Vars["enemiesLeft"] + 1;
                            }
                        }

                        // Agregamos al jugador:
                        Player player = new Player();
                        Manager.Scene.AddEntity(player, "player");
                        player.Location = level.Player.Location;
                        player.Update(Manager.GameTime);

                        // Agregamos la zona de salida del nivel:
                        ExitArea exit = new ExitArea();
                        Manager.Scene.AddEntity(exit);
                        exit.Location   = level.ExitArea.Location;
                        exit.InvertClue = level.ExitArea.InvertClue;
                    }

                    // Reiniciamos los contadores:
                    Manager.Vars["shoots"]            = 0;
                    Manager.Vars["currentLevelScore"] = 0;
                }
                catch (Exception ex)
                {
                    Manager.Vars["errorBoard"] = "*** Error al cargar el nivel #" + (int)Manager.Vars["currentLevel"] + ": \n" + ex.Message + "***";
                    Manager.GameStates.ChangeState("menu");
                    return;
                }
                Manager.Vars["errorBoard"] = "";

                // Agregamos el componente del HUD:
                Manager.Scene.AddEntity(new Entities.GUI.HUD(), "HUD");

                // Agregamos el componente de la ventana que hace marco de la escena:
                Manager.Scene.AddEntity(new Entities.GUI.MainWindowFrame());

                // Cargamos el fondo de escena:
                Manager.Scene.AddEntity(new Background());

                // Cargamos el efecto de escalineado de la pantalla:
                Manager.Scene.AddEntity(new ScanLines());

                // En caso contrario se manda el mensaje para que inicien su actividad todos los componentes del juego:
                Manager.Messages.SendMessage("", "ready");
                Manager.Vars["showMessageReady"] = false;
                Manager.Vars["showMessagePause"] = false;

                // Si el nivel ya se completo, se muestra en color:
                if ((int)Manager.Vars["currentLevel"] < Session.GameProgress.CurrentLevel)
                {
                    Manager.Graphics.EndShader();
                }
                else
                {
                    Manager.Graphics.BeginShader();
                }

                // Cargamos el efecto de glitch para el efecto color/bn al matar las particulas:
                GlitchColor glitch = new GlitchColor();
                Manager.Scene.AddEntity(glitch, "glitch");
                glitch.Manual = true;

                // Vigilamos que el usuario no cierra sesion. En caso de hacerlo mostramos aviso y lo mandamos a la pantalla de titulo:
                Manager.Scene.AddEntity(new PlayerSignedOut());
            }
        }
コード例 #2
0
 public void AddExit(ExitArea a)
 {
     exits.Add(a);
 }