viernes, 22 de enero de 2010

Tetris para la Wii

Como ya comentamos en una entrada anterior vamos a ver como pasar el Tetris de la DS a la Wii.

Lo primero de todo es bajar el Tetris para la DS, y ponernos a cambiar las llamadas a la librería PAlib por las de la Wii. Para la Wii hay varias librerías disponibles, en nuestro caso hemos usado las librerías libwiisprite, para la parte gráfica, fat, para le acceso al disco y wpad para manejar el wiimote.

Por ejemplo el #include se debe cambiar por #include , #include y #include .

Por ejemplo las llamadas de tipo PA_Init, PA_InitVBL() y PA_InitText por gwd.InitVideo, donde se ha definido gwd de tipo GameWindow, fatInitDefault y WPAD_Init();.

Otra cosa, las librería del Wii que he usado están en C++, por lo que hay que pasar de tetris.c a tetris.cpp. He utilizado la nomenclatura de objetos con . en vez de con ->. Esto es debido a que todos los ejemplo venían con . y como he hecho Copy/Paste pues así es como ha quedado.

Este es el código para cargar el fondo:

Image img_fondo;
 if (img_fondo.LoadImage("fondo.png") != IMG_LOAD_ERROR_NONE) exit(0);
  Sprite fondo;
  fondo.SetImage(&img_fondo);
  fondo.SetPosition(0, 0);

La explicación del código sería muy fácil: primero definimos la variable img_fondo de tipo Imagen y cargamos el fondo en este objeto, con la función LoadImage. Se crea un objeto de tipo Sprite y se le asocia la imagen. Finalmente lo colocamos en la posición 0, 0 y Ya tenemos el fondo.

Ahora toca cargar los tilset para las fichas y el tablero. Esto, si se ha seguido la programación del tetris de la DS, no sería necesario explicarlo mucho. Sólo comentaremos que un tileset es una zona gráfica que se puede rellenar con pequeñas imágenes para crear la imagen completa, a modo de ladrillos.

Para crear una zona de tilesets (el tablero del tetris y la fichas siguiente) usaremos
el objeto TiledLayer:

TiledLayer tablero_layer(TABLERO_ANCHO, TABLERO_ALTO, 8);
TiledLayer ficha_siguiente_layer(FICHA_ANCHO, FICHA_ALTO, 8);

Image tiles;
if (tiles.LoadImage("tiles16.png") != IMG_LOAD_ERROR_NONE) exit(0);
tablero_layer.SetStaticTileset(&tiles, 16, 16);
tablero_layer.SetPosition(160, 50);

ficha_siguiente_layer.SetStaticTileset(&tiles, 16, 16);
ficha_siguiente_layer.SetPosition(350, 50);

La explicación sería muy parecida a la de cargar el fondo. Se han creado dos objetos de tipo TiledLayer y a ambos se les asocia una imagen como StaticTileset. Esta será la que contendrá los ladrillos. Finalmente posicionamos los dos tilesets en la pantalla.

Ahora vamos a cargar todo en pantalla. Para esto se usa un LayerManager, al cual hay que asignarle los tres componentes que queremos que muestre:

LayerManager tablero_manager(3);
 tablero_manager.Append(&tablero_layer);
 tablero_manager.Append(&ficha_siguiente_layer);
 tablero_manager.Append(&fondo);
El orden es importante, el fondo debe ir al final.

En el próximo post veremos como utilizar el mando el wiimote como un mando clásico.

Saludos y feliz año.

P.D. Este es el primer y único desarrollo que he hecho para la Wii, así que no puedo decir si como se ha hecho es la mejor forma posible. Cargar un fondo en un objeto de tipo Sprite no parece muy correcto, pero es que no he encontrado otra forma de hacerlo. Me gustaría estudiar más a fondo la librería libogc pero, como siempre, la falta de tiempo...

2 comentarios:

alberto dijo...

Me a ayudado bastante tu blog, haces un trabajo impresionante en el tema de programación, no deberias dejarlo de lado ya que tus proyectos están muy conseguidos te dejo el enlace a mi web sobre programación por si alguna véz te animas a participar junto a nosotros xD.

Saludos.

Inigo dijo...

Gracias por el comentario.