-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feedback #1
base: feedback
Are you sure you want to change the base?
Feedback #1
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¡Buenas @pdepjm/spart4! ¿Cómo va...?
Les dejamos algunos comentarios sobre el código, y nos enfocamos en señalar los aspectos fundamentales que sería útil ajustar. Podemos discutir los detalles con mayor profundidad este fin de semana.
Por otro lado, les consulto ¿Tienen una explicación teorica de los conceptos aplicados?
¡Saludos!
enemigos.wlk
Outdated
var property velocidad = 700 | ||
var property apariencia = "piopio.png" | ||
method image() = apariencia | ||
override method esEnemigo() = true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¡Estas decisión de diseño, nos puede traer inconvenientes! Principalmente conceptos de polimorfismos se pueden ver afectados, por el hecho de consultar quien soy.
enemigos.wlk
Outdated
override method esEnemigo() = true | ||
|
||
// [left, down, right, up] | ||
var property vector_movimiento = [0, 1, 0, 0] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¡Bien! Cuidado con el uso de los defaults. Además, que no es muy expresivo el uso de este vector.
Una solución acorde a nuestro paradigma actual, seria delegar la lógica a un objeto. Ya que, los ceros y uno en algún momento se van a quedar corto. Sumado, a que no expresan los ustedes están buscando.
Un solución del enfoque mencionando seria esta:
class Enemigo {
// Opcion 1: movimientoCuadrado es una object que por limites de celdas genera un mov cuadrado
const movimiento = movimientoCuadrado
// Opcion 2: movimientoCuadrado es un wrapper object de una coleccion de movimientos: [abajo, izquierda, arriba, derecha]
const movimiento = movimientoCuadrado
method moverser() {
movimiento.actualizarPosicionDe(self)
}
}
¿Qué estamos logrando con esto? 👀
Inicialmente, estamos logrando ocultar detalles de implementación y mostrando lo esencial.
Un enemigo, no necesitaba saber cómo se mueve en detalle, solo sabe que tiene un objeto Movimiento que se encarga de esa lógica. Esto facilita el manteamiento, ya que los cambios que se hagan a futuros se pueden hacer dentro de Movimiento sin afectar a lógica de los Enemigos.
Temas como: Polimorfismo - Encapsulamiento - Abstracción se están poniendo práctica.
jugador.wlk
Outdated
|
||
object jugador inherits FiguraConMovimiento(position = game.at(1, 1)) { | ||
|
||
override method jugador() = true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¡Estas decisión de diseño, nos puede traer inconvenientes! Principalmente conceptos de polimorfismos se pueden ver afectados, por el hecho de consultar quien soy.
jugador.wlk
Outdated
} | ||
} | ||
|
||
object points inherits ObjetoVisible{ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¿Por que están heredando de ObjetoVisible?
jugador.wlk
Outdated
object modificadorMapa inherits ObjetoVisible{ | ||
|
||
var property position = jugador.position() | ||
|
||
method modBloques(direccion) { | ||
game.addVisual(self) | ||
self.position(jugador.position()) | ||
self.detectarSiguientePosicionValida(direccion) | ||
} | ||
|
||
method eventosDelTeclado() { | ||
keyboard.d().onPressDo({ self.modBloques(moverDerecha) }) | ||
keyboard.s().onPressDo({ self.modBloques(moverAbajo) }) | ||
keyboard.a().onPressDo({ self.modBloques(moverIzquierda) }) | ||
keyboard.w().onPressDo({ self.modBloques(moverArriba) }) | ||
} | ||
|
||
method realizarAccion(accion, direccion){ | ||
if(accion == 2){ | ||
self.ponerBloques() | ||
game.onTick(20, "mover-puntero", {self.moverPuntero(direccion) self.ponerBloques()}) | ||
} | ||
if(accion == 1){ | ||
self.quitarBloques() | ||
game.onTick(20, "mover-puntero", {self.moverPuntero(direccion) self.quitarBloques()}) | ||
} | ||
if(accion == -1){ | ||
self.removerPuntero() | ||
} | ||
} | ||
|
||
method removerPuntero() { | ||
game.removeTickEvent("mover-puntero") | ||
game.removeVisual(self) | ||
} | ||
|
||
method detectarSiguientePosicionValida(direccion){ | ||
var respuesta = 2 | ||
self.moverPuntero(direccion) | ||
if(game.getObjectsIn(self.position()).any({elemento => return elemento.soyBloque()})) {respuesta = 1} | ||
else if(game.getObjectsIn(self.position()).any({elemento => return elemento.esEnemigo()})) {respuesta = -1} | ||
self.realizarAccion(respuesta, direccion) | ||
} | ||
|
||
method quitarBloques(){ | ||
if(game.getObjectsIn(self.position()).any({elemento => return elemento.soyBloque()})){ | ||
game.removeVisual(game.getObjectsIn(self.position()).find({elemento => return elemento.soyBloque()})) | ||
//self.position(game.at(self.position().x(), self.position().y() + 1)) | ||
//game.removeVisual(game.getObjectsIn(self.position()).find({elemento => return elemento.esBloqueSuperior()})) | ||
//self.position(game.at(self.position().x(), self.position().y() - 1)) | ||
} | ||
else{ | ||
self.removerPuntero() | ||
} | ||
} | ||
|
||
method ponerBloques(){ | ||
if(game.getObjectsIn(self.position()).any({elemento => return elemento.soyBloque()})){ | ||
self.removerPuntero() | ||
} | ||
else{ | ||
new Bloque().ubicarYDibujar(self.position().x(), self.position().y()) | ||
new BloqueSuperior().ubicarYDibujar(self.position().x(), self.position().y()) | ||
} | ||
} | ||
|
||
method moverPuntero(direccion){ | ||
position = position.left(direccion.vector().get(0)) | ||
.down(direccion.vector().get(1)) | ||
.right(direccion.vector().get(2)) | ||
.up(direccion.vector().get(3)) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No sé entiende muy bien el uso de este objeto. ¿Me pondría explicar su implementación?
menus.wlk
Outdated
if(sincronizadorDePantallas.pantallaActual() == tipoDeMenu){ | ||
keyboard.w().onPressDo({if(moverA.position().y() < yeMax) moverA.position(game.at(moverA.position().x(), moverA.position().y() + cantidadDeIncrementoParaPosiciones))}) | ||
keyboard.a().onPressDo({if(moverA.position().x() > equisMin) moverA.position(game.at(moverA.position().x() - cantidadDeIncrementoParaPosiciones, moverA.position().y()))}) | ||
keyboard.s().onPressDo({if(moverA.position().y() > yeMin) moverA.position(game.at(moverA.position().x(), moverA.position().y() - cantidadDeIncrementoParaPosiciones))}) | ||
keyboard.d().onPressDo({if(moverA.position().x() < equisMax) moverA.position(game.at(moverA.position().x() + cantidadDeIncrementoParaPosiciones, moverA.position().y()))})} | ||
//keyboard.enter().onPressDo({}) | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¡Cuidado con esa comparación! Es un síntoma de estar rompiendo el polimorfismo.
En la teoría de la programación orientada a objetos, uno de los principios fundamentales es que los objetos deben ser intercambiables. Esto significa que deben ser sustituibles o intercambiables según su comportamiento, no por su tipo. Al seguir este principio, podemos asegurar que los objetos se comporten de manera consistente sin necesidad de verificar explícitamente su tipo, lo que mejora la flexibilidad y extensibilidad del código.
Además, también mencionásemos, que podríamos delegar lógica a diferentes métodos para aportar expresividad a la implementación.
menus.wlk
Outdated
lineaEnemiga.enemigo().limpiarEnemigos() | ||
game.removeVisual(fondoJuego) | ||
game.removeVisual(points) | ||
escenario.limpiarEscenario() | ||
musicaDeFondo.stop() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¿Responsabilidad de los menus realizar esta acción?
¡La respuesta es no! Esta tarea debe ser responsabilidad de los niveles o de un componente
dedicado a gestionar la lógica de limpieza de los visuales una vez que el nivel haya terminado.
Además, si en algún momento necesito realizar un cambio en la forma en que se gestionan o limpian los elementos visuales del nivel, será más lógico hacerlo en los niveles o en el componente correspondiente, no en el menú.
menus.wlk
Outdated
if(sincronizadorDePantallas.pantallaActual() == tipoDeMenu){ | ||
game.removeVisual(seleccionGanaste) | ||
game.removeVisual(ganaste) | ||
if (seleccionGanaste.position() == game.at(6, 5)) { | ||
sincronizadorDePantallas.cambiarPantalla("niveles") | ||
menuNivel.cargar() | ||
} | ||
if (seleccionGanaste.position() == game.at(10, 5)){ | ||
game.addVisual(finDelJuego) | ||
game.stop() | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¡Cuidado con esa comparación! Es un síntoma de estar rompiendo el polimorfismo.
Además, deberíamos considerar, que pasaría si quisiera implementar más niveles. Se tendrían más casos, ¿no?
¡Entonces! ¿Que solución podemos proponer?
muros.wlk
Outdated
method generarEscenario(){ | ||
(16 .. 0).forEach({y => const listaAux = niveles.entregarFila(17-y, nivel) | ||
(0..17).forEach({x => const aux = listaAux.get(x) | ||
aux.decodificar(x, y)}) | ||
}) | ||
} | ||
method generarBloquesSuperiores(){//para crear la ilusion de que el jugador está detrás del bloque | ||
(16 .. 0).forEach({y => const listaAux = niveles.entregarFila(17-y, nivel) | ||
(0..17).forEach({x => const aux = listaAux.get(x) aux.decodificarSuperior(x, y)}) | ||
}) | ||
} | ||
|
||
method generarLateralSuperior(){ | ||
(17..0).forEach({x => listaPosiciones.add(game.at(x,17)) new Bloque().ubicarYDibujar(x,17)}) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
¡Bien! Sabiendo que tenemos un decodificador en el archivo: niveles.wlk, ¿por que no lo estamos aprovechando? ¿O cuales son las utilidades de estos métodos?
Co-authored-by: brisabrussa28 <[email protected]>
Co-authored-by: brisabrussa28 <[email protected]>
👋! GitHub Classroom created this pull request as a place for your teacher to leave feedback on your work. It will update automatically. Don’t close or merge this pull request, unless you’re instructed to do so by your teacher.
In this pull request, your teacher can leave comments and feedback on your code. Click the Subscribe button to be notified if that happens.
Click the Files changed or Commits tab to see all of the changes pushed to the default branch since the assignment started. Your teacher can see this too.
Notes for teachers
Use this PR to leave feedback. Here are some tips:
For more information about this pull request, read “Leaving assignment feedback in GitHub”.
Subscribed: @OrianaIsabel @brisabrussa28 @Miranda-03 @LucianoSantinoValenzuelaMaltas @tomyleca