Пример #1
0
        private void generarMapa()
        {
            //Se generan paredes
            paredes = new List <Obstaculo>();
            try
            {
                StreamReader mapa = new StreamReader("mapa.txt");
                string       linea;
                int          i = 0;

                while ((linea = mapa.ReadLine()) != null)
                {
                    for (int j = 0; j < linea.Length; j++)
                    {
                        if (linea[j] == 'X')
                        {
                            paredes.Add(new Obstaculo(i * 40, (j + 1) * 40));
                        }
                    }

                    i++;
                }

                mapa.Close();
            }catch (FileNotFoundException e)
            {
                Console.WriteLine("No se ha encontrado el archivo " + e.FileName + " y no se puede generar un mapa");
            }catch (ArgumentException e)
            {
                Console.WriteLine(e.Message);
            }catch (IOException e)
            {
                Console.WriteLine(e.Message);
            }

            //se generan muros
            muros = new List <Obstaculo>();
            int numMuros = 0, x, y;

            r = new Random();
            bool coinciden;

            while (numMuros < Math.Min(80, 35 * nivel))
            {
                x         = r.Next(1, 22) * 40;
                y         = r.Next(2, 13) * 40;
                coinciden = false;

                if (x > 160 || y > 160)
                {
                    for (int i = 0; i < paredes.Count && !coinciden; i++)
                    {
                        if (paredes[i].X == x && paredes[i].Y == y)
                        {
                            coinciden = true;
                        }
                    }

                    if (!coinciden)
                    {
                        muros.Add(new Obstaculo(x, y));
                        numMuros++;
                    }
                }
            }

            //Se genera la puerta de salida
            bool generado = false;

            while (!generado)
            {
                for (int i = 0; i < muros.Count && !generado; i++)
                {
                    if (r.Next(1, 6) == 3)
                    {
                        salida   = new Obstaculo(muros[i].X, muros[i].Y);
                        generado = true;
                    }
                }
            }

            //Se genera la mejora de las bombas(o no, es una posibilidad)
            generado = false;
            for (int i = 0; i < muros.Count && !generado; i++)
            {
                if (r.Next(1, 51 - nivel) == 3)
                {
                    if (muros[i].X != salida.X && muros[i].Y != salida.Y)
                    {
                        mejora   = new Obstaculo(muros[i].X, muros[i].Y);
                        generado = true;
                    }
                }
            }
        }
