Pages - Menu

miércoles, 25 de junio de 2014

Tic-Tac-Toe: Aplicando MVC

En esta entrada, vamos a intentar aplicar el patrón Modelo-Vista-Controlador a nuestro pequeño videojuego. Como podremos ver, el diseño es mucho más claro y en este caso concreto, incluso más sencillo.

Diseño

Lo primero que vamos a hacer es diseñar las clases que contendrán el MVC. Estas son las que yo he diseñado:


  • La clase VPartida es la vista, se encarga de todo lo referente a dibujar la escena.  Esta clase, tan solo tiene la función renderizar que lo que hace es dibujar la escena a partir de lo que hay en el modelo.
  • La clase CtrlVPartida es el controlador, tiene como objetivo obtener los eventos a través de la función manejarEventos.
  • La clase Partida es el modelo, se encarga de controlar todo lo referente a la partida que se esta jugando. El modelo no conoce nada de como se van a mostrar las cosas al usuario, por lo que en esta nueva versión, el tablero es una matriz de Jugador.
  • La clase Juego, contiene el bucle principal y se encarga de crear las instancias del modelo, la vista y el controlador, crear la ventana, etc.
Como se puede apreciar, hay varios cambios con la versión anterior. En esta versión, no se cargan las imágenes en instancias de fichas ni nada parecido, si no que las imágenes y todo lo relacionado está a cargo de la vista; de esta manera hacemos que el modelo no sepa nada de como se visualizará el tablero.
En la parte del juego, hemos delegado el trabajo del renderizado a la vista y el manejo de eventos en el controlador, dejando un bucle de juego que actúa de la siguiente manera:
Como este ejemplo es muy sencillo, la parte de actualizar el estado del modelo, se realiza junto con el manejo de eventos.

Implementación

Una vez creado el diseño, la implementación es bastante sencilla. La función ejecutar tiene el siguiente aspecto:

modelo = new Partida;
ctrl = new CtrlVPartida(modelo);
vista = new VPartida(renderer,ctrl,modelo);

while (!salir){
    vista->renderizar();
    salir = ctrl->manejarEventos();
}

delete vista;
delete ctrl;
delete modelo;

La función renderizar de la clase VPartida tiene el siguiente código:

void VPartida::renderizar(){
    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer,imgTablero, NULL, NULL);
    SDL_Rect pos;
    pos.w = 200;
    pos.h = 200;
    for (int i = 0; i < Partida::TAM; i++){
        pos.y = i*200;
        for (int j = 0; j < Partida::TAM; j++){
            pos.x = j*200;
            switch (modelo->getFicha(j,i)){
            case CRUZ:
                SDL_RenderCopy(renderer,imgFichaCruz, NULL, &pos);
                break;
            case CIRCULO:
                SDL_RenderCopy(renderer,imgFichaCirculo, NULL, &pos);
                break;
            }
        }
    }
    SDL_RenderPresent(renderer);
}

El resto de funciones, apenas han sufrido grandes cambios.
Pues esto es todo, si deseáis el código completo podéis descargarlo desde aquí.

No hay comentarios:

Publicar un comentario