› Foros › Multiplataforma › Desarrollo
Hola [chiu]
Ahora que ando en practicas tengo mas tiempo para poder ponerme con lo que de verdad me gusta o mejor dicho, entusiama que no es otra cosa que la programacion de videojuegos y encima lo mio parece que es como para estudiarlo porque no, no podria decantarme por psp o ds donde la documentacion es mayor...mi fijacion es diseñar algo para GC (o Wii que para el caso viene a ser lo mismo gracias a sus arquitecturas).
Como ya he comentado, el mayor problema de las librerias existentes para GC, las LibOGC es que no hay apenas documentacion y me ha sorprendido que en la ultima y muy reciente actualizacion de las mismas, ya directamente ha desaparecido la poca documentacion que traian antes...anda que...
Creo este hilo para que todo aquel que quiera iniciarse en la programacion para una de estas plataformas o conseguir esa informacion que parece no existir, pueda sacarle toda la utilidad posible. Anteriormente ya habia creado varios hilos acerca de la scene de GC que podeis encontrar en este mismo subforo con solo poner KFR en la busqueda pero con este pretendo digamos crear una verdadera base de datos y post de debate donde poder ayudarnos entre todos los interesados y por eso mismo, no tengo por el momento intencion de colocar esta info en el Wiki porque el mayor potencial de recopilacion y ayuda se da aqui en el foro gracias al dialogo entre usuarios...pero eso no quita que cuando se tengan una informacion consistente y decente, me tome un tiempo para pasarlo todo de forma ordenada al Wiki.
Primero como no, comenzar hablando acerca de los lenguages de programacion de que se hara uso a la hora de programar para estas plataformas de Nintendo. Estos vienen a ser C, C++ y la variante C#.
La verdad que casi cualquier tipo de juego o en realidad, cualquier tipo de juego puede ser desarrollado en su integridad en C sin necesidad de hacer uso de la orientacion a objetos pero con la practica uno se dara cuenta que el tema de herencias y clases facilita mucho la papeleta.
Basicamente lo que se necesita para desarrollar para GC/Wii es un editor de texto plano (por ejemplo se podria usar el Word pero habria que desactivar las mil pijaditas que tiene) como podria ser el mismo bloc de notas. Yo por mi parte hago uso del Programmer's Notepad.
Tambien se tienen que tener unas librerias especificas para el sistema en cuestion para el que se vaya a programar y como no, por ultimo un compilador...tambien para dicha plataforma.
En este caso existen dos opciones...digamos que una es mas casera y la otra viene mas preparada ya "de fabrica".
1) Juan Palomo Rulez xD: Aqui he de hablar de una opcion que era de la que yo mismo hacia uso hasta hace poco pero la verdad...es una opcion que ya en si tiene poco o ningun futuro y creo que con poner esto se entendera el porque "DevKitCube release 1 - Thursday 28 August 2003"... pero aun asi, quien quiera iniciarse en programacion para GC puede que prefiera esta opcion puesto que desde mi punto de vista, me parece un poco mas simple y comoda y por eso mismo aqui dejo el link a otro de mis hilos donde explico a fondo como hacer uso de esta opcion.
2) To bonito ello: En esta opcion nos encontramos con DevkitPro que es una multi_herramienta que nos provee de todo lo necesario para poder programar para plataformas tan diferentes como GC, PSP, DS e incluso GP32. Ademas como se puede leer......los usuarios que utilicen Windows lo tienen mas facil que nadie y es que con solo descargarse y ejecutar el "devkitPro Updater" ya uno estara seguro de que todo quedara instalado como tiene que ser.Windows users should use the devkitPro installer updater to obtain devkitPPC and the support libraries, this ensures that everything is installed properly. For other platforms instructions are provided on the wiki Getting Started page which includes links for the windows install package.
Ire rellenando poco a poco esta seccion con diferentes ejemplos y todo ello en castellano e intentando que las explicaciones sean sencillas y faciles de comprender.
Colores ya predefinidos en las LibOGC..[size=90][b]COLOR_BLACK (0x00800080)
COLOR_MAROON (0x266A26C0)
COLOR_GREEN (0x4B554B4A)
COLOR_OLIVE (0x7140718A)
COLOR_NAVY (0x0EC00E75)
COLOR_PURPLE (0x34AA34B5)
COLOR_TEAL (0x59955940)
COLOR_GRAY (0x80808080)
COLOR_SILVER (0xC080C080)
COLOR_RED (0x4C544CFF)
COLOR_LIME (0x952B9515)
COLOR_YELLOW (0xE100E194)
COLOR_BLUE (0x1DFF1D6B)
COLOR_FUCHSIA (0x69D469EA)
COLOR_AQUA (0xB2ABB200)
COLOR_WHITE (0xFF80FF80)
COLOR_MONEYGREEN (0xD076D074)
COLOR_SKYBLUE (0xC399C36A)
COLOR_CREAM (0xFA79FA82)
COLOR_MEDGRAY (0xA082A07F)[/b][/size]
Esta seccion esta destinada a cubrir todo tipo de dudas que puedan surgir sobre la programacion en GC/Wii.. como hacer uso de tal funcion de la libreria, como se podria plantear una solucion medianamente logica a un problema que se ha presentado, que error he cometido al crear una funcion, como conseguir crear tal efecto, etc... pero por favor, que nadie venga y pegue 500 lineas de codigo y diga "Que esta mal?" porque hombre, una cosa es ayudar y otra hacer el trabajo entero
Ire actualizando esta seccion con las dudas y respuestas que vayan apareciendo o algunas otras que crea que puedan ser de interes general.------------------
By KFR: Pregunta ¿?...
- No encuentro nada relacionado con la forma en que se ha de trabajar con tiles en las LibOGC y me gustaria saber si de forma general, todas las librerias mantienen la misma estructura a la hora de trabajar con estos o por el contrario tendre que seguir buscando?
By ...: Respuesta ¡!...
- ..
~~~~~
By PiratePila: Pregunta ¿?...
- ¿ Cómo puedo poner imagenes (sea en BMP o otro formato) en un archivo ??
By KFR: Respuesta ¡!...
- [color=#ff88ff]Pulsa aqui para ir a la pagina con la explicacion [/color]
By PiratePila: Pregunta ¿?...
- ¿ Donde consigo el devkitcube ?
By KFR: Respuesta ¡!...
- En la seccion Links de Interes tienes un link a otro hilo mio ( SCENE GC: homebrew, media, modchips... ) y ahi tienes una link a una descarga directa
By PiratePila: Pregunta ¿?...
- ¿ la imagen puede tener el tamaño y peso (KB) que a mi me de la gana o hay límites ?
By KFR: Respuesta ¡!...
- Si, puedes cargar desde un minisprite para hacer particulas o algo muy peque hasta fondos para un scroll, solo que como he comentado creo recordar que siempre han de ser sus medidas en multiplos de 2.
By PiratePila: Pregunta ¿?...
- Otra cosa, el ultimo codigo tendría que copiarlo tal cual ?
By KFR: Respuesta ¡!...
- Si y si miras al final de la explicacion tienes un link para descargarte un ejemplo con todo lo comentado en la explicacion.
struct ssprite{
int x; -> posicion X en el espacio de tu imagen en pantalla
int y; -> ... y ...
int width; -> ancho de la imagen
int height; -> alto...y se puede poner "SPRITE_HEIGHT"/"SPRITE_WIDTH" o la cantidad directamente.
int frame; -> Frame inicial que generalmente sera 0
int frames; -> Numero total de frames... que sera NUM_FRAMES o directamente poner aqui la cifra y pasar de declarar NUM_FRAMES.
}sprite;
void BlitScreen(){ // Draw everything
int x,y,bitmappos;
for(y=sprite.y;y<sprite.y+(sprite.height/sprite.frames);y++){
for(x=sprite.x;x<sprite.x+(sprite.width/2);x++){
bitmappos=x-sprite.x+((y-sprite.y)*sprite.width)/2+(sprite.width/2)*(sprite.height/sprite.frames)*sprite.frame;
if(sprite_Bitmap[bitmappos]!=COLOR_TRANSPARENT)
fb[x+320*y]=sprite_Bitmap[bitmappos];
}
}
}
En la seccion Links de Interes tienes un link a otro hilo mio ( SCENE GC: homebrew, media, modchips... ) y ahi tienes una link a una descarga directaPiratePila escribió:¿ Donde consigo el devkitcube ?
Si, puedes cargar desde un minisprite para hacer particulas o algo muy peque, hasta fondos para un scroll, solo que como he comentado creo recordar que siempre han de ser sus medidas en multiplos de 2.PiratePila escribió:Y otra cosa; ¿ la imagen puede tener el tamaño y peso (KB) que a mi me de la gana o hay límites ?
Si y si miras al final de la explicacion tienes un link para descargarte un ejemplo con todo lo comentado en la explicacion.PiratePila escribió:EDITO: Otra cosa, el ultimo codigo tendría que copiarlo tal cual ?
PiratePila escribió:Creo que se refiere a que se muestre en pantalla texto e imagenes a la vez.
int main(int argc, char **argv) {
VIDEO_Init();
PAD_Init();
switch(VIDEO_GetCurrentTvMode()) {
case VI_NTSC:
rmode = &TVNtsc480IntDf;
break;
case VI_PAL:
rmode = &TVPal528IntDf;
break;
case VI_MPAL:
rmode = &TVMpal480IntDf;
break;
default:
rmode = &TVNtsc480IntDf;
break;
}
xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
VIDEO_Configure(rmode);
VIDEO_SetNextFramebuffer(xfb);
VIDEO_SetBlack(FALSE);
VIDEO_Flush();
VIDEO_WaitVSync();
if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
sprite.height=SPRITE_HEIGHT;
sprite.width=SPRITE_WIDTH;
sprite.frames=NUM_FRAMES;
sprite.frame=0;
sprite.x=50;
sprite.y=50;
//printf("Pintando una imagen\n");
while(1) {
VIDEO_WaitVSync();
frames++;
ClearScreen(COLOR_BLACK); // Paint the screen black
BlitScreen(); // Draw paddles and ball
if(frames%8==0){ // Switch picture every 8th frame
sprite.frame++;
if(sprite.frame==sprite.frames)
sprite.frame=0;
}
}
return 0;
}
KFR escribió:frontier eso es porque el ejemplo hace uso del compilador devkitcube que ya he comentado en el mensaje principal del post que lleva mucho mucho sin actualizarse y no tiene pinta de hacerlo nunca mas pero en si lo que tienes que hacer es usar ese mismo codigo pero compilandolo con el make que trae el propio devkitpo ya creado en la seccion/carpeta examples o ejemplos o como ponga, entras en Gamecube o Wii y tienes una plantilla de proyecto con su make y el programmer's notepad ya configurado para darle a Make y pista
$ make
linking ... jpgwiki.elf
c:/devkitpro/devkitppc/bin/../lib/gcc/powerpc-gekko/4.2.3/../../../../powerpc-ge
kko/bin/ld.exe: cannot find -ljpeg
collect2: ld returned 1 exit status
make[1]: *** [/c/devkitpro/examples/wii/jpgwiki/jpgwiki.elf] Error 1
make: *** [build] Error 2
#include
#include
#include
#include
#include
#include
static void *xfb = NULL;
static GXRModeObj *rmode = NULL;
int main(int argc, char **argv) {
VIDEO_Init();
PAD_Init();
PAD_Sync ();
switch(VIDEO_GetCurrentTvMode()) {
case VI_NTSC:
rmode = &TVNtsc480IntDf;
break;
case VI_PAL:
rmode = &TVPal528IntDf;
break;
case VI_MPAL:
rmode = &TVMpal480IntDf;
break;
default:
rmode = &TVNtsc480IntDf;
break;
}
extern GXRModeObj TVNtsc240Ds; /*!< Video and render mode configuration for 240 lines,singlefield NTSC mode */
extern GXRModeObj TVNtsc240DsAa; /*!< Video and render mode configuration for 240 lines,singlefield,antialiased NTSC mode */
extern GXRModeObj TVNtsc240Int; /*!< Video and render mode configuration for 240 lines,interlaced NTSC mode */
extern GXRModeObj TVNtsc240IntAa; /*!< Video and render mode configuration for 240 lines,interlaced,antialiased NTSC mode */
extern GXRModeObj TVNtsc480IntDf; /*!< Video and render mode configuration for 480 lines,interlaced,doublefield NTSC mode */
extern GXRModeObj TVNtsc480IntAa; /*!< Video and render mode configuration for 480 lines,interlaced,doublefield,antialiased NTSC mode */
extern GXRModeObj TVNtsc480Prog; /*!< Video and render mode configuration for 480 lines,progressive,singlefield NTSC mode */
extern GXRModeObj TVMpal480IntDf; /*!< Video and render mode configuration for 480 lines,interlaced,doublefield,antialiased PAL mode */
extern GXRModeObj TVPal264Ds; /*!< Video and render mode configuration for 264 lines,singlefield PAL mode */
extern GXRModeObj TVPal264DsAa; /*!< Video and render mode configuration for 264 lines,singlefield,antialiased PAL mode */
extern GXRModeObj TVPal264Int; /*!< Video and render mode configuration for 264 lines,interlaced PAL mode */
extern GXRModeObj TVPal264IntAa; /*!< Video and render mode configuration for 264 lines,interlaced,antialiased PAL mode */
extern GXRModeObj TVPal524IntAa; /*!< Video and render mode configuration for 524 lines,interlaced,antialiased PAL mode */
extern GXRModeObj TVPal528Int; /*!< Video and render mode configuration for 528 lines,interlaced,antialiased PAL mode */
extern GXRModeObj TVPal528IntDf; /*!< Video and render mode configuration for 264 lines,interlaced,doublefield antialiased PAL mode */
extern GXRModeObj TVPal574IntDfScale;
xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
VIDEO_Configure(rmode);
VIDEO_SetNextFramebuffer(xfb);
VIDEO_SetBlack(FALSE);
VIDEO_Flush();
VIDEO_WaitVSync();
if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
printf("Hello World!\n");
console_setpos(40,120);
console_setcolor(COLOR_RED, COLOR_BLUE);
printf("And Good Bye!\n");
while(1) {
VIDEO_WaitVSync();
PAD_ScanPads ();
if (PAD_ButtonsDown(PAD_CHAN0) & PAD_BUTTON_A)
printf("Button A Pressed!\n");
if (PAD_ButtonsHeld(PAD_CHAN0) & PAD_BUTTON_B)
{
printf("Button B Held!\n");
printf("StickX: %d; StickY: %d\n", (s32)PAD_StickX(PAD_CHAN0), (s32)PAD_StickY(PAD_CHAN0));
printf("SubStickX: %d; SubStickY: %d\n", (s32)PAD_SubStickX(PAD_CHAN0), (s32)PAD_SubStickY(PAD_CHAN0));
printf("TriggerL: %u; TriggerR: %u\n", (u32)PAD_TriggerL(PAD_CHAN0), (u32)PAD_TriggerR(PAD_CHAN0));
}
if (PAD_ButtonsDown(PAD_CHAN0) & PAD_BUTTON_X)
PAD_ControlMotor (PAD_CHAN0, PAD_MOTOR_RUMBLE);
if (PAD_ButtonsDown(PAD_CHAN0) & PAD_BUTTON_Y)
PAD_ControlMotor (PAD_CHAN0, PAD_MOTOR_STOP);
if (PAD_ButtonsDown(PAD_CHAN0) & PAD_TRIGGER_Z)
PAD_ControlMotor (PAD_CHAN0, PAD_MOTOR_STOP_HARD);
}
return 0;
}
jomofer escribió:Hola
He hecho mi primer programa para GC/Wii, el buscaminas.
Quiero compartirlo para que lo probarais y confirmar si funciona o no (solo lo he podido probar en emulador y si que va).
He comentado las instrucciones innecesarias en vez de borrarlas para que sea más facil ver los cambios.//do {
printf("Introduce el numero de minas\n");
int /*flag1=0,*/ aux=0, buttonsDown = 0;
printf("\n%d\n",aux);
while(/*flag1==0*/ 1)
{
VIDEO_WaitVSync();
PAD_ScanPads();
buttonsDown = PAD_ButtonsDown(/*0*/ PAD_CHAN0);
if(buttonsDown & PAD_BUTTON_RIGHT)
{
aux++;
printf("%d\n",aux);
}
if(buttonsDown & PAD_BUTTON_LEFT)
{
aux--;
printf("%d\n",aux);
}
//PAD_ScanPads();
//buttonsDown = PAD_ButtonsDown(0);
if(buttonsDown & PAD_BUTTON_A)
{
//flag1=1;
minas = aux;
break;
}
//minas=aux;
}
//}
frontier escribió:Probado en wii con el twilight hack y funciona. Enhorabuena
Algunos comentarios:
- Al compilarlo la primera vez me ha dado un error de una regla que supuestamente hace falta para procesar el archivo "buscaminas.o". Lo he solucionado borrando la carpeta build y volviendo a compilar. Supongo que se deberá a que estamos usando versiones distintas del devkitpro.
- Cuando el número de minas es igual o mayor al de casillas totales creo que el programa peta. Al menos a mi me ha pasado una vez.
-De vez en cuando da una excepción al mirar en una casilla. También me ha pasado una sola vez.
-Te sugiero que uses la instrucción "void console_setpos(int x, int y)" para imprimir los datos de entrada del usuario siempre en la misma posición. Así la pantalla no se desplazará verticalmente y te quedará más profesional. También podrías usar "void console_setcolor(unsigned int bgcolor,unsigned int fgcolor)" para darle un poco de colorido al tablero.
-Creo que te has liado un poco con los bucles del principio. He hecho otra versión del bucle que le pregunta al usuario el número de minas. Creo que es más simple ya que tiene menos instrucciones y te ahorras la variable "flag1":
He comentado las instrucciones innecesarias en vez de borrarlas para que sea más facil ver los cambios.
Gracias a tu demo me he dado cuenta de que no hace falta llamar a PAD_Sync() después de PAD_Init()... ¿Entonces cuando demonios se usa PAD_Sync()?
Saludos.
void ClearScreen(int color){ // Clear the screen in a certain color
int x,y;
for(y=0;y<480;y++){
for(x=0;x<320;x++){
fb[x+320*y]=color;
}
}
}
Tampoco la he probado aún.void VIDEO_ClearFrameBuffer(GXRModeObj *rmode,void *fb,u32 color);
frontier escribió:Para limpiar la pantalla en el ejemplo "sprite" que posteó KFR esta hecho así:
Se supone que "fb" es el puntero a la memoria de video, que en tu demo se llama "xfb". No lo he probado pero apostaría a que funciona.
Otra opción, tal vez más apropiada, es usar la función de libogc Tampoco la he probado aún.
Espero que te sirva. Avísa si fuciona
En otro orden de cosas me gustaría sumarme a la propuesta que ya hizo Plata para mover este hilo a scene de wii o de gc. Es que me da la sensación de que en este subforo no entra ni Dios... Además, existiendo un foro específico para wii (en el que seguro que hay más tránsito) no se que hacemos en "otras consolas".