Пример #2
0
        protected override void Update(GameTime gameTime)
        {
            KeyboardState teclado = Keyboard.GetState();

            //Pausa
            if (teclado.IsKeyDown(Keys.P) && !pulsada)
            {
                pausado = pausado ? false : true;
            }
            pulsada = teclado.IsKeyDown(Keys.P) ? true : false;

            if (pausado)
            {
                if (teclado.IsKeyDown(Keys.Escape))
                {
                    Exit();
                }
            }


            if (!pausado)
            {
                //Colocar bomba
                if (teclado.IsKeyDown(Keys.E))
                {
                    Bomba bAux = new Bomba(jugador.X - (jugador.X % 40), jugador.Y - (jugador.Y % 40), jugador.LongitudBomba);
                    //He cambiado el .Equals() para que compare solo las posiciones X e Y
                    if (!bombas.Contains(bAux))
                    {
                        bAux.SetImagen(Content.Load <Texture2D>("bomba"));
                        bombas.Add(bAux);
                    }
                }


                //Movimiento jugador
                jugador.SetImagen(Content.Load <Texture2D>("jugador1"));
                if (teclado.IsKeyDown(Keys.W))
                {
                    jugador.Y -= (int)(jugador.GetVelocidad() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                    jugador.SetImagen(Content.Load <Texture2D>("jugador1U"));
                }
                if (teclado.IsKeyDown(Keys.A))
                {
                    jugador.X -= (int)(jugador.GetVelocidad() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                    jugador.SetImagen(Content.Load <Texture2D>("jugador1L"));
                }
                if (teclado.IsKeyDown(Keys.S))
                {
                    jugador.Y += (int)(jugador.GetVelocidad() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                    jugador.SetImagen(Content.Load <Texture2D>("jugador1D"));
                }
                if (teclado.IsKeyDown(Keys.D))
                {
                    jugador.X += (int)(jugador.GetVelocidad() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                    jugador.SetImagen(Content.Load <Texture2D>("jugador1R"));
                }

                //Se mueven los enemigos
                foreach (Enemigo e in enemigos)
                {
                    e.Mover(gameTime);
                }

                //HACER FUNCIONAMIENTO DE LAS BOMBAS
                for (int i = 0; i < bombas.Count; i++)
                {
                    if ((int)(bombas[i].Contador += gameTime.ElapsedGameTime.TotalSeconds) == 2 && !bombas[i].HaExplotado())
                    {
                        bombas[i].Explotar(paredes, muros);
                        foreach (Explosion e in bombas[i].GetExplosion())
                        {
                            e.SetImagen(Content.Load <Texture2D>("explosion"));
                            //Colisiones de las explosiones con los muros para destruirlos
                            for (int j = 0; j < muros.Count; j++)
                            {
                                if (new Rectangle(muros[j].X, muros[j].Y, 40, 40).Intersects(
                                        new Rectangle(e.X, e.Y, 40, 40)))
                                {
                                    muros.RemoveAt(j);
                                }
                            }
                        }
                    }

                    if (bombas[i].GetExplosion().Count > 0)
                    {
                        foreach (Explosion e in bombas[i].GetExplosion())
                        {
                            //Colision de las bombas con los enemigos para matarlos
                            for (int j = 0; j < enemigos.Count; j++)
                            {
                                if (new Rectangle(enemigos[j].X, enemigos[j].Y, 40, 40).Intersects(
                                        new Rectangle(e.X, e.Y, 40, 40)))
                                {
                                    puntuacion += enemigos[j].GetType() == typeof(EnemigoFinal) ?
                                                  300 : 100;
                                    enemigos.RemoveAt(j);
                                }
                            }

                            if (new Rectangle(jugador.X, jugador.Y, 30, 30).Intersects(
                                    new Rectangle(e.X, e.Y, 40, 40)))
                            {
                                Exit();
                            }
                        }
                    }

                    if (bombas[i].Contador >= 4)
                    {
                        bombas.RemoveAt(i);
                    }
                }

                //Se comprueban colisiones de los enemigos
                foreach (Enemigo e in enemigos)
                {
                    if (colisiona(e.X, e.Y, 40, true))
                    {
                        e.X -= (int)(e.GetVelocidadX() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                        e.Y -= (int)(e.GetVelocidadY() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                        e.CambiarDireccion();
                    }

                    //Aquí se comprueba si pasa por al lado de un hueco y hay una probabilidad de que cambie de direccion
                    //Para que no entren en bucles
                    if (e.GetType() != typeof(Enemigo3))
                    {
                        if ((e.Y % 80 == 0 && e.GetVelocidadX() == 0 ||
                             e.X % 40 == 0 && e.X % 80 != 0 && e.GetVelocidadY() == 0) &&
                            r.Next(0, 3) == 2)
                        {
                            e.CambiarDireccion();
                        }
                    }

                    //Si el enemigo final te toca mueres
                    if (new Rectangle(e.X + 10, e.Y + 10, 30, 30).Intersects(
                            new Rectangle(jugador.X, jugador.Y, 30, 30)))
                    {
                        Thread.Sleep(1500);
                        Exit();
                    }
                }

                //Se comprueban colisiones con las paredes
                if (colisiona(jugador.X, jugador.Y, 30))
                {
                    if (teclado.IsKeyDown(Keys.W))
                    {
                        jugador.Y += (int)(jugador.GetVelocidad() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                    }
                    if (teclado.IsKeyDown(Keys.A))
                    {
                        jugador.X += (int)(jugador.GetVelocidad() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                    }
                    if (teclado.IsKeyDown(Keys.S))
                    {
                        jugador.Y -= (int)(jugador.GetVelocidad() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                    }
                    if (teclado.IsKeyDown(Keys.D))
                    {
                        jugador.X -= (int)(jugador.GetVelocidad() * (float)gameTime.ElapsedGameTime.TotalSeconds);
                    }
                }

                //Calcular segundos
                if (tiempo > 0)
                {
                    tiempo -= gameTime.ElapsedGameTime.TotalSeconds;
                }
                else if (!final)
                {
                    enemigosFinales();
                }

                //Salida de la puerta
                if (new Rectangle(salida.X + 10, salida.Y + 10, 20, 20).Intersects(
                        new Rectangle(jugador.X, jugador.Y, 30, 30)) && enemigos.Count == 0)
                {
                    puntuacion += 10000;
                    muerto      = false;
                    Exit();
                }
                //Colision con la mejora
                if (mejora != null && new Rectangle(mejora.X + 10, mejora.Y + 10, 20, 20).Intersects(
                        new Rectangle(jugador.X, jugador.Y, 30, 30)))
                {
                    mejora                 = null;
                    puntuacion            += 1000;
                    jugador.LongitudBomba += 1;
                }
            }

            base.Update(gameTime);
        }