diff --git a/assets/fondo.png b/assets/fondo.png new file mode 100644 index 0000000..813b9d1 Binary files /dev/null and b/assets/fondo.png differ diff --git a/ataques.wlk b/ataques.wlk index ae87f01..0e5bc7f 100644 --- a/ataques.wlk +++ b/ataques.wlk @@ -1,86 +1,46 @@ import proyectiles.* import general.* -class ProyectilJefe1 inherits Proyectiles { - method image() = "ataque_prueba.png" -} - -object ataquePerro1 { - method atacar() { - const proyectilPerroR1 = new ProyectilJefe1(position = new PositionMejorada(x = 0, y = 2), id = "R1") - const proyectilPerroL1 = new ProyectilJefe1(position = new PositionMejorada(x = 32, y = 3), id = "L1") +const proyectilR1 = new Proyectil(position = new PositionMejorada(x = 0, y = 2), id = "R1", velocidad = 100, delay = 300, sentido = dirDerecha) +const proyectilR2 = new Proyectil(position = new PositionMejorada(x = 0, y = 7), id = "R2", velocidad = 100, delay = 300, sentido = dirDerecha) +const proyectilL1 = new Proyectil(position = new PositionMejorada(x = 32, y = 2), id = "L1", velocidad = 100, delay = 1000, sentido = dirIzquierda) +const proyectilL2 = new Proyectil(position = new PositionMejorada(x = 32, y = 7), id = "L2", velocidad = 100, delay = 1000, sentido = dirIzquierda) - game.schedule(100, {proyectilPerroR1.direccionDerecha(100)}) - game.schedule(300, {proyectilPerroL1.direccionIzquierda(100)}) +const proyectilR3 = new Proyectil(position = new PositionMejorada(x = 0, y = 2), id = "R3", velocidad = 25, delay = 600, sentido = dirDerecha) +const proyectilR4 = new Proyectil(position = new PositionMejorada(x = 0, y = 3), id = "R4", velocidad = 200, delay = 10, sentido = dirDerecha) +const proyectilL3 = new Proyectil(position = new PositionMejorada(x = 32, y = 2), id = "L3", velocidad = 25, delay = 1200, sentido = dirIzquierda) // Estos proyectiles (pertenecientes al ataquePerro2) rompen el siguiente ataque - return 6000 - } -} +const proyectilR6 = new Proyectil(position = new PositionMejorada(x = 0, y = 2), id = "R6", velocidad = 100, delay = 300, sentido = dirDerecha) +const proyectilL4 = new Proyectil(position = new PositionMejorada(x = 32, y = 7), id = "L4", velocidad = 150, delay = 300, sentido = dirIzquierda) +const proyectilL5 = new Proyectil(position = new PositionMejorada(x = 32, y = 3), id = "L5", velocidad = 25, delay = 1000, sentido = dirIzquierda) -object ataquePerro2 { - method atacar() { - const proyectilPerroR1 = new ProyectilJefe1(position = new PositionMejorada(x = 0, y = 2), id = "R1") - const proyectilPerroL1 = new ProyectilJefe1(position = new PositionMejorada(x = 32, y = 8), id = "L1") +const proyectilR7 = new Proyectil(position = new PositionMejorada(x = 0, y = 3), id = "R7", velocidad = 150, delay = 10, sentido = dirDerecha) +const proyectilR5 = new Proyectil(position = new PositionMejorada(x = 0, y = 5), id = "R5", velocidad = 150, delay = 100, sentido = dirDerecha) +const proyectilL6 = new Proyectil(position = new PositionMejorada(x = 32, y = 4), id = "L6", velocidad = 100, delay = 10, sentido = dirIzquierda) - game.schedule(300, {proyectilPerroR1.direccionDerecha(100)}) - game.schedule(100, {proyectilPerroL1.direccionIzquierda(50)}) - return 6000 - } -} -object ataqueGato1 { +class Ataque { + const proyectiles + method atacar() { - const proyectilGatoDR1 = new ProyectilJefe1(position = new PositionMejorada(x = 0, y = 30), id = "DR1") - const proyectilGatoDL1 = new ProyectilJefe1(position = new PositionMejorada(x = 32, y = 27), id = "DL1") - - game.schedule(100, {proyectilGatoDR1.direccionDiagonalAbajoDerecha(100)}) - game.schedule(300, {proyectilGatoDL1.direccionDiagonalAbajoIzquierda(100)}) + proyectiles.forEach({proyectil => game.schedule(proyectil.delay(), {proyectil.direccion()})}) - return 6000 + return proyectiles.map({proyectil => proyectil.duracion()}).max() } } -object ataqueGato2 { - method atacar() { - const proyectilGatoDR1 = new ProyectilJefe1(position = new PositionMejorada(x = 0, y = 27), id = "DR1") - const proyectilGatoDL1 = new ProyectilJefe1(position = new PositionMejorada(x = 32, y = 32), id = "DL1") +const ataquePerro1 = new Ataque(proyectiles = [proyectilR1, proyectilR2, proyectilL1, proyectilL2]) +const ataquePerro2 = new Ataque(proyectiles = [proyectilR3, proyectilR4, proyectilL3]) +const ataquePerro3 = new Ataque(proyectiles = [proyectilR6, proyectilL4, proyectilL5]) +const ataquePerro4 = new Ataque(proyectiles = [proyectilR7, proyectilR5, proyectilL6]) - game.schedule(300, {proyectilGatoDR1.direccionDiagonalAbajoDerecha(100)}) - game.schedule(100, {proyectilGatoDL1.direccionDiagonalAbajoIzquierda(50)}) +const ataqueGato1 = new Ataque(proyectiles = []) +const ataqueGato2 = new Ataque(proyectiles = []) +const ataqueGato3 = new Ataque(proyectiles = []) +const ataqueGato4 = new Ataque(proyectiles = []) - return 6000 - } -} - -object ataqueFinal1 { - method atacar() { - const proyectilFinalDR1 = new ProyectilJefe1(position = new PositionMejorada(x = 0, y = 30), id = "DR1") - const proyectilFinalDL1 = new ProyectilJefe1(position = new PositionMejorada(x = 32, y = 27), id = "DL1") - const proyectilFinalR1 = new ProyectilJefe1(position = new PositionMejorada(x = 0, y = 2), id = "R1") - const proyectilFinalL1 = new ProyectilJefe1(position = new PositionMejorada(x = 32, y = 3), id = "L1") - - game.schedule(100, {proyectilFinalDR1.direccionDiagonalAbajoDerecha(100)}) - game.schedule(300, {proyectilFinalDL1.direccionDiagonalAbajoIzquierda(100)}) - game.schedule(100, {proyectilFinalR1.direccionDerecha(100)}) - game.schedule(300, {proyectilFinalL1.direccionIzquierda(100)}) - - return 6000 - } -} - -object ataqueFinal2 { - method atacar() { - const proyectilFinalDR1 = new ProyectilJefe1(position = new PositionMejorada(x = 0, y = 27), id = "DR1") - const proyectilFinalDL1 = new ProyectilJefe1(position = new PositionMejorada(x = 32, y = 32), id = "DL1") - const proyectilFinalR1 = new ProyectilJefe1(position = new PositionMejorada(x = 0, y = 2), id = "R1") - const proyectilFinalL1 = new ProyectilJefe1(position = new PositionMejorada(x = 32, y = 8), id = "L1") - - game.schedule(300, {proyectilFinalDR1.direccionDiagonalAbajoDerecha(100)}) - game.schedule(100, {proyectilFinalDL1.direccionDiagonalAbajoIzquierda(50)}) - game.schedule(300, {proyectilFinalR1.direccionDerecha(100)}) - game.schedule(100, {proyectilFinalL1.direccionIzquierda(50)}) - - return 6000 - } -} \ No newline at end of file +const ataqueFinal1 = new Ataque(proyectiles = []) +const ataqueFinal2 = new Ataque(proyectiles = []) +const ataqueFinal3 = new Ataque(proyectiles = []) +const ataqueFinal4 = new Ataque(proyectiles = []) \ No newline at end of file diff --git a/general.wlk b/general.wlk index 87bc62b..3651afd 100644 --- a/general.wlk +++ b/general.wlk @@ -2,11 +2,15 @@ import wollok.game.* class PositionMejorada inherits MutablePosition { method goLeftMejorado(pasos, limite) { - x = (x-pasos).max(limite) + x = (x-pasos).max(limite) } method goRightMejorado(pasos, limite) { - x = (x+pasos).min(limite) + x = (x+pasos).min(limite) + } + + method horizontalMejorado(pasos, limiteIzq, limiteDer) { + x = (x+pasos).max(limiteIzq).min(limiteDer) } method goUpMejorado(pasos, limite) { @@ -16,4 +20,8 @@ class PositionMejorada inherits MutablePosition { method goDownMejorado(pasos, limite) { y = (y-pasos).max(limite) } + + method verticalMejorado(pasos, limiteSup, limiteInf) { + y = (y+pasos).min(limiteSup).max(limiteInf) + } } \ No newline at end of file diff --git a/jefe.wlk b/jefe.wlk index f052b05..92e152b 100644 --- a/jefe.wlk +++ b/jefe.wlk @@ -6,54 +6,62 @@ import proyectiles.* import ataques.* class Jefe { - var property position - const property image - var property vida - const property ataques - var bossfight = null - - const posInicial = new PositionMejorada (x = position.x(), y = position.y()) - - method posicionPrevia() { - if(!self.derrotado()) - { - position = posInicial - game.addVisual(self) - } - } - - method posicionBatalla() { - - position = game.center() - } - - method disminuirVida(){ - vida = (vida - 1).max(0) - } - - method derrotado() = vida <= 0 - - method ataque() { - // Resto 1 para que sea un valor de la lista - const ataque = (0.randomUpTo(ataques.size())).roundUp() - 1 - - return ataques.get(ataque).atacar() - } - - method nuevaPelea() { - bossfight = new BossFight (jefe = self) - bossfight.iniciarPelea() - } - - method tocaMorcilla() { - if(!self.derrotado()) { - morcilla.iniciarPeleaMorcilla(self, 2000) - } - } + var property position + const property image + var property vida + const property ataques + var bossfight = null + + const posInicial = new PositionMejorada (x = position.x(), y = position.y()) + + method posicionPrevia() { + if(!self.derrotado()) + { + position = posInicial + game.addVisual(self) + } + } + + method posicionBatalla() { + position = game.center() + } + + method disminuirVida(){ + vida = (vida - 1).max(0) + } + + method derrotado() = vida <= 0 + + method ataque() { + if(ataques.isEmpty()) + { + return 100 + } + else + { + ataques.randomize() + + const ataqueActual = ataques.head() + ataques.drop(1) + + return ataqueActual.atacar() + } + } + + method nuevaPelea() { + bossfight = new BossFight (jefe = self) + bossfight.iniciarPelea() + } + + method tocaMorcilla() { + if(!self.derrotado()) { + morcilla.iniciarPeleaMorcilla(self, 2000) + } + } } -const jefePerro = new Jefe (position = new PositionMejorada(x=3, y=2), vida = 3, image = "celda_roja.png", ataques = [ataquePerro1, ataquePerro2]) +const jefePerro = new Jefe (position = new PositionMejorada(x=3, y=2), vida = 4, image = "perro0.png", ataques = [ataquePerro1, ataquePerro2, ataquePerro3, ataquePerro4]) -const jefeGato = new Jefe (position = new PositionMejorada(x=27, y=2), vida = 3, image = "celda_gris.png", ataques = [ataqueGato1, ataqueGato2]) +const jefeGato = new Jefe (position = new PositionMejorada(x=27, y=2), vida = 4, image = "gato0.png", ataques = [ataqueGato1, ataqueGato2, ataqueGato3, ataqueGato4]) -const jefeFinal = new Jefe (position = new PositionMejorada (x = 15, y = 15), vida = 5, image = "morcilla256.png", ataques = [ataqueFinal1, ataqueFinal2]) \ No newline at end of file +const jefeFinal = new Jefe (position = new PositionMejorada (x = 15, y = 15), vida = 5, image = "morcilla256.png", ataques = [ataqueFinal1, ataqueFinal2, ataqueFinal3, ataqueFinal4]) \ No newline at end of file diff --git a/main.wpgm b/main.wpgm index 2aa72f8..e398956 100644 --- a/main.wpgm +++ b/main.wpgm @@ -7,7 +7,7 @@ import proyectiles.* program MorcillaGame { game.title("La Bizarra Aventura de MORCILLA") - game.boardGround("stock_fondo2.jpg") + game.boardGround("fondo.png") game.height(32) game.width(33) game.cellSize(100) diff --git a/morcilla.wlk b/morcilla.wlk index 71c8f4c..e2cf171 100644 --- a/morcilla.wlk +++ b/morcilla.wlk @@ -5,17 +5,33 @@ import jefe.* object morcilla { var property position = new PositionMejorada(x=15, y=2) - var property image = "morcilla256.png" // ================================== MOVIMIENTO ================================== var saltando = false var suspendido = false var caerActivo = false var movimientoActivo = true + + const framesSalto = ["morcilla1.png", "morcilla2.png", "morcilla3.png", "morcilla4.png", "morcilla5.png", "morcilla6.png"] + var frameSaltoActual = 0 method saltando() = saltando method suspendido() = suspendido + method image() { + if(derrotado) + return "261.jpg" + else if(suspendido) + return framesSalto.get(frameSaltoActual) + else + { + if(position.x()%2 == 0) + return "morcilla0.png" + else + return "morcilla1.png" + } + } + method caminarDerecha(pasos) { if(movimientoActivo) position.goRightMejorado(pasos, 30) @@ -44,6 +60,12 @@ object morcilla { game.schedule(tiempo * 3, { position.goUp(1) }) game.schedule(tiempo * 4, { position.goUp(1) }) + game.schedule(tiempo * 1.5, { frameSaltoActual = 1 }) + game.schedule(tiempo * 3, { frameSaltoActual = 2 }) + game.schedule(tiempo * 4.5, { frameSaltoActual = 3 }) + game.schedule(tiempo * 6, { frameSaltoActual = 4 }) + game.schedule(tiempo * 7.5, { frameSaltoActual = 5 }) + game.schedule(tiempo * 5, { saltando = false }) game.schedule(tiempo * 5, { self.caer() }) } @@ -60,6 +82,7 @@ object morcilla { game.removeTickEvent("gravedad") suspendido = false caerActivo = false + frameSaltoActual = 0 } } @@ -110,9 +133,8 @@ object morcilla { game.schedule(duracion, {inmunidadActiva = false}) } - method derrota() { + method derrota() { // Terminar de hacer derrotado = true - image = "261.jpg" self.desactivarMovimiento() } @@ -137,29 +159,29 @@ object morcilla { } class VidaMorcilla { - var property image = "vidaLlena.png" + var property image = "vidaDoradaLlena.png" var property position const id method id() = id method perderVida() { - image = "vidaVacia.png" + image = "vidaDoradaVacia.png" } method tenerVida() { - image = "vidaLlena.png" + image = "vidaDoradaLlena.png" } } object administradorVidas { const vidaMaximaMorcilla = morcilla.vidas() - const vida1 = new VidaMorcilla(position = new PositionMejorada(x = 1, y = 31), id = 1) - const vida2 = new VidaMorcilla(position = new PositionMejorada(x = 3, y = 31), id = 2) - const vida3 = new VidaMorcilla(position = new PositionMejorada(x = 5, y = 31), id = 3) - const vida4 = new VidaMorcilla(position = new PositionMejorada(x = 7, y = 31), id = 4) - const vida5 = new VidaMorcilla(position = new PositionMejorada(x = 9, y = 31), id = 5) + const vida1 = new VidaMorcilla(position = new PositionMejorada(x = 1, y = 29), id = 1) + const vida2 = new VidaMorcilla(position = new PositionMejorada(x = 4, y = 29), id = 2) + const vida3 = new VidaMorcilla(position = new PositionMejorada(x = 7, y = 29), id = 3) + const vida4 = new VidaMorcilla(position = new PositionMejorada(x = 10, y = 29), id = 4) + const vida5 = new VidaMorcilla(position = new PositionMejorada(x = 12, y = 29), id = 5) const vidas = [vida1, vida2, vida3, vida4, vida5] diff --git a/proyectiles.wlk b/proyectiles.wlk index 541b611..0f3dfcd 100644 --- a/proyectiles.wlk +++ b/proyectiles.wlk @@ -1,72 +1,52 @@ import morcilla.* -class Proyectiles { +class Direccion { + const x + const y + const limiteIzq + const limiteDer + + method x() = x + method y() = y + method limiteIzq() = limiteIzq + method limiteDer() = limiteDer +} + +const dirIzquierda = new Direccion(x = -1, y = 0, limiteIzq = 0, limiteDer = 99) +const dirDerecha = new Direccion(x = 1, y = 0, limiteIzq = -1, limiteDer = 32) +const dirDiagonalIzquierda = new Direccion(x = -1, y = -1, limiteIzq = 0, limiteDer = 99) +const dirDiagonalDerecha = new Direccion(x = 1, y = -1, limiteIzq = -1, limiteDer = 32) + +class Proyectil { var property position const id + const velocidad + const delay + const sentido - method direccionIzquierda(velocidad) { - self.basicoDireccion() - game.onTick(velocidad, "proyectilIzquierda" + id, {self.movimientoIzquierda(velocidad)}) - } + method image() = "ataque_prueba.png" - method movimientoIzquierda(velocidad) { - position.goLeftMejorado(1, 0) - if(position.x() == 0) - { - game.removeVisual(self) - game.removeTickEvent("proyectilIzquieda" + id) - } - } - - method direccionDerecha(velocidad) { - self.basicoDireccion() - game.onTick(velocidad, "proyectilDerecha" + id, {self.movimientoDerecha(velocidad)}) - } + method delay() = delay - method movimientoDerecha(velocidad) { - position.goRightMejorado(1, 30) - if(position.x() == 30) - { - game.removeVisual(self) - game.removeTickEvent("proyectilDerecha" + id) - } - } + method duracion() = delay + velocidad * 34 - method direccionDiagonalAbajoDerecha(velocidad) { - self.basicoDireccion() - game.onTick(velocidad, "proyectilDiagonalAbajoDerecha" + id, {self.movimientoDiagonalAbajoDerecha(velocidad)}) - } - - method movimientoDiagonalAbajoDerecha(velocidad) { - position.goRightMejorado(1, 30) - position.goDownMejorado(1, 0) - if(position.x() == 30) - { - game.removeVisual(self) - game.removeTickEvent("proyectilDiagonalAbajoDerecha" + id) - } - } - - method direccionDiagonalAbajoIzquierda(velocidad) { - self.basicoDireccion() - game.onTick(velocidad, "proyectilDiagonalAbajoDerecha" + id, {self.movimientoDiagonalAbajoIzquierda(velocidad)}) + method direccion() { + game.addVisual(self) + game.onTick(velocidad, "proyectil" + id, {self.movimiento()}) } - method movimientoDiagonalAbajoIzquierda(velocidad) { - position.goLeftMejorado(1, 0) - position.goDownMejorado(1, 0) - if(position.x() == 0) + method movimiento() { + + position.horizontalMejorado(sentido.x(), sentido.limiteIzq(), sentido.limiteDer()) + position.verticalMejorado(sentido.y(), 99, -1) + if(position.x() == sentido.limiteIzq() || position.x() == sentido.limiteDer()) { game.removeVisual(self) - game.removeTickEvent("proyectilDiagonalAbajoIzquierda" + id) + game.removeTickEvent("proyectil" + id) } } - method basicoDireccion () { - game.addVisual(self) - } - method tocaMorcilla() { morcilla.perderVida() } -} // revisar proyectiles en diagonal \ No newline at end of file +} \ No newline at end of file