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; } } } }
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); }