viernes, 27 de noviembre de 2009

Qué se necesita para programar en Wii

O mejor dicho que he usado yo. En primer lugar, deciros que hay un emulador para Wii o gamecube que se llama dolphin-emu. Pero parece ser que necesita un montón de recursos. Yo lo he intentado ejecutar y me ha sido imposible.

Así que una vez más os voy a mostrar la forma 'chapucera' que tengo de trabajar con la Wii. En primer lugar vemos mi 'laboratorio'. Tengo un router wifi, un ordenador (en mi caso un portátil con ubuntu) y la Wii, estos dos últimos conectados al router, que es por él por donde salgo a Internet.

Me he bajado el ftpii que es un servidor de ftp para la Wii. Lo he copiado a la tarjeta SD de la Wii (dentro de apps) en una carpeta que he llama ftpii_clave, donde clave será nuestra contraseña de entrada.

En el Homebrew channel saldrá el ftpii como un programa a ejecutar. Lo hacemos y nos mostrará la IP con la que sirve los ficheros. Pues nada cogemos nuestro cliente de ftp (en mi caso el filezilla) que estará instalado en el portátil y nos conectamos a esa IP. Si la carpeta la hemos llamado ftpii_clave habrá que usar 'clave' como la contraseña de la cuenta.

Y ya está, tenemos acceso a la tarjeta SD de la Wii, sin tener que estar manipulándola todo el rato. Dentro de apps creo la carpeta del juego que estoy compilando y, eso sí, cambio el nombre del archivo ejecutable mi_programa.dol por boot.dol.

Para probar yo os animaría a instalar de esta forma cualquier otro programa homebrew que bajéis de Internet.

Saludos

viernes, 20 de noviembre de 2009

Cargamos las monedas

Vamos a cargar las monedas en el mundo de New Super Mario Bros, y para hacer esto utilizaremos el programa que nos genera los mapas.

Se ha agregado una nueva opción al generador de mapas para que permita editar una capa denominada coins (monedas). En la siguinete imagen se puede ver al editor a pleno rendimiento:


El editor al guardar generará un nuevo fichero que se llamará coins_mapa_8_nombre del txt) y coins_mapa_16_nombre del txt). Este último será el que utilizaremos.

ahora veamos los cambios en el código del juego.

En primer lugar seguimos añadiendo funcionalidades a las librerías:
En la clase ScreenManager.h se ha añadido una función para cargar sprites de fondo a partir de una array (el que genera el editor de mapas):

/**
* Carga una serie de sprites de tipo background a partir de un mapa y de un primer sprite de tipo background
* ya cargado.
* Este primwr sprite será reubicado a la priemra posición indicada por el mapa.
*
* @param sprite El sprite a cargar
* @param map mapa que indica donde colocar cada sprite
* @param mapCols número de columnas del mapa
*/
void LoadBackgroundSprites(Sprite *sprite, int *map, int map_columns, int map_rows);


En ScreenManager.cpp hemos codificado la funcion de la siguiente forma:


void ScreenManager::LoadBackgroundSprites(Sprite *sprite, int *map, int map_columns, int map_rows) {
unsigned int i;
unsigned int length = map_columns * map_rows;
bool primero = true;
for (i = 0; i < length; i++)
if (map[i] > 0) {
int y = i / map_columns;
int x = i - (y * map_columns);
if (primero) {
sprite->SetXY(x * 16, y * 16);
primero = false;
} else CloneBackgroundSprite(sprite, x * 16, y * 16);
}
}

Lo que hace esta función es coger un sprite de fondo y un array y donde el array le indique coloca un copia del sprite de fondo, que en este caso serán modenas.

Vamos a ver como se usa esta nueva función en nuestro juego:


int coins_map[48 * 12] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 56, 0, 56, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
#define COINS_MAPA coins_map, 48, 12

....

Sprite *coin = topScreen->CreateBackgroundSprite(BACKGROUND_THREE, COIN, 0, 0);
coin->SetAnim(0, 3, 4);
coin->StartAnim();
topScreen->LoadBackgroundSprites(coin, COINS_MAPA);


La explicación sería algo así:
Carga una primera moneda (las coordenadas dan igual, en este caso se ha puesto 0, 0),
Se anima el sprite,
y finalmente se cargan tantas monedas como diga el mapa.

Los números que aparecen en el mapa no es importante (por ahora). Sólo es importante que sea cero donde no va moneda y distinto de cero donde queremos una moneda.

Nos falta coger las dichosas monedas!!

En el próximo post intentaremos cogerlas y de paso publicaremos código.

Saludos

viernes, 13 de noviembre de 2009

Programar para la Wii

Ya desde el primer post teníamos intención de programar algo para la Wii, y no ha sido hasta el pasado mes de Octubre que tuvimos un par de tardes libre y pudimos hacer las primeras pruebas.

En este post vamos a mostrar como preparar la instalación de devkitpro para poder compilar juegos para la Wii. En su día preparamos una instalación sobre ubuntu y ahora vamos a hacer que esa misma instalación soporte a la Wii, y a la Game Cube que es lo mismo.

En resumen podemos decir que es lo mismo que el otro día pero instalando las librerías libogc en vez de libnds. Vamos a ver paso a paso:

