Anuncios Google

Curso aplicado de GRRLIB - 3º Entrega

Tutoriales Avanzados Homebrewes

Ya, ya, ya calma un poco tus ansias, que ya tienes ante tus ojos al fin la "Tercera entrega" de los tutoriales de GRRLIB. Ve por un refresco o por café, sientate tranquilamente, entra en el tutorial y lee todo con calma que el tutorial ya es tuyo para que sigas enredado en este fantástico mundillo.

Haciendo nuestro primer "Hola mundo"

Hasta aquí hemos visto la estructura mínima de un programa, pero si ejecutamos dicho programa en nuestra Wii sólo conseguiremos una pantalla en negro de la que se puede salir pulsando "home".

Si queremos que nuestro programa haga algo tenemos que añadir algunas instrucciones más dentro y fuera del bucle.

Para entender las instruciones que tenemos que añadir vamos a ver como funcionan las variables y los punteros en C.

Variables y tipos de datos en C

Como muchos de vosotros ya sabréis, una variable es una posición de memoria con nombre que se usa para mantener un valor. En C todas las variables deben ser declaradas antes de poder usarlas.

La forma general para declar una variable es la siguiente:

tipo lista_de_variables;

Aquí, tipo debe ser un tipo de datos válido en C y lista de variables una lista de nombres separada por comas.

Ejemplo:

int i,j,l;
float numero:
double a, b, c;

Existen tres sitios donde se puede declarar una variable:

  • Dentro de las funciones.
  • En la definición de parámetros de las funciones.
  • Fuera de todas las funciones.

Hay que tener en cuenta que antes de que el programa llegue a la declaración de dicha variable, ésta no es visible en el programa.

Si colocamos un signo igual y una constante después del nombre de una variable se puede dar a la mayoría de las variables valor mientras se declaran.

La forma general de inicialización es:

tipo nombre_de_variable = constante;

Ejemplo:

char ch = 'a';
int primero = 0;
float balance = 123.23;

Punteros a variables

Un puntero es una dirección de memoria de una variable. Una variable de puntero es una variable específicamente declarada para contener un puntero.

En C los punteros tienen tres funciones básicas:

  • Referenciar los elementos de un array (por ejemplo una cadena de caracteres es un array de char)
  • Pasar parámetros a funciones que puedan ser modificados dentro de estas y conservar su valor una vez salimos de las funciones.
  • Dar soporte a las listas enlazadas. (esto probablemente no lo tocaremos)

Para manejar punteros existen dos operadores que veremos a continuación.

El primer operador es &. Este operador devuelve la dirección de memoria de lo que pongamos detrás.

Ejemplo:

m = &cont;

guardará en la variable m la dirección de memoria de la variable cont.

Se puede pensar en & como "la dirección de".

Supongamos que la variable cont utiliza la posición de memoria 2000 para guardar su valor, supongamos además que el valor de cont es 100. Después de la asignación anterior, el valor de m será 2000.

El segundo operador de punteros es *. Éste operador es el complementario de &, y devuelve el valor de la variable ubicada en la dirección de memoria contenida en la variable de puntero que situamos a continuación. Por ejemplo si m contiene la dirección de memoria de la variable cont, entonces:

q = *m;

colocará el valor de cont en q. Siguiendo el ejemplo q tendrá un valor de 100, ya que el valor de cont era 100.

Las variables que vayan a contener punteros se han de declarar como tales. La declaración general de dichas variables se realiza colocando un * delante del nombre de variable.

Por ejemplo:

char *c;

Aquí la variable c no es un caracter, sino un puntero a caracter, es decir contiene la dirección de memoria de una variable tipo caracter.

Manejando fuentes TrueType en GRRLIB

Como os decía antes, en Wii no es tan sencillo como en un PC hacer un "Hola mundo". Lo primero que necesitamos para hacer nuestro Hola Mundo es lo que llamamos una fuente True Type.

¿Que es una fuente True Type?, pues es una fuente de letras que representa dichas letras mediante vectores o líneas.
Sin ir más lejos Windows utiliza numerosas fuentes True Type que podemos encontrar dentro de la carpeta Windows (podéis buscar los archivos "*.ttf" con el buscador de archivos), aunque podemos encontrar muchas más gratis o de pago a través de internet.
En este tutorial vamos a usar la fuente truetype "verdana.ttf" que incluyo en el paquete que adjunto al mismo. Lo que vamos a hacer es hacer que nuestro compilador incluya la fuente truetype dentro mismo del programa.
Para ello crearemos la carpeta data dentro de la carpeta de nuestro proyecto y copiaremos el archivo verdana.ttf dentro de dicha carpeta.
Debido a que nuestro archivo makefile está configurado para ello, nuestro compilador convertirá en binario el archivo verdana.ttf y creará una variable conteniendo su información que podremos usar en nuestro programa. 

