diaznicolasandres1 / 95.02-algo3-algo-empire-tp-final

Proyecto final algoritmos y programacion III - POO/Patrones de diseño/MVC/TDD
1 stars 0 forks source link

Consulta de JavaFX #14

Closed diaznicolasandres1 closed 5 years ago

diaznicolasandres1 commented 5 years ago

Hola Tomas, te queriamos consultar lo siguiente. Teniamos pensada la siguiente idea

Vamos a hacer un grid donde cada casillero sea un boton. Entonces al hacer click en el mismo ocurre lo siguiente 1- Nos tiene que dar el objeto 'colocable'. 2- Lee los metodos disponibles del mismo y nos muestra un menu con las acciones que puede realizar. 3- se delega en el boton de accion(atacar, reparar) esperar el objeto al cual atacar/reparar (Y aca es donde no sabemos como hacerlo).

Por que hacemos click en el atacador, luego seleccionamos en el menu el boton atacar y ahi nos quedamos esperando que el usuario haga click en el atacado. Pero no sabemos realizar la sintaxis de esto.

public class BotonAtacar implements EventHandler<ActionEvent> {

    Juego juego;
    Atacante atacante;
    Unidad atacado;

    public BotonAtacar(Juego juego, Atacante atacante) {
        this.juego = juego;
        this.atacante = atacante;
    }

    @Override
    public void handle(ActionEvent actionEvent) {
        //Esperar que haga click en casillero del atacado y obtenerlo
        juego.atacar(atacante,atacado);
    }
}
tomasBustamante commented 5 years ago

El problema es que el click sobre el casillero representa dos acciones distintas según la situación en la que se encuentre en juego. Por consiguiente, la manera adecuada es utilizando handlers distintos. Es decir, cuando se inicia el juego cada botón de casillero tiene asociado el handler CasilleroButtonHandler, que se encarga de mostrar los botones correspondientes al colocable que haya ahí, como ya habías planteado. Luego, el handler del botón de atacar debería únicamente mostrar el mensaje al usuario de que necesita elegir otro casillero para finalizar el ataque y avisarle al controlador del tablero que remplace los handlers de cada casillero por nuevos handlers que sean instancia de FinalizarAtaqueButtonHandler. Este handler recibirá en su constructor la referencia al casillero (o colocable) anterior y se encargará efectivamente de realizar el ataque y finalmente de decirle al controlador del tablero que restablezca los handlers originales para cada casillero.

El patrón Observador les puede ser de utilidad para que la comunicación entre las vistas y los controladores sea más amenas.

Por otro lado, me parece necesario marcar la diferencia entre las clases de los botones (clase Button y las que hereden de ella) y las clases de sus "manejadores" (toda clase que implemente la interfaz EventHandler<ActionEvent>). De manera tal que un objeto puede tener asociados distintos handlers para cada posible acción, como así también cada handler puede estar referenciado por acciones de distintos botones o eventos. Por lo tanto, la clase del evento del ataque que mostrás ahí debería llamarse algo así como AtacarButtonHandler o IniciarAtaqueHandler.

diaznicolasandres1 commented 5 years ago

Muchas gracias Tomas, creo que entendí bien lo que explicaste. Ahora tratamos de implementarlo

diaznicolasandres1 commented 5 years ago

Estoy con un problema Tomas, dibujo el mapa de la siguiente manera y se dibujan todos con el handler que espera para que se le haga click y se abran las opciones

 public void dibujarMapaConCasilleroHandler(ContenedorPrincipal contenedor,ArrayList<Boton> botones ){
        Mapa mapa = this.juego.getMapa();
        int base = mapa.getBase();
        int altura = mapa.getAltura();

        for (int i = 0; i < altura; i++) {
            for (int j = 0; j < base; j++) {
                Colocable colocable = juego.getColocable(i+1,j+1);
                Boton botonCasillero = new Boton("", new BotonCasilleroEventHandler(this.juego, i + 1, j + 1,contenedor));

                if(colocable instanceof Aldeano){
                   botonCasillero.setTexto("A");
                    botonCasillero.setStyle("-fx-background-color: green");

                }
                else if(colocable instanceof Castillo) {
                    botonCasillero.setTexto("C");
                    botonCasillero.setStyle("-fx-background-color: blue");
                }
                else if(colocable instanceof PlazaCentral) {
                    botonCasillero.setTexto("P");
                    botonCasillero.setStyle("-fx-background-color: red");
                }
                else if(colocable instanceof Cuartel) {
                    botonCasillero.setTexto("c");
                    botonCasillero.setStyle("-fx-background-color: yellow");
                }
                botones.add(botonCasillero);
                this.tablero.add(botonCasillero, j, i, 1, 1);
                botonCasillero.setPrefSize(30, 30);
            }
        }
    }

En una primera instancia, con el mismo codigo y cambiando el event handler me funciono y se crea el edificio, pero era mucho codigo repetido. Entonces me almacene los botones en un arreglo para luego recorrerlo y cambiarle el estado. Pero no me esta funcionando el cambio de estado y no puedo ver por que.

 public void cambiarHandlerPorCrearCuartelFin(Aldeano aldeano){
        Mapa mapa = this.juego.getMapa();
        int base = mapa.getBase();
        int altura = mapa.getAltura();

        for (int i = 0; i < altura; i++) {
            for (int j = 0; j < base; j++) {
                BotonConstruirCuartelFinEventHandler handler = new BotonConstruirCuartelFinEventHandler(juego,aldeano,i+1,j+1,this);
                for(Boton boton : botones){
                    System.out.println(i);
                    System.out.println(j);
                    boton.setHandler(handler);
                    break;
                }
            }
        }

@tomasBustamante

Otra opcion que se me ocurre es que en en dibujar reciba el event handler que le corresponda, pero en cada instancia tiene que crearse uno nuevo con su fila y columna. Hay alguna manera de pasar un tipo de objeto por parametro y luego inicializarlo dentro del metodo?

tomasBustamante commented 5 years ago

La asignación del event handler para el botón debería realizarse mediante el método setOnAction directamente. La clase Boton que creaste como no tiene mucho sentido. Podés usar directamente la clase Button.

No veo en dónde está fallando la idea que planteás. ¿Qué error te dice? ¿En dónde falla al debuggear? Si querés poné el código en otro branch y lo probamos ahí.