/*Autor :KHLOROSDAIMON 13/6/2006 Entorno de desarollo -> devkitPPC Release 12 :http://sourceforge.net/project/showfiles.php?group_id=114505&package_id=124208 Linux 2.6.17 libogc 20050812 gcemu 0.3 (para probar los ejecutables): http://gcemu.dcemu.co.uk/ Programa simple de ejemplo de como usar las librerias libogc para usar las funciones basicas de la consola tales como la inicializacion y uso del video y el sistema de mandos, creado basicamente por que no encontré ejemplos lo suficientemente claros y documentados y que al ser demasiado "liosos" no dan una idea clara de los pasos a seguir para tener lo minimo funcionando */ #include <ogc/video.h> #include <gccore.h> #include <ogcsys.h> #include <stdio.h> #include <stdlib.h> #include <string.h> //los prototipos de funciones de iplfont.h fueron copiados del proyecto de hu-go! y modificados para usar un framebuffer sencillo(en el original era uno doble) #include <iplfont.h> //VARIABLES GLOBALES extern u32* frame_buffer =(u32*)0xC0500000;//asignar memoria de 32 bits para el framebuffer(memoria auxiliar //donde se guarda la matriz de puntos de la pantalla GXRModeObj *vmode; //variable de tipo "modo de video" (definida en video_types.h de libogc) #define AVANCE 10 int colores[10] = {//las variables estan definidas en color.h (de libogc) como valores RGB en hexadecimal //ej:0xFFFFFFFF para el blanco COLOR_BLACK,COLOR_WHITE, COLOR_BLUE,COLOR_GREEN, COLOR_OLIVE,COLOR_NAVY, COLOR_PURPLE,COLOR_TEAL, COLOR_YELLOW,COLOR_RED }; //prototiposd de las funciones : // int iniciar_gc(void); int iniciar_gcvideo(void); void pintar_pantalla(int color); int mover(int *x,int *y); void pintar_pantalla(int color){ // pinta todo del mismo color recorriendo uno a uno los bits del framebuffer y asignandole el valor hexadecimal del color que queremos int x,y; for(y=0;y<480;y++){ for(x=0;x<320;x++){ frame_buffer[x+320*y]=color; } } } int iniciar_gcvideo(void) { //usamos los metodos del objeto VIDEO de la libreria de video de libogc VIDEO_Init (); //Encender video vmode = &TVNtsc480IntDf; //60HZ 480i , elegimos el modo de video VIDEO_Configure (vmode); // "y se lo enviamos al chip grafico" VIDEO_SetNextFramebuffer(frame_buffer);//asignar la memoria del framebuffer al flipper //de esta manera al hacer un cambio sobre la memoria del framebuffer // usando el metodo VIDEO_FLUSH();actualizamos la memoria del chip grafico // mostrandonos su contenido en pantalla return 0; } int iniciar_gc(void) { iniciar_gcvideo(); PAD_Init(); VIDEO_SetPostRetraceCallback(PAD_ScanPads);//esto no se realmente lo que hace,solo se que es necesario // para que detecte el movimiento de los controles return 0; } //Funcion que actualiza la posición del objeto en la pantalla int mover(int *x,int *y) { //usamos los metodos del objeto PAD de la libreria pad (pad.h) de libogc int i; if (( PAD_ButtonsHeld (0) & PAD_BUTTON_UP)) { *x-=AVANCE; } if (( PAD_ButtonsHeld (0) & PAD_BUTTON_LEFT)) { *y-=AVANCE; } if (( PAD_ButtonsHeld (0) & PAD_BUTTON_DOWN)) { *x+=AVANCE; } if (( PAD_ButtonsHeld (0) & PAD_BUTTON_RIGHT)) { *y+=AVANCE; } if ((PAD_ButtonsHeld (0) & PAD_BUTTON_A)) { //Hace el "Disparo" :p en las coordenadas actuales write_font(*y+100,*x," PUMPUMPUM"); } if ((PAD_ButtonsHeld (0) & PAD_BUTTON_B)) { //si pulsas B la pantalla cambia de color :) for (i=1;i<10;i++) { pintar_pantalla(colores[i]); } } } int main(void) { iniciar_gc(); VIDEO_WaitVSync(); pintar_pantalla(COLOR_WHITE); init_font(); VIDEO_WaitVSync(); int x=244; //coordenada vertical (centro) int y=320; //coordenada horizontal (centro) while (1) { //BUCLE INFINITO pintar_pantalla(COLOR_WHITE); mover(&x,&y); write_font(y,x,"HOLASOYUNANAVECITA"); VIDEO_Flush(); //enviar memoria del framebuffer a flipper. VIDEO_WaitVSync();//esperar al refresco de pantalla para dibujar } return 0; }