Para poder usar dicha variable tendremos que incluir al principio de nuestro programa la siguiente línea:

#include "verdana_ttf.h"

El archivo verdana_ttf.h ha sido creado de forma automática por nuestro compilador con las variables verdana_ttf y verdana_ttf_size, que contienen la información de la fuente y su tamaño respectivamente.

Como norma general el compilador creará un archivo con el mismo nombre que el archivo de fuente, sustituyendo el "." por un guión bajo y añadiendole ".h". Los nombres de las variables, como habéis podido comprobar siguen reglas similares.

Una vez tenemos la información del archivo en la variable verdana_ttf no la podemos usar directamente la convertiremos con GRRLIB_LoadTTF cuya sintaxis es como sigue:

GRRLIB_ttfFont* GRRLIB_LoadTTF ( const u8 *file base, s32 file size )
Carga fuente TTF desde una variable en memoria.
 
Parametros
file_base Buffer con los datos del archivo TTF.
file_size Tamaño del Buffer TTF
 
Devuelve
Una variable tipo GRRLIB_ttfFont.
En nuestro código declaramos la variable myFont como un puntero a un tipo de variable GRRLIB_ttfFont que es el tipo de variables que utiliza GRRLIB para guardar las fuentes TrueType.
El resultado de la llamada a la función GRRLIB_LoadTTF es un puntero de tipo GRRLIB_ttfFont que es guardado en dicha variable, y los parámetros que le pasamos para obtener dicho puntero son, una posición de memoria donde tenemos el archivo TrueType y su tamaño. Es decir las variables verdana_ttf y verdana_ttf_size respectivamente.
Una vez hecho ésto ya tendremos preparada nuestra variable myFont para usar posteriormente y poder mostrar textos con la fuente "Verdana" en cualquier parte de nuestro programa.

Ya dentro del cuerpo del bucle usaremos dicha variable para mostrar un texto en pantalla con la función GRRLIB_PrintfTTF. Dicha función tiene el siguiente formato:

void GRRLIB PrintfTTF ( int x, int y, GRRLIB_ttfFont *myFont, const char *string, 
	unsigned int fontSize, const u32 color )	
Función que imprime un texto con una fuente TTF
 
Parametros:
x			Coordenada x de la esquina superior izquierda del texto
y			Coordenada y de la esquina superior izquierda del texto.
myFont		Una fuente TTF.
string		Texto a mostrar.
fontSize 	Tamaño en puntos de la fuente
color		Color del texto en formato RGBA

En dicha función le debemos pasar las coordenadas de la fuente, el própio texto a mostrar, el tamaño en puntos de la fuente y por último el colo en formato RGBA.

El formato RGBA es más cómodo de lo que puede parecer a simple vista y consiste en cuatro pares de dígitos en hexadecimal. Para explicar como se codifican utilizaremos el valor para el blanco (0xFFFFFFFF) como ejemplo:

Es decir codificaremos los colores con sus componentes RGB, usando valores de 0 a FF para dichos componentes.

El último componente (el canal Alfa), nos servirá para hacer transparencias. Cuanto más próximo a FF esté el valor más opaco será el texto.

Algunos ejemplos de colores básicos serían:

Rojo: 0xFF0000FF

Verde: 0x00FF00FF

Azul: 0x0000FFFF

Amarillo: 0xFFFF00FF (mezcla de rojo y verde)

Magenta: 0xFF00FFFF (mezcla de rojo y azul)

En general es muy útil utilizar un programa de dibujo como GIMP, entrando en el editor de colores, para buscar el valor de los componentes que tiene el color que queremos utilizar.

Para terminar y justo antes de la instrucción GRRLIB_Exit() añadiremos la instrucción GRRLIB_FreeTTF(myFont) que liberará la memoria usada por la fuente TrueType.

El programa final quedaría como sigue:

#include <grrlib.h>
#include <stdlib.h>
#include <wiiuse/wpad.h>
#include "verdana_ttf.h"
 
