diff --git a/ProximosPasos.md b/ProximosPasos.md index b8be20f..3bef964 100644 --- a/ProximosPasos.md +++ b/ProximosPasos.md @@ -1,17 +1,15 @@ -- [X] Cambiar background por una mejor cancha. -- [X] Agregar más consumibles (objetos distintos). -- [X] Agregar la pelota. -- [X] MODELAR COLISION BASICA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -- [ ] Modelar interacción con la pelota (que la patee en una direccion). -- [ ] Revisar colisión con consumibles (que el consumible desaparezca (y cómo vuelve a aparecer otro?)). -- [ ] Modelar colisión con jugador rival? (que lo empuje). -- [ ] Definir bordes de la cancha. -- [X] Agregar sonido de ambiente. -- [ ] Agregar sonidos de colisiones. -- [ ] Modelar mecánica de goles............y de fin de partida. -- [ ] Agregar menú? -- [X] Agregar ¿tarjetas? para afectar al otro jugador (tarjeta roja lo deja quieto por ej.). -- DELEGAR Y MODULARIZAR CON OBJETOS Y METODOS, ELIMINAR ALGORITMIA PROCEDURAL DE C. -- EN COLISION, NO PREGUNTAR SI CHOCA CON BANANA. USAR MENSAJES: CUANDO ALGO CHOCA CON UNA BANANA, MANDARLE UN MENSAJE - A ESE ALGO (MOVETE). -- SOBRE EL REMOVE VISUAL: EL OBJETO SIGUE ESTANDO PORQUE ESTÁ LA REFERENCIA (CONSTANTE). HAY QUE MODIFICAR ESO. \ No newline at end of file +- [X] Arreglar mecánica para llevar la pelota. +- [X] Agregar mecánica para patear la pelota en una dirección. +- [ ] Agregar mecánica para colisiones con borde de la cancha. +- [ ] Agregar sonidos colisiones. +- [ ] Agregar mecánica de goles: sonido, contador y reinicio posiciones. +- [ ] Agregar mecánica para fin de partida: que imprima un cartelito y envíe al menú principal. +- [ ] Agregar menú principal. +- [ ] Agregar banana maestra que invoque un montón de bananas. + +Observaciones +- Tal vez la evaluacion de si alguien está cerca de algo podría delegarse en el programa en vez de tenerla en 800 ifs. +- El mute del sonido funciona una sola vez. +- Los cuadros de diálogo no siempre se muestran (?). +- EL ONTICK AL AGARRAR UN CONSUMIBLE SE COMPARTE: DEL TOTAL SIEMPRE QUEDA UNO SOLO. + diff --git a/assets/comida.png b/assets/comida.png new file mode 100644 index 0000000..0861e36 Binary files /dev/null and b/assets/comida.png differ diff --git a/assets/cornerFlag.png b/assets/cornerFlag.png new file mode 100644 index 0000000..6f7f650 Binary files /dev/null and b/assets/cornerFlag.png differ diff --git a/assets/food.png b/assets/food.png deleted file mode 100644 index 78a4ed5..0000000 Binary files a/assets/food.png and /dev/null differ diff --git a/main.wpgm b/main.wpgm index f75d8ee..a4d85e3 100644 --- a/main.wpgm +++ b/main.wpgm @@ -9,11 +9,10 @@ program FulbotGame { game.cellSize(10) // tenemos celdas de 10x10 pixeles. // SONIDO DE FONDO - const sonidoAmbiente = game.sound("sonidoAmbiente.mp3") sonidoAmbiente.shouldLoop(true) - game.schedule(500, {sonidoAmbiente.play()}) - + sonidoAmbiente.play() + var sonidoAmbienteIsOn = true keyboard.m().onPressDo({ if (sonidoAmbienteIsOn) { @@ -24,262 +23,119 @@ program FulbotGame { sonidoAmbienteIsOn = true } }) - //keyboard.m().onPressDo({sonidoAmbiente.volume(0)}) - -// TECLAS DE MOVIMIENTO +// TECLAS DE ACCIÓN keyboard.w().onPressDo({ jugador1.moverseArriba(5) }) keyboard.a().onPressDo({ jugador1.moverseIzquierda(5) }) keyboard.s().onPressDo({ jugador1.moverseAbajo(5) }) keyboard.d().onPressDo({ jugador1.moverseDerecha(5) }) + keyboard.space().onPressDo({ jugador1.patearPelota(pelota) }) keyboard.up().onPressDo({ jugador2.moverseArriba(5) }) keyboard.left().onPressDo({ jugador2.moverseIzquierda(5) }) keyboard.down().onPressDo({ jugador2.moverseAbajo(5) }) keyboard.right().onPressDo({ jugador2.moverseDerecha(5) }) + keyboard.enter().onPressDo({ jugador2.patearPelota(pelota) }) // OBJETOS Y REFERENCIAS + // Coordenadas esquinas + const xBordeIzq = 11 + const xBordeDer = 209 + const yBordeInf = 1 + const yBordeSup = 97 + + // Corner flags + const bandera1 = new Item (image = "cornerFlag.png", position = game.at(xBordeIzq, yBordeInf)) + const bandera2 = new Item (image = "cornerFlag.png", position = game.at(xBordeIzq, yBordeSup)) + const bandera3 = new Item (image = "cornerFlag.png", position = game.at(xBordeDer, yBordeInf)) + const bandera4 = new Item (image = "cornerFlag.png", position = game.at(xBordeDer, yBordeSup)) + + // Coordenadas arcos + const xLineaArco1 = 10 + const xLineaArco2 = 208 + const yInfAmbosArcos = 42 + const ySupAmbosArcos = 56 + + // Coordenadas jugadores + const xiJugador1 = 97 + const xiJugador2 = 120 + const yiAmbosJugadores = 50 // Jugadores - const jugador1 = new Jugador( cansancio = 0, imagen = "argentino.png", position = new MutablePosition(x=122, y=50)) - const jugador2 = new Jugador( cansancio = 0, imagen = "brasilero.png", position = new MutablePosition(x=95, y=50)) - - // Items - const pelota = new Item( imagen = "pelota.png", position = game.at(110, 50), frase = "") - const bananaPeel1 = new CascaraBanana( imagen = "bananaPeel.png", frase = "Noooooooo") - const bananaPeel2 = new CascaraBanana( imagen = "bananaPeel.png", frase = "Noooooooo") - const bananaPeel3 = new CascaraBanana( imagen = "bananaPeel.png", frase = "Noooooooo") - const cono1 = new Item( imagen = "cono.png", position = game.at(10, 56), frase = "") - const cono2 = new Item( imagen = "cono.png", position = game.at(10, 42), frase = "") - const cono3 = new Item( imagen = "cono.png", position = game.at(208, 56), frase = "") - const cono4 = new Item( imagen = "cono.png", position = game.at(208, 42), frase = "") - - - // Tarjetas - const tarjetaAmarilla = new Tarjetas( imagen = "yellowCard.png", frase = "Toma amarilla", cantidad = 20) - const tarjetaRoja = new Tarjetas( imagen = "redCard.png", frase = "Toma roja", cantidad = 100) - - // Consumibles - const gaseosa1 = new Consumible( energia = 30, imagen = "coke2.png", frase = "rica gaseosa") - const gaseosa2 = new Consumible( energia = 30, imagen = "coke2.png", frase = "rica gaseosa") - const comida = new Consumible( energia = 80, imagen = "food.png", frase = "Gracias por la comida") - const banana1 = new Consumible( energia = 40, imagen = "bananas.png", frase = "Gracias por la fruta") - const banana2 = new Consumible( energia = 40, imagen = "bananas.png", frase = "Gracias por la fruta") - const agua1 = new Consumible( energia = 20, imagen = "agua.png", frase = "Rica agua!") - const agua2 = new Consumible( energia = 20, imagen = "agua.png", frase = "Rica agua!") - - // Arcos - const arco1X = 208 // Coordenada x de la portería 1 (izquierda) - const arco1Y = 50 // Coordenada y de la portería 1 - const arco1Ancho = 5 // Ancho de la portería 1 - const arco1Alto = 10 // Alto de la portería 1 - - const arco2X = 10 // Coordenada x de la portería 2 (derecha) - const arco2Y = 50 // Coordenada y de la portería 2 - const arco2Ancho = 5 // Ancho de la portería 2 - const arco2Alto = 10 // Alto de la portería 2 - - // Marcadores de goles + const jugador1 = new Jugador (image = "argentino.png", position = new MutablePosition(x=xiJugador1, y=yiAmbosJugadores)) + const jugador2 = new Jugador (image = "brasilero.png", position = new MutablePosition(x=xiJugador2, y=yiAmbosJugadores)) + + // Consumibles y Tarjetas + const agua1 = new Agua() const agua2 = new Agua() const agua3 = new Agua() const agua4 = new Agua() + const gaseosa1 = new Gaseosa() const gaseosa2 = new Gaseosa() + const comida = new Comida() + const banana1 = new Banana() const banana2 = new Banana() + const bananaPeel1 = new BananaPeelDer() const bananaPeel2 = new BananaPeelIzq() + const amarilla1 = new TarjetaAmarilla() const amarilla2 = new TarjetaAmarilla() + const roja = new TarjetaRoja() + + const consumibles = [agua1, agua2, agua3, agua4, gaseosa1, gaseosa2, comida, banana1, banana2, bananaPeel1, bananaPeel2] + const tarjetas = [amarilla1, amarilla2, roja] + + // Otros + const pelota = new Item (image = "pelota.png", position = game.at(110, 50)) var golesJugador1 = 0 - var golesJugador2 = 0 // Comprobar si la pelota entra en el arco del jugador 1 - const proximidad = 5 - - // EVENTOS PROGRAMADOS - - game.schedule(100, { - game.addVisual(jugador1) - game.addVisual(jugador2) - game.addVisual(pelota) - game.addVisual(bananaPeel1) - game.addVisual(bananaPeel2) - game.addVisual(bananaPeel3) - game.addVisual(tarjetaAmarilla) - game.addVisual(tarjetaRoja) - game.addVisual(gaseosa1) - game.addVisual(gaseosa2) - game.addVisual(comida) - game.addVisual(banana1) - game.addVisual(banana2) - game.addVisual(agua1) - game.addVisual(agua2) - game.say(jugador1, jugador1.decir("Muchaaaaachoooooos")) - game.say(jugador2, jugador2.decir("Eu nao falo portugues")) - }) + var golesJugador2 = 0 + + // VISUALS + game.addVisual(jugador1) game.addVisual(jugador2) + game.addVisual(pelota) + game.addVisual(bandera1) game.addVisual(bandera2) game.addVisual(bandera3) game.addVisual(bandera4) + game.addVisual(agua1) game.addVisual(agua2) game.addVisual(agua3) game.addVisual(agua4) + game.addVisual(gaseosa1) game.addVisual(gaseosa2) + game.addVisual(comida) + game.addVisual(banana1) game.addVisual(banana2) + game.addVisual(bananaPeel1) game.addVisual(bananaPeel2) + game.addVisual(amarilla1) game.addVisual(amarilla2) + game.addVisual(roja) + game.say(jugador1, "Muchaaaaachoooooos") + game.say(jugador2, "Eu nao falo portugues...") + +// EVENTOS DE INICIO + game.schedule (1000, { agua1.moverseAlAzar() agua2.moverseAlAzar() }) + game.schedule (2000, { agua3.moverseAlAzar() agua4.moverseAlAzar() }) + game.schedule (3000, { banana1.moverseAlAzar() bananaPeel1.moverseAlAzar() }) + game.schedule (4000, { gaseosa1.moverseAlAzar() gaseosa2.moverseAlAzar()}) + game.schedule (6000, { banana2.moverseAlAzar() bananaPeel2.moverseAlAzar() }) + game.schedule (8000, { comida.moverseAlAzar() }) + game.schedule (10000, { amarilla1.moverseAlAzar() amarilla2.moverseAlAzar() }) + game.schedule (20000, { roja.moverseAlAzar() }) // EVENTOS AUTOMATICOS - - game.onTick(1000, "recupera energia", { jugador1.recuperarEnergia(20) }) - game.onTick(1000, "recupera energia", { jugador2.recuperarEnergia(20) }) - game.onTick(2000, "se mueve", { tarjetaRoja.moverseAlAzar() }) - game.onTick(5000, "se mueve", { tarjetaAmarilla.moverseAlAzar() }) - //game.onTick(8000, "se mueve", { bananaPeel1.moverseAlAzar() }) - //game.onTick(8000, "se mueve", { bananaPeel2.moverseAlAzar() }) - //game.onTick(8000, "se mueve", { bananaPeel3.moverseAlAzar() }) - game.onTick(5000, "se mueve", { comida.moverseAlAzar() }) - game.onTick(5000, "se mueve", { banana1.moverseAlAzar() }) - game.onTick(5000, "se mueve", { banana2.moverseAlAzar() }) - game.onTick(8000, "se mueve", { gaseosa1.moverseAlAzar() }) - game.onTick(8000, "se mueve", { gaseosa2.moverseAlAzar() }) - game.onTick(10000, "se mueve", { agua1.moverseAlAzar() }) - game.onTick(10000, "se mueve", { agua2.moverseAlAzar() }) - -// COLISIONES - /* - game.whenCollideDo(jugador2, { - game.say(jugador2,jugador2.decir("Me choque con algo!!")) + game.onTick (1000, "jugador1 recupera energia", { jugador1.ganarEnergia(10) }) + game.onTick (1000, "jugador2 recupera energia", { jugador2.ganarEnergia(10) }) + game.onTick (100, "chequeo de colisiones", { + [jugador1, jugador2].forEach({ jugador => + jugador.agarrarConsumible (consumibles) + jugador.llevarPelota (pelota) + }) + jugador1.agarrarTarjeta (tarjetas, jugador2) + jugador2.agarrarTarjeta (tarjetas, jugador1) }) - */ - - /*game.onTick(100, "chequeo de colisiones", { - // CON CONSUMIBLES /* - if ((jugador1.position().x() - gaseosa1.position().x()).abs() < 5 and - (jugador1.position().y() - gaseosa1.position().y()).abs() < 5) { - jugador1.consumir(gaseosa1) - game.say(jugador1, jugador1.decir("Rica gaseosa!")) - game.removeVisual(gaseosa1) - } - if ((jugador1.position().x() - gaseosa2.position().x()).abs() < 5 and - (jugador1.position().y() - gaseosa2.position().y()).abs() < 5) { - jugador1.consumir(gaseosa2) - game.say(jugador1, jugador1.decir("Rica gaseosa!")) - game.removeVisual(gaseosa2) - } - if ((jugador1.position().x() - agua1.position().x()).abs() < 5 and - (jugador1.position().y() - agua1.position().y()).abs() < 5) { - jugador1.consumir(agua1) - game.say(jugador1, jugador1.decir("Rica agua!")) - game.removeVisual(agua1) - } - if ((jugador1.position().x() - agua2.position().x()).abs() < 5 and - (jugador1.position().y() - agua2.position().y()).abs() < 5) { - jugador1.consumir(agua2) - game.say(jugador1, jugador1.decir("Rica agua!")) - game.removeVisual(agua2) - } - if ((jugador1.position().x() - banana1.position().x()).abs() < 5 and - (jugador1.position().y() - banana1.position().y()).abs() < 5) { - jugador1.consumir(banana1) - game.say(jugador1, jugador1.decir("Gracias por la fruta")) - game.removeVisual(banana1) - } - if ((jugador1.position().x() - banana2.position().x()).abs() < 5 and - (jugador1.position().y() - banana2.position().y()).abs() < 5) { - jugador1.consumir(banana2) - game.say(jugador1, jugador1.decir("Gracias por la fruta")) - game.removeVisual(banana2) - } - if ((jugador1.position().x() - comida.position().x()).abs() < 5 and - (jugador1.position().y() - comida.position().y()).abs() < 5) { - jugador1.consumir(comida) - game.say(jugador1, jugador1.decir("Gracias por la comida")) - game.removeVisual(comida) - } - if ((jugador1.position().x() - bananaPeel1.position().x()).abs() < 5 and - (jugador1.position().y() - bananaPeel1.position().y()).abs() < 5) { - jugador1.moverseArriba(5) - jugador1.moverseDerecha(10) - game.say(jugador1, jugador1.decir("Noooooooo")) - //bananaPeel1.moverse(0,0) - game.removeVisual(bananaPeel1) - } - if ((jugador1.position().x() - bananaPeel2.position().x()).abs() < 5 and - (jugador1.position().y() - bananaPeel2.position().y()).abs() < 5) { - jugador1.moverseArriba(5) - jugador1.moverseDerecha(10) - game.say(jugador1, jugador1.decir("Noooooooo")) - //bananaPeel2.moverse(0,0) - game.removeVisual(bananaPeel2) - } - if ((jugador1.position().x() - bananaPeel3.position().x()).abs() < 5 and - (jugador1.position().y() - bananaPeel3.position().y()).abs() < 5) { - jugador1.moverseArriba(5) - jugador1.moverseDerecha(10) - game.say(jugador1, jugador1.decir("Noooooooo")) - //bananaPeel3.moverse(0,0) - game.removeVisual(bananaPeel3) - } - if ((jugador1.position().x() - cerveza.position().x()).abs() < 5 and - (jugador1.position().y() - cerveza.position().y()).abs() < 5) { - jugador1.decir("ESTOY MAREADO") - game.schedule(10000, jugador1.efectoAlReves(jugador1)) - game.removeVisual(cerveza) - jugador1.decir("NO TOMO MAS") - keyboard.w().onPressDo({ jugador1.moverseArriba(5) }) - keyboard.a().onPressDo({ jugador1.moverseIzquierda(5) }) - keyboard.s().onPressDo({ jugador1.moverseAbajo(5) }) - keyboard.d().onPressDo({ jugador1.moverseDerecha(5) }) - } - - // CON TARJETAS - if ((jugador1.position().x() - tarjetaAmarilla.position().x()).abs() < 5 and - (jugador1.position().y() - tarjetaAmarilla.position().y()).abs() < 5) { - tarjetaAmarilla.aplicar(jugador2) - game.say(jugador1, jugador1.decir("Toma amarilla")) - game.removeVisual(tarjetaAmarilla) - } - if ((jugador1.position().x() - tarjetaRoja.position().x()).abs() < 5 and - (jugador1.position().y() - tarjetaRoja.position().y()).abs() < 5) { - tarjetaRoja.aplicar(jugador2) - game.say(jugador1, jugador1.decir("Toma roja")) - game.removeVisual(tarjetaRoja) - } - if ((jugador2.position().x() - tarjetaAmarilla.position().x()).abs() < 5 and - (jugador2.position().y() - tarjetaAmarilla.position().y()).abs() < 5) { - tarjetaAmarilla.aplicar(jugador1) - game.say(jugador2, jugador2.decir("Amarelo para voce")) - game.removeVisual(tarjetaAmarilla) - } - if ((jugador2.position().x() - tarjetaRoja.position().x()).abs() < 5 and - (jugador2.position().y() - tarjetaRoja.position().y()).abs() < 5) { - tarjetaRoja.aplicar(jugador1) - game.say(jugador2, jugador2.decir("Vermelho para voce")) - game.removeVisual(tarjetaRoja) - } - - // CON PELOTA: DRIBBLING - if ((jugador1.position().x() - pelota.position().x()).abs() < proximidad && - (jugador1.position().y() - pelota.position().y()).abs() < proximidad) { - // Empuja la pelota en la dirección de movimiento del jugador - if (jugador1.position().x() < pelota.position().x()) { - pelota.moverse(pelota.position().x() + 5, pelota.position().y()) - } else if (jugador1.position().x() > pelota.position().x()) { - pelota.moverse(pelota.position().x() - 5, pelota.position().y()) - } - if (jugador1.position().y() < pelota.position().y()) { - pelota.moverse(pelota.position().x(), pelota.position().y() + 5) - } else if (jugador1.position().y() > pelota.position().y()) { - pelota.moverse(pelota.position().x(), pelota.position().y() - 5) - } - } - if ((jugador2.position().x() - pelota.position().x()).abs() < proximidad && - (jugador2.position().y() - pelota.position().y()).abs() < proximidad) { - // Empuja la pelota en la dirección de movimiento del jugador - if (jugador2.position().x() < pelota.position().x()) { - pelota.moverse(pelota.position().x() + 5, pelota.position().y()) - } else if (jugador2.position().x() > pelota.position().x()) { - pelota.moverse(pelota.position().x() - 5, pelota.position().y()) - } - if (jugador2.position().y() < pelota.position().y()) { - pelota.moverse(pelota.position().x(), pelota.position().y() + 5) - } else if (jugador2.position().y() > pelota.position().y()) { - pelota.moverse(pelota.position().x(), pelota.position().y() - 5) - } - } - / CON PELOTA: GOLES if (pelota.position().x() >= arco1X && pelota.position().x() <= (arco1X + arco1Ancho) && pelota.position().y() >= arco1Y && pelota.position().y() <= (arco1Y + arco1Alto)) { golesJugador2 += 1 game.say(jugador2, "¡Gol para el Jugador 2! Total: " + golesJugador2) - pelota.moverse(110, 50) // Reiniciar la posición de la pelota + // Reiniciamos posiciones + pelota.moverse(110, 50) + jugador1.moverse(xiJugador1, yiAmbosJugadores) + jugador2.moverse(xiJugador2, yiAmbosJugadores) } if (pelota.position().x() >= arco2X && pelota.position().x() <= (arco2X + arco2Ancho) && pelota.position().y() >= arco2Y && pelota.position().y() <= (arco2Y + arco2Alto)) { golesJugador1 += 1 game.say(jugador1, "¡Gol para el Jugador 1! Total: " + golesJugador1) - pelota.moverse(110, 50) // Reiniciar la posición de la pelota + // Reiniciamos posiciones + pelota.moverse(110, 50) + jugador1.moverse(xiJugador1, yiAmbosJugadores) + jugador2.moverse(xiJugador2, yiAmbosJugadores) } - })*/ - + */ game.start() } diff --git a/objects.wlk b/objects.wlk index 309bf87..3f2d27e 100644 --- a/objects.wlk +++ b/objects.wlk @@ -1,169 +1,251 @@ class Jugador { - var goles = 0 - const imagen - const position = game.center() - var cansancio = 0 - - method image() = imagen - method position() = position - method cansancio() = cansancio - method goles() = goles - method consumir(consumible) { - cansancio = 0.max(cansancio - consumible.energia()) + const property image + var property x = 105 + var property y = 50 + var property position = game.at(x, y) + var property ultimaDireccion = "ninguna" + var property energia = 100 + var property potencia = 0 + const rangoProximidad = 4 + + method ganarPotencia(input) { + potencia = 30.min(potencia + input) } - - method efectoAlReves(jugador) { - keyboard.s().onPressDo({ jugador.moverseArriba(5) }) - keyboard.d().onPressDo({ jugador.moverseIzquierda(5) }) - keyboard.w().onPressDo({ jugador.moverseAbajo(5) }) - keyboard.a().onPressDo({ jugador.moverseDerecha(5) }) + method perderPotencia(input) { + potencia = 0.max(potencia - input) } - - method recuperarEnergia(energia) { - cansancio = 0.max(cansancio - energia)cansancio = 0.max(cansancio - energia) + method ganarEnergia(input) { + energia = 100.min(energia + input) } - - method cansarse(pos) { - cansancio += pos + method perderEnergia(input) { + energia = 0.max(energia - input) } - - method moverseArriba(pos) { - if (pos-(cansancio/100) <= 0){position.goUp(0)} - else { - self.cansarse(pos) - position.goUp(pos-(cansancio/100)) - } + method ajustarPorEnergia(cantidad) { + if (energia >= 80) return cantidad + else if (energia >= 60) return 0.8* cantidad + else if (energia >= 40) return 0.6* cantidad + else if (energia >= 20) return 0.4* cantidad + else if (energia > 0) return 0.2* cantidad + else return 0 } - - method moverseAbajo(pos) { - if (pos-(cansancio/100) <= 0){position.goDown(0)} - else { - self.cansarse(pos) - position.goDown(pos-(cansancio/100)) - } + method moverseArriba(cantCeldas) { + position.goUp(self.ajustarPorEnergia(cantCeldas)) + self.perderEnergia(2) + ultimaDireccion = "arriba" } - - method moverseDerecha(pos) { - if (pos-(cansancio/100) <= 0){position.goRight(0)} - else { - self.cansarse(pos) - position.goRight(pos-(cansancio/100)) - } + method moverseAbajo(cantCeldas) { + position.goDown(self.ajustarPorEnergia(cantCeldas)) + self.perderEnergia(2) + ultimaDireccion = "abajo" } - - method moverseIzquierda(pos) { - if (pos-(cansancio/100) <= 0){position.goLeft(0)} - else { - self.cansarse(pos) - position.goLeft(pos-(cansancio/100)) - } + method moverseDerecha(cantCeldas) { + position.goRight(self.ajustarPorEnergia(cantCeldas)) + self.perderEnergia(2) + ultimaDireccion = "derecha" } - - method decir(texto) = texto - - method colision(item,jugador, numero) = - (jugador.position().x() - item.position().x()).abs() < numero and - (jugador.position().y() - item.position().y()).abs() < numero - - method efectoColision(jugador,item) { - if (jugador.colision(item,jugador,5)) { - jugador.aplicar(item) - game.say(jugador, jugador.decir(item.frase())) - game.removeVisual(item) + method moverseIzquierda(cantCeldas) { + position.goLeft(self.ajustarPorEnergia(cantCeldas)) + self.perderEnergia(2) + ultimaDireccion = "izquierda" + } + method seMueveDerecha() = ultimaDireccion == "derecha" + method seMueveIzquierda() = ultimaDireccion == "izquierda" + method seMueveArriba() = ultimaDireccion == "arriba" + method seMueveAbajo() = ultimaDireccion == "abajo" + + method moverse(xNueva, yNueva) { // por ahora este método no lo usamos. + x = xNueva + y = yNueva + } + method estaCercaDe(algo) = + (self.position().x() - algo.position().x()).abs() < rangoProximidad and + (self.position().y() - algo.position().y()).abs() < rangoProximidad + + method llevarPelota(pelota) { + if (self.estaCercaDe(pelota)) { + if (self.seMueveDerecha()) { + pelota.moverse(pelota.position().x() + (rangoProximidad + 1), pelota.position().y()) + self.perderEnergia(1) + } + else if (self.seMueveIzquierda()) { + pelota.moverse(pelota.position().x() - (rangoProximidad + 1), pelota.position().y()) + self.perderEnergia(1) + } + else if (self.seMueveArriba()) { + pelota.moverse(pelota.position().x(), pelota.position().y() + (rangoProximidad + 1)) + self.perderEnergia(1) + } + else if (self.seMueveAbajo()) { + pelota.moverse(pelota.position().x(), pelota.position().y() - (rangoProximidad + 1)) + self.perderEnergia(1) + } } - } - - - method hacerGol(pelota,jugador){ - if(pelota.estaEnAreaDeGol(pelota)){ - goles += 1 - game.say(jugador, "¡Gol para el Jugador 1! Total: " + goles) - pelota.moverse(110, 50) + method patearPelota(pelota){ + if (self.estaCercaDe(pelota)) { + if (self.seMueveDerecha()) { + pelota.moverse(pelota.position().x() + self.ajustarPorEnergia(potencia), pelota.position().y()) + self.perderEnergia(25) + } + else if (self.seMueveIzquierda()) { + pelota.moverse(pelota.position().x() - self.ajustarPorEnergia(potencia), pelota.position().y()) + self.perderEnergia(25) + } + else if (self.seMueveArriba()) { + pelota.moverse(pelota.position().x(), pelota.position().y() + self.ajustarPorEnergia(potencia)) + self.perderEnergia(25) + } + else if (self.seMueveAbajo()) { + pelota.moverse(pelota.position().x(), pelota.position().y() - self.ajustarPorEnergia(potencia)) + self.perderEnergia(25) } } - + } + method agarrarConsumible(consumibles) { + consumibles.forEach({ consumible => + if (self.estaCercaDe(consumible)) { + consumible.aplicarSobre(self) + consumible.desaparecer() } + }) + } + method agarrarTarjeta(tarjetas, otroJugador) { + tarjetas.forEach({ tarjeta => + if (self.estaCercaDe(tarjeta)) { + tarjeta.aplicarTarjeta(self, otroJugador) + tarjeta.desaparecer() } + }) + } + method decir(texto) = texto } class Item { - const imagen - var frase - const x = 0.randomUpTo(game.width()).truncate(0) - const y = 0.randomUpTo(game.height()).truncate(0) - var position = game.at(x, y) + const property image + var property position = game.at(-100, -100) - method image() = imagen - method position() = position - method moverse(nuevo_x, nuevo_y) { - position = game.at(nuevo_x, nuevo_y) + method moverse(xf, yf) { + position = game.at(xf, yf) } method moverseAlAzar() { - const x_random = 0.randomUpTo(game.width()).truncate(0) - const y_random = 0.randomUpTo(game.height()).truncate(0) - position = game.at(x_random,y_random) + position = game.at(12.randomUpTo(208).truncate(0), 2.randomUpTo(96).truncate(0)) } - - method frase() = frase } - +// Consumibles class Consumible inherits Item { - const energia - method energia() = energia - method aplicar(jugador,consumible) { - jugador.recuperarEnergia(energia) + const property energia = 0 + const property potencia = 0 + method aplicarSobre (jugador) {} + method desaparecer() {} +} +class Agua inherits Consumible (energia = 20, potencia = 5, image = "agua.png") { + override method aplicarSobre(jugador) { + jugador.ganarEnergia(energia) // permite 10 pasos más. + jugador.ganarPotencia(potencia) // llena 1/6 de la potencia máxima. + game.say(jugador, jugador.decir("Rica agua")) + } + override method desaparecer() { + self.moverse(-100, -100) + game.schedule(1000, { + self.moverseAlAzar() // reaparece luego de 1 seg. + game.onTick (8000, "el agua se empieza a mover", {self.moverseAlAzar()}) }) } } - -class Tarjetas inherits Item { - var cantidad - method aplicar(jugador) { - jugador.cansarse(cantidad) // cuál es la diferencia entre esto y hardcodearle el efecto desde main? +class Gaseosa inherits Consumible (energia = 30, potencia = 5, image = "coke2.png") { + override method aplicarSobre(jugador) { + jugador.ganarEnergia(energia) // permite 15 pasos más. + jugador.ganarPotencia(potencia) // llena 1/6 de la potencia máxima. + game.say(jugador, jugador.decir("Rica gaseosa")) + } + override method desaparecer() { + self.moverse(-100, -100) + game.schedule(2000, { + self.moverseAlAzar() // reaparece luego de 2 seg. + game.onTick (8000, "la gaseosa se empieza a mover", {self.moverseAlAzar()}) }) } } - -class CascaraBanana inherits Item { - method aplicar(jugador) { - jugador.moverseArriba(5) - jugador.moverseDerecha(10) +class Banana inherits Consumible (energia = 40, potencia = 10, image = "bananas.png") { + override method aplicarSobre(jugador) { + jugador.ganarEnergia(energia) // permite 20 pasos más. + jugador.ganarPotencia(potencia) // llena 1/3 de la potencia máxima. + game.say(jugador, jugador.decir("Rica fruta")) + } + override method desaparecer() { + self.moverse(-100, -100) + game.schedule(3000, { + self.moverseAlAzar() // reaparece luego de 3 seg. + game.onTick (6000, "la banana se empieza a mover", {self.moverseAlAzar()}) }) } } - -class Pelota inherits Item{ - const arco1X = game.width() / 2 - 5 // Coordenada x de la portería 1 (izquierda) - const arco1Y = 0 // Coordenada y de la portería 1 - const arco1Ancho = 10 // Ancho de la portería 1 - const arco1Alto = 5 // Alto de la portería 1 - - const arco2X = game.width() / 2 - 5 // Coordenada x de la portería 2 (derecha) - const arco2Y = game.height() - 10 // Coordenada y de la portería 2 - const arco2Ancho = 10 // Ancho de la portería 2 - const arco2Alto = 5 // Alto de la portería 2 - - // Marcadores de goles - const proximidad = 4 - - method golpearPelota(jugador, pelota){ - if (jugador.colision(pelota,jugador,4)){ - pelota.direccionarPelota(jugador,pelota) - } - } - - method direccionarPelota(jugador,pelota){ - if (jugador.position().x() < pelota.position().x()) { - pelota.moverse(pelota.position().x() + 3, pelota.position().y()) - } else if (jugador.position().x() > pelota.position().x()) { - pelota.moverse(pelota.position().x() - 3, pelota.position().y()) - } - if (jugador.position().y() < pelota.position().y()) { - pelota.moverse(pelota.position().x(), pelota.position().y() + 3) - } else if (jugador.position().y() > pelota.position().y()) { - pelota.moverse(pelota.position().x(), pelota.position().y() - 3) - } - } - - method estaEnAreaDeGol(pelota) = pelota.position().x() >= arco1X && pelota.position().x() <= (arco1X + arco1Ancho) && - pelota.position().y() >= arco1Y && pelota.position().y() <= (arco1Y + arco1Alto) - - +class Comida inherits Consumible (energia = 80, potencia = 20, image = "comida.png") { + override method aplicarSobre(jugador) { + jugador.ganarEnergia(energia) // permite 30 pasos más. + jugador.ganarPotencia(potencia) // llena 2/3 de la potencia máxima. + game.say(jugador, jugador.decir("Rica comida")) + } + override method desaparecer() { + self.moverse(-100, -100) + game.schedule(5000, { + self.moverseAlAzar() // reaparece luego de 5 seg. + game.onTick (5000, "la comida se empieza a mover", {self.moverseAlAzar()}) }) + } +} +class BananaPeelDer inherits Consumible (energia = 20, image = "bananaPeel.png") { + override method aplicarSobre(jugador) { + jugador.perderEnergia(energia) // permite 10 pasos menos. + jugador.moverseArriba(5.randomUpTo(15).truncate(0)) + jugador.moverseDerecha(5.randomUpTo(15).truncate(0)) + game.say(jugador, jugador.decir("Noooooooo")) + } + override method desaparecer() { + self.moverse(-100, -100) + game.schedule(100, { + self.moverseAlAzar() // reaparece casi instantáneamente. + game.onTick (2000, "la bananaPeelDer se empieza a mover", {self.moverseAlAzar()}) }) + } } - +class BananaPeelIzq inherits Consumible (energia = 20, image = "bananaPeel.png") { + override method aplicarSobre(jugador) { + jugador.perderEnergia(energia) // permite 10 pasos menos. + jugador.moverseAbajo(5.randomUpTo(15).truncate(0)) + jugador.moverseIzquierda(5.randomUpTo(15).truncate(0)) + game.say(jugador, jugador.decir("Noooooooo")) + } + override method desaparecer() { + self.moverse(-100, -100) + game.schedule(100, { + self.moverseAlAzar() // reaparece casi instantáneamente. + game.onTick (4000, "la bananaPeelIzq se empieza a mover", {self.moverseAlAzar()}) }) + } +} +// Tarjetas +class Tarjeta inherits Item { + const property energia + const property potencia + method aplicarTarjeta (jugador, jugadorAplicado) {} + method desaparecer() {} +} +class TarjetaAmarilla inherits Tarjeta (energia = 50, potencia = 10, image = "yellowCard.png") { + override method aplicarTarjeta(jugador, jugadorAplicado) { + jugadorAplicado.perderEnergia(energia) // permite 25 pasos menos. + jugadorAplicado.perderPotencia(potencia) // quita 1/3 de la potencia máxima. + game.say(jugador, jugador.decir("Toma amarilla")) + } + override method desaparecer() { + self.moverse(-100, -100) + game.schedule(5000, { + self.moverseAlAzar() // reaparece luego de 5 seg. + game.onTick (4000, "la tarjAmarilla se empieza a mover", {self.moverseAlAzar()}) }) + } +} +class TarjetaRoja inherits Tarjeta (energia = 100, potencia = 20, image = "redCard.png") { + override method aplicarTarjeta(jugador, jugadorAplicado) { + jugadorAplicado.perderEnergia(energia) // permite 50 pasos menos (inmobiliza). + jugadorAplicado.perderPotencia(potencia) // quita 2/3 de la potencia máxima. + game.say(jugador, jugador.decir("Toma roja!")) + } + override method desaparecer() { + self.moverse(-100, -100) + game.schedule(10000, { + self.moverseAlAzar() // reaparece luego de 10 seg. + game.onTick (2000, "la tarjRoja se empieza a mover", {self.moverseAlAzar()}) }) + } +} \ No newline at end of file