Lo primero será bajar todo lo necesario:

Bajar devkitPPC de http://sourceforge.net/projects/devkitpro/files/ (si no lo tenemos instalado ya)
libogc -> http://sourceforge.net/projects/devkitpro/files/libogc/ (libogc-1.7.1.tar.bz2)
libfat-ogc -> http://sourceforge.net/projects/devkitpro/files/libfat/ (libfat-ogc-1.0.4.tar.bz2)
Wii examples (optional) -> http://sourceforge.net/projects/devkitpro/files/examples/ (wii-examples-20090509.tar.bz2)

En segundo lugar todos estos comandos:
$ cd Escritorio

(Si no tenemos instalado devkitpro)
$ sudo mkdir /usr/local/devkitpro 'si ni existiera ya
$ sudo chmod 777 /usr/local/devkitpro 'si ni existiera ya
$ sudo bunzip2 devkitARM_r26-i686-linux.tar.bz2
$ sudo tar xvf devkitARM_r26-i686-linux.tar -C /usr/local/devkitpro

(Seguimos)
$ sudo bunzip2 devkitPPC_r17-i686-linux.tar.bz2
$ sudo tar xvf devkitPPC_r17-i686-linux.tar -C /usr/local/devkitpro
$ sudo mkdir /usr/local/devkitpro/libogc
$ sudo chmod 777 /usr/local/devkitpro/libogc
$ sudo bunzip2 libogc-1.7.1.tar.bz2
$ sudo tar xvf libogc-1.7.1.tar -C /usr/local/devkitpro/libogc
$ sudo bunzip2 libfat-ogc-1.0.4.tar.bz2
$ sudo tar xvf libfat-ogc-1.0.4.tar -C /usr/local/devkitpro/libogc

Ahora añadimos unas variables de contexto:

$ gksudo gedit /etc/environment

y añadimos al final las siguientes líneas:

DEVKITPRO="/usr/local/devkitpro"
DEVKITARM="/usr/local/devkitpro/devkitARM"
DEVKITPPC="/usr/local/devkitpro/devkitPPC"

Reiniciando la máquina ya podremos compilar los ejemplos.

Instalar libwiisprite:

Descargar de http://chaosteil.googlepages.com/libwiisprite-0.3.0b.tar.gz

Lo descomprimos en el mismo lugar donde lo descargamos y realizamos los siguientes pasos:

De la carpeta libwiisprite/libwiisprite/include copiamos todos los archivos a /usr/local/devkitpro/libogc/include
(en mi caso he ejecutado la siguiente acción desde un terminal: sudo cp /home/inigo/Escritorio/libwiisprite/libwiisprite/include/*.h /usr/local/devkitpro/libogc/include)
Ahora sudo cp /home/inigo/Escritorio/libwiisprite/libwiisprite/lib/*.a /usr/local/devkitpro/libogc/lib/wii

Lo mismo con la carpeta libwiisprite/libpng:
sudo cp /home/inigo/Escritorio/libwiisprite/libpng/include/*.h /usr/local/devkitpro/libogc/include
sudo cp /home/inigo/Escritorio/libwiisprite/libpng/lib/*.a /usr/local/devkitpro/libogc/lib/wii

Yo en este punto tuve un problema con libwiisprite y realicé los siguientes pasos:

Bajar una nueva compilación de http://www.mediafire.com/download.php?wwycxmg0j0x
y ejecutar: sudo cp /home/inigo/Escritorio/libwiisprite.a /usr/local/devkitpro/libogc/lib/wii

Descargar con Synaptic la librería libfreeimage

Si todo ha ido bien ya se podrá compilar los ejemplos que vienen con la librería.

Hemos instalado la librería libwiisprite, hay más librerías pero nosotros sólo vamos a usar esta, por ahora.

Y que vamos a hacer nosotros en este blog, pues algo muy sencillo, vamos a pasar el Tetris que hicimos para la DS a la Wii!!!

Para ir abriendo boca os dejo un video para que veáis como ha quedado el juego, si os fijaís bien es el mismo que el de la nintendo DS (sólo hemos cambiado el fondo).


Saludos

P.D. En los siguientes post sobre Wii veremos como trabajo con ella, pero lo que no puedo explicar bien es como crear el Homebrew channel. Lo hice hace un año y ahora hay nuevas formas de hacerlo y no tengo ni idea.

P.D. Seguimos con el tema del New Super Mario Bros. El próximo post será para él.

martes, 10 de noviembre de 2009

Retomamos

Ha habido un cierre temporal del blog estos meses, que espero que sea eso, temporal.

Como penitencia voy a crear unos post hablando de la Wii y de como programar para ella. Ya tengo portado el tetris (por ahora usando el mando como un pad) y no hemos pasado el New Super Mario Bros, porque lo van a hacer los de Nintendo este mes y no era cuestión de adelantarnos a ellos :D

Por supuesto, seguiremos con el New Super Mario Bros para la Nintendo DS.

Este viernes posteamos fijo!!!

Saludos

P.D. Hemos cambiado el título del blog, ahora es Programar para la Nintendo DS y Wii, la url por supuesto sigue igual!!