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.
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.
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:
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;
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:
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.
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.
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.
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.
Comentarios
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:
Los parámetros son estos;
Descarga: http://www.mediafire.com/?krk9avzq9z8co48
Por cierto, buenisimos tutos!
: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.
Os dejo//
Un compilador mas basico:
Ese os compilara mejor.
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
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
Ánimo compi, que con un poco
Ánimo compi, que con un poco de esfuerzo tambien se entienden los punteros.
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
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?
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:
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
Listo, creo que ya está
Listo, creo que ya está solucionado. Echa un ojo y me dices.
Saludos!
Muchas gracias Javi, Ya está
Muchas gracias Javi, Ya está todo correcto.