int main(int argc, char **argv) {
 
	// Inicializar gráficos
	GRRLIB_Init();
 
	// Inicializar wiimotes
	WPAD_Init();
 
	GRRLIB_ttfFont *myFont = GRRLIB_LoadTTF(verdana_ttf, verdana_ttf_size); // lo convertimos al formato usado por GRRLIB
 
    // Bucle sin fin
	while(1) {
 
        WPAD_ScanPads();  // Leer mandos
 
        // Si pulsamos home salimos del bucle
        if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME)  break;
 
        GRRLIB_PrintfTTF(10,10, myFont, "Hola mundo", 20, 0xFFFFFFFF);
 
 
        GRRLIB_Render();  // Refrescamos la pantalla
    }
 
	GRRLIB_FreeTTF (myFont); // Liberamos la fuente truetype
 
//	}
    GRRLIB_Exit(); // Liberamos memoria
 
    exit(0);  // Usar exit para salir del program (no usar return desde el main)
}

Ya solo nos queda compilar nuestro programa tal y como vimos en el capitulo anterior.

Espero que no os hayáis cansado, ya que el principio siempre es lo más complicado. Poco a poco veréis que os va costando menos.

4.51724
Tu voto: Ninguno Votos totales: 4.5 (29 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

nada

nada

He añadido a GRRLIB la

He añadido a GRRLIB la función (sacada del foro de GRRLIB) para poder hacer GRRLIB_PrintfTTF con texto formateado, por ejemplo:

int myVar = 5;
//
GRRLIB_PrintfTTF2(10,10,  myTTF, 20, 0xFFFFFFFF, "myVar vale %i", myVar);

Los parámetros son estos;

GRRLIB_PrintfTTF2(int x, int y, GRRLIB_ttfFont *myFont, unsigned int fontSize, const u32 color, const char *string, ...);

 

Descarga: http://www.mediafire.com/?krk9avzq9z8co48

 

Por cierto, buenisimos tutos!

 

Imagen de csar.ale

:O

Buen Tutorial, logre mostrar un lindo Hola Mundo en la pantalla en color verde transparentado xD.

Saludos!!

GRRLIB

Pues muchas gracias por tu respuesta.

En cuanto al ensamblador  solamente que al ensamblador te generará ya directamente el ejecutable en wii, el dol por ejemplo.

Disculpa me he equivocado de termino no era compilador lo que quería decir sino ensamblador que traducjerá lo que programas a ensamblador de powerpc y generará automáticamente el archivo dol.

 

Verificaré la info que me has puesto, muchas gracias.

Y es un placer seguir leyendote.

Un cordial saludo.

cjv99.

Imagen de miguelseiya

Os dejo//

Un compilador mas basico:

 

make
clean

 

Ese os compilara mejor.

Imagen de wilco2009

De nada. Tambien he

De nada. Tambien he descubierto otra manera de hacer parte de un programa en ensamblador.

Tienes un ejemplo en el fuente del Geko_OS: http://wiibrew.org/wiki/Gecko_OS

Basicamente hacer un archivo .s con el programa en ensamblador y luego lo conviertes en biblioteca tal y como viene en el archivo makecodehandler.bat de la carpeta codehandler.

Despues tienes un ejemplo de como lo llama en el archivo apploader.c.

 

saludos.


Curso aplicado de GRRLIB - Parte 1 - Parte 2 - Parte 3 - Parte 4 - Parte 5 - Parte 6 - Parte 7 - Parte 8 - Parte 9 - Parte 10 - Parte 11

Profundizando en los mandos de la Wii - Parte 1 - Parte 2 - Parte 3  - Parte 4 (Balanceboard) - Parte 5 (Miis) 

Homebrew - WiiTriis -  LifemiiWii

GRRLIB

Felicidades wilco2009, ya estaba esperando la siguiente parte.

La verdad espero que este curso avance rápido a cosas más interesantes y difíciles como algún pequeño pong, ya que de momento em resulta muy liviano; Me imagino que será que llevo mucho tiempo programando en ensamblador y programar juegos en ensamblador se me hace eterno, teniendo que optimizar código,etc.

Por estoy leyendo las partes con interés, pero esperando que avance más, para poder hacer más tipo juego openborg y similar.

Por cierto, ¿ conoces alguna forma de programar en ensamblador para wii o algún compilar para crear el ejecutable para wii?

Un cordial saludo y de nuevo un placer volver a leer tu curso.

cjv99

Imagen de wilco2009

La verdad es que a veces a mi

La verdad es que a veces a mi me cuesta no ir más deprisa, pero es que hay gente de muchos niveles diferentes y hay que adaptarse a todo el mundo. De todas formas, a partir de a siguiente entrega empieza a ir un poco más deprisa.

En cuanto al ensamblador, que yo sepa la única manera de insertar código en ensamblador del powerpc en un programa en C para wii es utilizar la función __asm ("").

Otra opción es buscar un ensamblador de powerpc genérico que igualmente te crearía el ejecutable. Yo conozco algo el ensamblador del la familia 8086, pero no tengo conocimientos de ensamblador de powerpc.

No sé a que te refieres exactamente con algún compilador para crear un ejecutable para wii. El devkitpro es un compilador de C que crea ejecutables para wii, que son los archivos .dol.

 

EDITO: Por si te interesa, he encontrado esto: http://wiibrew.org/wiki/Assembler_Tutorial

Haciendo pruebas te puedo decir que puedes introducir varias líneas de código de la manera en que lo hago yo en este ejemplo:

__asm("lwz 3,10(4)\n\t"

" lwzx 3,4,5\n\t");

Es decir concatenando cadenas e insertando los retornos de carro al final de cada cadena. Espero que te sea de ayuda.

 


Curso aplicado de GRRLIB - Parte 1 - Parte 2 - Parte 3 - Parte 4 - Parte 5 - Parte 6 - Parte 7 - Parte 8 - Parte 9 - Parte 10 - Parte 11

Profundizando en los mandos de la Wii - Parte 1 - Parte 2 - Parte 3  - Parte 4 (Balanceboard) - Parte 5 (Miis) 

Homebrew - WiiTriis -  LifemiiWii

Gracias

Esperando que reparen el resto de la entrada.

 

Punteros!!!!! uffff esto si que me costo entenderlo xD

Imagen de wilco2009

Ánimo compi, que con un poco

Ánimo compi, que con un poco de esfuerzo tambien se entienden los punteros.

 

Imagen de wilco2009

IMPORTANTE!!!!

Diculpad, pero por algún problema técnico ha salido cortado el curso.

Ya he pedido a un editor que me lo modifique. Espero que en breve salga correctamente.

 


Curso aplicado de GRRLIB - Parte 1 - Parte 2 - Parte 3 - Parte 4 - Parte 5 - Parte 6 - Parte 7 - Parte 8 - Parte 9 - Parte 10 - Parte 11

Profundizando en los mandos de la Wii - Parte 1 - Parte 2 - Parte 3  - Parte 4 (Balanceboard) - Parte 5 (Miis) 

Homebrew - WiiTriis -  LifemiiWii

Imagen de Navyivan

Como lo Pruebo?

Yo utilizo el metodo de copiar y pegar y correrlo desde HBC, pero que es lo que copio el dol?, el elf? o que archivos necesito copiar?

 

Imagen de wilco2009

Tienes que copiar el .dol. Te

Tienes que copiar el .dol.

Te copio la parte de la segunda entrega donde lo explica:

"2. Copiandolo manualmente a la tarjeta SD y ejecutándolo desde el HBC.

Éste método es también manual, pero tiene la ventaja de que nos permitirá incluir nuestra aplicación en el menú del HBC. Para ello debemos crear una nueva carpeta dentro de la carpeta "apps" de nuestra SD. Dentro de esa carpeta copiaremos nuestro archivo .dol y le cambiaremos el nombre llamándolo "boot.dol".

Adicionalmente necesitaremos otros dos archivos que son:

  • icon.png: debe ser una imagen png de 128x48 píxeles y que es el icono que aparecerá en el menú.
  • meta.xlm: es un archivo en formato xlm en el que deberemos escribir todos los datos del programa, incluyendo nombre, descripción, número de versión, etc....Este archivo lo podemos editar con un editor de texto convencional."

Curso aplicado de GRRLIB - Parte 1 - Parte 2 - Parte 3 - Parte 4 - Parte 5 - Parte 6 - Parte 7 - Parte 8 - Parte 9 - Parte 10 - Parte 11

Profundizando en los mandos de la Wii - Parte 1 - Parte 2 - Parte 3  - Parte 4 (Balanceboard) - Parte 5 (Miis) 

Homebrew - WiiTriis -  LifemiiWii

Imagen de JAVIenigma

Listo, creo que ya está

Listo, creo que ya está solucionado. Echa un ojo y me dices.

Saludos!

Imagen de wilco2009

Muchas gracias Javi, Ya está

Muchas gracias Javi, Ya está todo correcto.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.