[Ejemplo explicado]Hello World[Semi-tutorial]

Pues , como no veo mucha información sobre la liboGC (al menos en español), pues he decidido que qué menos que aprendamos ha hacer un Hello World explicando lo que hace cada función.

A partir de este ejemplo, puedes poner texto en la wii [ginyo]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <ogcsys.h>
#include <gccore.h>
#include <wiiuse/wpad.h>

//incluimos librerias

static void *xfb = NULL;
static GXRModeObj *rmode = NULL;

int main(int argc, char **argv) {//iniciamos la función "main()"

   VIDEO_Init();//Iniciamos el video
   PAD_Init();//Iniciamos el pad
   WPAD_Init();//Iniciamos wiimote
   
   
   rmode = VIDEO_GetPreferredMode(NULL);//Esto recibe el tipo de "monitor" y la configuración que tienes en la wii

   xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));//Inicia el buffer


   CON_InitEx(rmode, 20,30,rmode->fbWidth-40,rmode->xfbHeight-60);//Inicia el modo consola

   VIDEO_ClearFrameBuffer(rmode,xfb,COLOR_WHITE);//Borde de la pantalla, color blanco
   VIDEO_Configure(rmode);//Le dices a la consola que modo de vídeo que usar y la pantalla se configura según esto
   VIDEO_SetNextFramebuffer(xfb);//Le dices donde guardar el siguiente buffer
   VIDEO_SetBlack(FALSE);//Sirve para poner pantalla en negro
   VIDEO_Flush();//Vaciamos el buffer
   VIDEO_WaitVSync();

   if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
   
                            /*TEXTO*/
                   
                   
    printf(" \n\n");//2 saltos de línea
   
   printf("Hola mundo!\n");/*ponemos texto y un salto de línea para que lo lea.
La función printf no pone el texto en el monitor, lo almacena en el buffer y , con el salto de línea,
conseguimos que salga en ella*/
   printf(" \n\n");//2 saltos de línea

    printf("Hola mundo realizado por Rigle y explicado por el con ayuda de Waninkoko y marcan\n");
   printf("Gracias a Marcan y demas gente por la liboGC, que hacen posible el homebrew en wii\n");


   while(1) {

      WPAD_ScanPads();//Inicia el escaneo de wiimotes
      u32 pressed = WPAD_ButtonsDown(0);
      if ( pressed & WPAD_BUTTON_HOME ) exit(0);//Si se pulsa el botón home se vuelve al menu de la wii
      VIDEO_WaitVSync();//Esperamos a que se haga un refresco de pantalla para comenzar el redibujado de pantalla
   }

   return 0;
}//Final del main


Dejo el pastie, para los que lo quieran ver mejor: http://pastie.org/212962

Agradezco a waninkoko su ayuda con las funciones desconocidas para mí y a marcan y demás por hacer una librería tan excelente.

Eso es todo. Espero que os guste.
[Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo] [Ooooo]
¡¡Gran trabajo, Rigle!!

Traducción de TWEWY, pAlib, ¡y ahora liboGC! XD
¿Es homebrew de GameCube o de Wii?
En teoría es de wii, pero no tengo metido ninguna libreria para wiimote, así que sería de GC, a mi parecer...
...pero intentaré meter con ayuda de un code que he visto de marcan el wiimote.(Espero que me deje...sino me las arreglaré para hacerlo lo más parecido, pero no igual)

EDIT: Me parece k e arreglado algo (gracias marcan)
Si tuviera tiempo, igual miraba de hacer algo, pero justo de exámenes no es plan.

Por lo que veo todo va sobre C, de eso se un poco... (programo DSPs) así que igual podría echarle un vistazo este verano si acabo la maldita carrera y el proyecto me deja tiempo.

Joer que me has picao! Así empecé con el Rat's life (concurso que hay de programar robots online, googlea) y acabé haciendo mi propia rata solo por ver que era capaz.

Saludotes.
Bueno, yo quiero tambien ayudar, y aunque no c mucho de esto, voy a incluir el ejemplo que viene con el ultimo devkit pro, que incluye el uso de librerias del wiimote..
#include <stdio.h>
#include <stdlib.h>
#include <gccore.h>
#include <wiiuse/wpad.h>

static void *xfb = NULL;
static GXRModeObj *rmode = NULL;

