La solución está compuesta por el momento de tres proyectos:
FreeWayXNA (Windows Game): es el proyecto de inicio donde se encuentra la clase que deriva de Microsoft.Xna.Framework.Game.
MakanaInput (Windows Library): Es un proyecto que contiene un Game Component que sirve para administrar las entradas de teclado y del gamepad de Xbox360.
MakanaMenu (Windows Library): Este es otro proyecto que contiene un Drawable Game Component que sirve para renderizar y darle funcionalidad al menú del juego.
Obviamente que ambos Game Components están desarrollados para ser reutilizados en futuros proyectos.
El proyecto MakanaInput tiene una clase llamada InputGameComponent utilizada para tal fin. Esta clase administras dos clases que se llaman Teclado y GamePad que guardan el estado actual y el estado previo de ambos dispositivos de entrada. A su vez tienen métodos dedicados a consultar los valores de las teclas, botones y palancas de ambos dispositivos. Probablemente cuando el componente este maduro voy a dedicarle una nota en el blog.
Por otro lado, el proyecto MakanaMenu fue concebido con la idea de generar un Drawable Game Component fácil de reutilizar y creo que en mayor o menor medida se ha logrado. Existen dos clases, una se llama MenuAdm que es el DGC y la otra clase se llama MenuItem. Cada MenuItem tiene una lista de MenuItems y la idea es generar como un árbol de menú agregando a cada MenuItem los ítems que contiene. Para dar una idea de esto, copio una porción simplificada del código que inicializa todos los menús:
/* MENU PRINCIPAL */
MenuItem menuPrincipal = new MenuItem("Menu Principal", TipoMenuItem.Contenedor);
menuPrincipal.MenuPadre = menuPrincipal;
/* ITEM 1.1 - NUEVO JUEGO */
MenuItemPersonajes menuNuevoJuego = new MenuItemPersonajes(menuPrincipal, "Nuevo Juego", TipoMenuItem.Contenedor);
menuPrincipal.Submenus.Add(menuNuevoJuego);
/* ITEM 1.2 - OPCIONES */
MenuItem menuOpciones = new MenuItem(menuPrincipal, "Opciones", TipoMenuItem.Contenedor);
menuPrincipal.Submenus.Add(menuOpciones);
/* ITEM 1.3 - SALIR */
MenuItem menuSalir = new MenuItem(menuPrincipal, "Salir", TipoMenuItem.Salir);
menuPrincipal.Submenus.Add(menuSalir);
/* ITEM 1.2.1 - TIEMPO DE JUEGO */
MenuItem menuTiempoJuego = new MenuItem(menuOpciones, "Tiempo de Juego", TipoMenuItem.Lista);
menuOpciones.Submenus.Add(menuTiempoJuego);
/* ITEM 1.2.2 - SONIDO */
MenuItem menuSonido = new MenuItem(menuOpciones, "Sonido", TipoMenuItem.SiNo);
menuOpciones.Submenus.Add(menuSonido);
/* ITEM 1.2.3 - MUSICA */
MenuItem menuMusica = new MenuItem(menuOpciones, "Musica", TipoMenuItem.SiNo);
menuOpciones.Submenus.Add(menuMusica);
/* ITEM 1.2.4 - VOLVER */
MenuItem menuVolver = new MenuItem(menuOpciones, "Volver", TipoMenuItem.Volver);
menuOpciones.Submenus.Add(menuVolver);
// Creo el menu principal
menuAdm = new MenuAdm(this, spriteBatch, spriteFont);
menuAdm.MenuPrincipal = menuPrincipal;
menuAdm.MenuActual = menuPrincipal;
Cada grupo de código se basa en crear el MenuItem y agregarlo a la lista del menú padre que lo contiene. De esta forma, por ejemplo, el menú “Sonido” se incluye adentro del menú “Opciones” con esta línea: menuOpciones.Submenus.Add(menuSonido);
Vale aclarar que cada MenuItem tiene un tipo de menú y este es asignado en el último parámetro del constructor. Sin embargo para el menú de nuevo juego utilizamos la clase MenuItemPersonaje la cual no pertenece al proyecto MakanaMenu sino que es propia del proyecto FreeWayXNA y deriva de ManuItem para implementar las cuestiones especificas de ese menú. Bueno, no voy a interiorizar mas en esto porque voy a terminar eliminando el escaso publico del blog :P
Entre las opciones se encuentra la cantidad de minutos que se va a jugar, si debe tener sonido y música. Al seleccionar cada uno de los ítems, la opción va cambiando (en el caso del sonido y la música, el semáforo cambia entre rojo y verde)
Finalmente al seleccionar nuevo juego, aparece la pantalla para elegir el animal que cada jugador utilizará. Las opciones disponibles son: VACA, CABALO, CERDO y TORTUGA.
Actualmente el juego maneja los game status así que si presionamos el ENTER el juego “comienza” (en realidad, por ahora solo aparece la pantalla de fondo) y al tocar ESC se vuelve al menú con el juego pausado.
Bueno, por ahora es todo, en la próxima entrega tendremos el juego terminado.