Skip to content

Commit

Permalink
ahora se pueden crear y seleccionar en el menu
Browse files Browse the repository at this point in the history
niveles especificos
  • Loading branch information
NahuelMarek committed Nov 19, 2024
1 parent 1894ab2 commit e52aa2e
Show file tree
Hide file tree
Showing 6 changed files with 192 additions and 11 deletions.
8 changes: 4 additions & 4 deletions administradorDeEnemigos.wlk
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ object administradorDeEnemigos {
// Propiedades
var nombreEnemigo = 10000
var enemigos = #{}

var property administradorUtilizado=administradorDeOleadas
// Métodos de Consulta
method enemigos() = enemigos
method columnaOcupada() = enemigos.filter({ enemigo => enemigo.position().x() == 14 }).size() == 5 // Verifica si la columna de posición x=14 está ocupada por 5 enemigos
method nombre() = nombreEnemigo
method pocosEnemigosEnPantalla() = administradorDeOleadas.enemigosVivos() < maxEnemigosEnPantalla
method pocosEnemigosEnPantalla() = administradorUtilizado.enemigosVivos() < maxEnemigosEnPantalla

// Genera un nuevo nombre para los enemigos
method sumarEnemigo() { nombreEnemigo += 1 }
Expand All @@ -35,7 +35,7 @@ object administradorDeEnemigos {
enemigos.add(nombreParaEnemigo) /* Añade el nuevo enemigo a la colección de enemigos activos */

self.sumarEnemigo() /* Incrementa el contador de enemigos en el administrador */
administradorDeOleadas.sumarEnemigo() /* Notifica al administrador de oleadas */
administradorUtilizado.sumarEnemigo() /* Notifica al administrador de oleadas */

return game.addVisual(nombreParaEnemigo) /* Muestra al enemigo en el juego */
} else {
Expand All @@ -46,7 +46,7 @@ object administradorDeEnemigos {

// Elimina un enemigo específico de la colección de enemigos activos
method eliminarEnemigo(enemigo) {
administradorDeOleadas.reducirEnemigo()
administradorUtilizado.reducirEnemigo()
enemigos.remove(enemigo)
}

Expand Down
86 changes: 79 additions & 7 deletions administradorDeJuego.wlk
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import magos.*
import administradorDeOleadas.*
import adminProyectiles.*
import administradorDeMagos.*
Expand All @@ -10,6 +11,8 @@ import puntaje.*
import pala.*
import casa.casa
import proyectil.*
import administradorDeNiveles.*

// =======================================
// Administrador de Juego: Control central del juego, reseteo y fin del juego
// =======================================
Expand Down Expand Up @@ -169,7 +172,7 @@ object configuracion {
game.addVisual(cursor)
game.addVisual(menu)
game.addVisual(puntaje)
game.addVisual(administradorDeOleadas)

game.addVisual(casa)
menu.accion()
cursor.accion()
Expand Down Expand Up @@ -206,7 +209,7 @@ object configuracion {

// Método para programar eventos de actualización periódicos (ticks)
method crearTicks() {
game.schedule(4000, { administradorDeOleadas.iniciarOleada() }) // Inicia la primera oleada tras 4 segundos
//game.schedule(4000, { administradorDeOleadas.iniciarOleada() }) // Inicia la primera oleada tras 4 segundos
self.iniciarTicks()
}

Expand Down Expand Up @@ -242,20 +245,22 @@ object configuracion {


object menuInicial{
var imagen="MenuInicial.png"
var property imagen="MenuInicial.png"
method position()=new MutablePosition(x=0,y=0)
method image() = imagen
var botonSeleccionado = 0
var property botones=[botonDeInicio,botonMutearMusica]
var property botones=[botonDeInicio,botonNiveles,botonMutearMusica]
method iniciarMenu(){
botonSeleccionado=0
botones.forEach({boton=>game.addVisual(boton)})

}
method finalizarMenu(){
botones.forEach({boton=>game.removeVisual(boton)})
self.quitarBotones()
administradorDeJuego.usuarioEnMenu(false)
game.removeVisual(self)
}
method quitarBotones(){botones.forEach({boton=>game.removeVisual(boton)})}
method moverseEntreBotones(){
keyboard.right().onPressDo({ if(administradorDeJuego.usuarioEnMenu() && botonSeleccionado<botones.size()-1)
{ self.deseleccionarBoton()
Expand Down Expand Up @@ -283,10 +288,13 @@ object menuInicial{
object botonDeInicio{
var imagen="botonInicioSeleccionado.png"
method image()=imagen
method position()= new MutablePosition(x=4,y=1)
method position()= new MutablePosition(x=2,y=1)
method accion(){
configuracion.agregarVisuals()
configuracion.crearTicks()
configuracion.iniciarTicks()
administradorDeEnemigos.administradorUtilizado(administradorDeOleadas)
game.schedule(4000, { administradorDeOleadas.iniciarOleada() })
game.addVisual(administradorDeOleadas)
menuInicial.finalizarMenu()
}

Expand All @@ -305,6 +313,32 @@ object botonDeInicio{

}

object botonNiveles{
var imagen="botonNiveles.png"
method image()=imagen
method position()= new MutablePosition(x=7,y=1)
const property niveles=[botonNivel1, botonNivel2]
method accion(){
menuInicial.quitarBotones()
menuInicial.imagen("MenuInicialVacio.png")
menuInicial.botones(niveles)
menuInicial.iniciarMenu()
}

method cambiarEstadoDeSeleccion(estado){
if(estado){
self.ponerMarcoDeSeleccion()
}
else{self.quitarMarcoDeSeleccion()}
}
method ponerMarcoDeSeleccion(){
imagen="botonNivelesSeleccionado.png"
}
method quitarMarcoDeSeleccion(){
imagen="botonNiveles.png"
}
}

object botonMutearMusica{
var imagen="botonMuteo.png"
method image()=imagen
Expand Down Expand Up @@ -344,3 +378,41 @@ object botonMutearMusica{
}

}

class BotonDeNivel{
const imagenSinSeleccionar
const imagenDeSeleccion
var property imagen=imagenSinSeleccionar
const numNivel
const property nivel
method image()=imagen
const posicion
method position()=posicion
method accion(){
configuracion.agregarVisuals()
configuracion.crearTicks()
administradorDeNiveles.numNivel(numNivel)
administradorDeEnemigos.administradorUtilizado(administradorDeNiveles)
game.schedule(4000, { administradorDeNiveles.iniciarOleada() })
game.addVisual(administradorDeNiveles)
menuInicial.finalizarMenu()
}

method cambiarEstadoDeSeleccion(estado){
if(estado){
self.ponerMarcoDeSeleccion()
}
else{self.quitarMarcoDeSeleccion()}
}
method ponerMarcoDeSeleccion(){
imagen=imagenDeSeleccion
}
method quitarMarcoDeSeleccion(){
imagen=imagenSinSeleccionar
}
}

const botonNivel1= new BotonDeNivel(imagenSinSeleccionar="botonNivel1.png", imagenDeSeleccion="botonNivel1Seleccionado.png",
posicion= new MutablePosition(x=0,y=5), numNivel=1,nivel=nivel1)
const botonNivel2= new BotonDeNivel(imagenSinSeleccionar="botonNivel2.png", imagenDeSeleccion="botonNivel2Seleccionado.png",
posicion= new MutablePosition(x=1,y=5), numNivel=2,nivel=nivel2)
109 changes: 109 additions & 0 deletions administradorDeNiveles.wlk
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import slime.*
import wollok.game.*
import administradorDeEnemigos.*
import administradorDeJuego.*


// ===============================
// Administrador de Oleadas: Control de las oleadas de enemigos
// ===============================
object administradorDeNiveles {
const niveles = botonNiveles.niveles()
var property numNivel = 1
method nivel() = niveles.get(numNivel-1).nivel()

// Métodos de visualización y sonido
method position() = new MutablePosition(x = 9, y = 5)
method text() = "Nivel: " + numNivel.toString() + " " + "Slimes Restantes: " + self.nivel().enemigosRestantes().toString()
method textColor() = "#FA0770"
method enemigosVivos() = self.nivel().enemigosVivos()

// Inicia la oleada y gestiona enemigos
method iniciarOleada() {
self.nivel().iniciarOleada()
game.onTick(
self.nivel().tiempoSpawn(),
"gestionar oleada",
{
if (not administradorDeJuego.pausado()){
if (self.nivel().ejecutando()) {
administradorDeEnemigos.generarEnemigo(self.nivel().enemigos().anyOne())
} else if(self.nivel().finalizo()){
self.siguienteOleada()
game.removeTickEvent("gestionar oleada")

}
}
}
)
}

// Pasa a la siguiente oleada
method siguienteOleada() {
// por ahora funciona , si intento mejorar la logica se rompe

self.nivel().terminarOleada()
if (numNivel == niveles.size()){
pantalla.estado(victoria) game.addVisual(pantalla)
return}
else {numNivel += 1 game.schedule(10000, { self.iniciarOleada() })}
}

// Gestión de contadores de enemigos
method reducirEnemigo() { self.nivel().seMurioEnemigo()}
method sumarEnemigo() { self.nivel().seGeneroEnemigo()}


// Resetea el administrador de oleadas
method reset() {
game.removeTickEvent("gestionar oleada")
niveles.forEach({nivelAResetear=>nivelAResetear.reset()})
numNivel = 1
}
method recibeDanioMago(danio){}
method frenarEnemigo()= true
}

class Nivel {
const property enemigos
var property cantidadEnemigos
const property tiempoSpawn
var property enemigosRestantes = cantidadEnemigos
var property enemigosGenerados = 0

method inicioOleada() = game.sound("m.iOleada.mp3")
method finOleada() = game.sound("m.fOleada.mp3")

method enemigosVivos() = enemigosGenerados - (cantidadEnemigos - enemigosRestantes)
// Verifica si la oleada está en ejecución
method ejecutando() = cantidadEnemigos > enemigosGenerados && enemigosRestantes > 0

// Verifica si la oleada ha finalizado
method finalizo() = enemigosRestantes == 0 && enemigosGenerados == cantidadEnemigos

method seGeneroEnemigo() {enemigosGenerados+=1}

method seMurioEnemigo() {enemigosRestantes-=1}

// Termina la oleada y configura la siguiente
method terminarOleada() {
self.finOleada().volume(0.1)
self.finOleada().play()
}

method iniciarOleada(){
self.inicioOleada().volume(0)
//self.inicioOleada().play()
enemigosRestantes = cantidadEnemigos
}


// Resetea la oleada a su configuración inicial
method reset() {
enemigosRestantes = cantidadEnemigos
enemigosGenerados = 0
}
}

const nivel1= new Nivel(enemigos=[slimeBasico],cantidadEnemigos=5,tiempoSpawn=4000)
const nivel2= new Nivel(enemigos=[slimeGuerrero,slimeGuerrero,slimeBasico],cantidadEnemigos=10,tiempoSpawn=4000)
Binary file added assets/MenuInicialVacio.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/botonNiveles.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/botonNivelesSeleccionado.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit e52aa2e

Please sign in to comment.