//---------------------------------------------------------------------------------
int main(int argc, char **argv) {
//---------------------------------------------------------------------------------

   // Inicializa el sistema de video
   VIDEO_Init();
   
   // Inicializa los mandos
   WPAD_Init();
   
   // Obtiene el modo de video preferido del sistema
   // Esto corresponde a las opciones en el system menu
   rmode = VIDEO_GetPreferredMode(NULL);

   // Asigna memoria para el display en la region no cacheada
   xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
   
   // Inicializa la consola. Requerida para printf
   console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
   
   // Configura los registros de video con el modo escogido
   VIDEO_Configure(rmode);
   
   // Le dice al hardware de video donde esta nuestra display memory
   VIDEO_SetNextFramebuffer(xfb);
   
   // Hace el display visible
   VIDEO_SetBlack(FALSE);

   // Limpia los cambios del registro de cambios para el hardware ..??
   VIDEO_Flush();

   // Espera a la configuracion de video para completar
   VIDEO_WaitVSync();
   if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();


   // La consola entiende los codigos de escape VT terminal ...?? Esta parte no la entiendo
   // Esto posiciona al cursor en la fila 2, columna 0
   // Podemos usar variables para este formato de codigos tambien..
   // e.g. printf ("\x1b[%d;%dH", row, column );
   printf("\x1b[2;0H");
   

   printf("Hello World!");

   while(1) {

      // Llamar la funcion WPAD_ScanPads cada lapso, esto lee los ultimos estados del control
      WPAD_ScanPads();

      // WPAD_ButtonsDown nos dice que botones fueron presionados en este lapso
      // Esto es un estado "one shot" el cual no arrancará hasta que el boton no sea soltado
      u32 pressed = WPAD_ButtonsDown(0);

      // Al presionar home, devuelve al homebrew channel o se sale de la aplicacion
      if ( pressed & WPAD_BUTTON_HOME ) exit(0);

      // Esperar al siguiente frame de pantalla...
      VIDEO_WaitVSync();
   }

   return 0;
}


Quiero aclarar que lo traducí a mano y segun lo que entendí cuando probé el ejemplo en mi wii..
A los comentarios que les puse "...??" me gustaria si me hicieran el favor de explicarmelos ya que no los entiendo...
Buff... si esto sigue así deberíamos ir pensando en abrir un foro de desarrollo exclusivamente para Wii xD
gracias, mañana intentare ahcer algunas cosillas xDD
DanielC valoro tu esfuerzo, pero preferiría que, en lugar de traducir los comentarios sin entender que hacen las funciones, te miraras y entendieras el código primero y luego lo explicaras con tus palabras, porque así aportarias algo :) Es una crítica amistosa [360º]
Los codigos de escape VT terminal son codigos de escape que permite hacer goto del cursor o cambiar el color de la fuente o el background, el terminal VT normalmente VT100 es un estandar de consola que puedes ver por ejemplo en cualquier consola (terminal, shell) de linux o incluso en el hyperterminal de windows.

// e.g. printf ("\x1b[%d;%dH", row, column );
printf("\x1b[2;0H");
Esto hace un posicionamiento del cursor en la fila 2, columna 0
Yo lo he explicado a mi manera, no lo he traducido.

Aparte, esto lo que hace, para gente que no lo entienda, es algo así como:

Vaciar un cubo de basura, llenarlo y sacar la basura y que se vea. [qmparto] [qmparto]
una dudilla, que hace exactamente VIDEO_Flush?
pho escribió:una dudilla, que hace exactamente VIDEO_Flush?


Sin saberlo con seguridad, pero teniendo ese nombre diria que es la funcion encargada de limpiar el buffer de la memoria de vídeo.
Según tenia entendido era lo de borrar el buffer...
...pero marcan sabe más que yo [Ooooo]
No, lo que hace es actualizar todos los registros de la GPU con los valores que acabas de configurar, y asegurarse de que han quedado activados.
y si hiciese un fflush(GRRLIB_Buffer) vaciaría el buffer de GRRLIB¿? (el de grrlib como cualquier otro buffer que use)

EDIT (despues de leer a marcan =P): Y para vaciar uno que hay que hacer?
Ejemplo actualizado , ahora con wiimote XD
pho escribió:y si hiciese un fflush(GRRLIB_Buffer) vaciaría el buffer de GRRLIB¿? (el de grrlib como cualquier otro buffer que use)

EDIT (despues de leer a marcan =P): Y para vaciar uno que hay que hacer?


Los buffer no se vacian. Se llenan con otra cosa.
oyzzo escribió:DanielC valoro tu esfuerzo, pero preferiría que, en lugar de traducir los comentarios sin entender que hacen las funciones, te miraras y entendieras el código primero y luego lo explicaras con tus palabras, porque así aportarias algo :) Es una crítica amistosa [360º]

Pues si bien es cierto que la mayoria los traduci, si los entiendo, pero pues, como no soy muy experto en el tema, decidi hacerlo asi porque no quiero conducir a fallos a alguien xD..
Igual no te preocupes, que nuestro amigo rigle ya ha actualizado el primer post con las librerias del wiimote incluidas...
Rodries, muchas gracias, ahora me ha quedad claro...
Muchas gracias a los dos..
Aun tengo que solucionar algún bug, pero creo que van...
Como jode no saber nada de programación C/C++ :S
No te creas que yo sé mucho...
...sé lo suficiente XD
Pues con lo que sabes tu me llega eh jaja, bueno a ver si van sacando algún tuto para novatos y poco a poco voy aprendiendo u.u, es muy difícil?
Yo empecé muy mal (con PaLib para nds...un desastre...demasiado fácil...como si fuera un pais rosa XD)
Después me puse con C y liboGC ... habrá pasado un mes desde que empecé.

No es mucho, pero las funciones las conoces, y para hacer algun homebrew y alguna app te basta XD
Repito que en esos tutoriales enseño palib, una libreria, no C u.u...
Plata escribió:Repito que en esos tutoriales enseño palib, una libreria, no C u.u...



Ya , pero me refiero que no empiece con palib, que empiece con C
25 respuestas