Estoy usando las librerías de Hermes.. quien quiera compilarlo solo tienen que seguir el curso de programación de Hermes:
viewtopic.php?f=6&t=94
y copiar el siguiente código en el ejemplo 2:
- Código: Seleccionar todo
/* Example2: interaccion con las GX
Copyright (c) 2008 Hermes <www.entuwii.net>
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are
permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice, this list of
conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright notice, this list
of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.
- The names of the contributors may not be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define USE_MODPLAYER 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
#include <ogcsys.h>
#include <gccore.h>
#include <wiiuse/wpad.h>
#include <fat.h>
#include <fcntl.h>
#include "unistd.h"
#include "screen.h"
#include "asndlib.h"
#ifdef USE_MODPLAYER
// MOD Player
#include "gcmodplay.h"
MODPlay mod_track;
#include "hybris.h"
#endif
int return_reset=1;
int exit_by_reset=0;
void reset_call() {exit_by_reset=return_reset;}
void power_call() {exit_by_reset=3;}
void fun_exit()
{
ASND_End(); // finaliza el sonido
WPAD_Shutdown();
Screen_flip(); // espera a que acabe el GX si está en uso
fatUnmount(PI_INTERNAL_SD); // desmonta la partición de la SD
usleep(500); // espera 500 ms por si hay algo que esté trabajando todavía
if(exit_by_reset==2)
SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);
if(exit_by_reset==3)
SYS_ResetSystem(SYS_POWEROFF_STANDBY, 0, 0);
exit(0);
}
int tabla[81]; // tabla de alturas (usa 81 elementos para generar 80 lineas)
unsigned int Nave_x=320,Nave_y=130; // Posicion Inicial de la Nave, por defecto 400,240
int main(int argc, char **argv)
{
int n,m;
int counter=0;
short Line_x1,Line_y1,Line_x2,Line_y2;
int Modelo_Nave[24][4]= {
{ -2, 7, 0, 10},
{ 0, 10, 2, 7},
{ -3, -10, 3, -10},
{ 3, -10, 6, -7},
{ 6, -7, 6, -4},
{ 6, -4, 3, -1},
{ -3, -1, -6, -4},
{ -6, -4, -6, -7},
{ -6, -7, -3, -10},
{ -6, -1, 6, -1},
{ 6, -1, 6, 4},
{ 6, 1, 8, 7},
{ 4, 4, 8, 7},
{ 8, 7, 8, 10},
{ 6, 10, 10, 10},
{ 6, 4, -6, 4},
{ -6, -1, -6, 4},
{ -6, 1, -8, 7},
{ -4, 4, -8, 7},
{ -8, 7, -8, 10},
{-10, 10, -6, 10},
{ 0, 4, 2, 7},
{ 0, 4, -2, 7},
{ -2, 7, 2, 7}
}; // Diseño de la Nave
gforce_t gforce;
float Angulo=0;
float Zoom=2;
return_reset=1; // esto sirve para elegir el tipo de retorno en caso de pulsar RESET (1-> Homebrew Browser, 2->RESET)
if(argc<1) return_reset=2;
InitScreen(); // Inicialización del Vídeo.
SYS_SetResetCallback(reset_call); // fija la callback para el boton RESET
SYS_SetPowerCallback(power_call); // fija la callback para el boton POWER
ASND_Init(); // Inicializa la librería de sonido
WPAD_Init(); // Inicializa el lector de pad
WPAD_SetDataFormat(0,WPAD_FMT_BTNS_ACC_IR);
WPAD_SetVRes(0,640,480);
fatInit(8, false); // Inicializa la libreria FAT
fatSetDefaultInterface(PI_INTERNAL_SD); // fija el device "fat:" a la SD
atexit(fun_exit); // fija la funcion de salida (aqui se finaliza el uso de dispositivos, etc: usa exit(0); para salir del programa)
ASND_Pause(0); // Pausa de sonido global a 0
tabla[0]=SCR_HEIGHT;
for(n=1;n<80;n++)
{
m=((rand() & 0x3f00)>>8)-32;
if(m>-8 && m<8) m=0; // para generar planicies
tabla[n]=tabla[n-1]+m;
if(tabla[n]>SCR_HEIGHT) tabla[n]-=m*2; // limite de altura
if(tabla[n]<60) tabla[n]-=m*2; // limite de altura
}
tabla[n]=tabla[n-1];
// inicializa el modplayer en modo loop infinito
MODPlay_Init(&mod_track);
if (MODPlay_SetMOD (&mod_track, hybris ) < 0 ) // set the MOD song
{
MODPlay_Unload (&mod_track);
}
else
{
MODPlay_SetVolume( &mod_track, 32,32); // fix the volume to 32 (max 64)
MODPlay_Start (&mod_track); // Play the MOD
}
while(1) // bucle principal
{
if(exit_by_reset) exit(0); // comprueba si se han pulsado RESET o POWER y sal si es asi
if (WPAD_ButtonsDown(0) & WPAD_BUTTON_HOME) exit(0); // comprueba si se han pulsado Home en wiimote 1 y sal si es asi
// dibujado de la caja
SetTexture(NULL);
DrawRoundFillBox2(SCR_WIDTH/2-200, 16, 400, 40, 0, 0xffafafaf); // dibuja una caja solida
DrawRoundBox2(SCR_WIDTH/2-200, 16, 400, 40, 0, 4, 0xff00ffff); // dibuja el perimetro de la caja con borde de grosor 4
letter_size(8,32); // tamaño de letra 16x64
PX= 0; PY= 18; color= 0xff000000; bkcolor=0;
SelectFontTexture(0); // selecciona font principal
autocenter=1; // autocentrado on
s_printf("Wiilander");
autocenter=0;
// configura para usar color con GX_Begin (funcion de dibujado de poligonos de GX)
ConfigureForColor();
// #if 1
GX_Begin(GX_LINES, GX_VTXFMT0, 80*4*2); // dibuja 80*4 lineas (en matriz de 2x2) * 2 vertices
for(n=0;n<80;n++)
{
AddColorVertex(n*8, tabla[n], 1, 0xffff9000); // primer vertice (recuerda que x1,y1 y z1 son enteros con signo de 16 bits)
AddColorVertex((n+1)*8,tabla[n+1], 1, 0xffff9000); // segundo vertice
AddColorVertex(n*8+1, tabla[n], 1, 0xffff9000); // primer vertice (recuerda que x1,y1 y z1 son enteros con signo de 16 bits)
AddColorVertex((n+1)*8+1,tabla[n+1], 1, 0xffff9000); // segundo vertice
AddColorVertex(n*8, tabla[n]+1, 1, 0xffff9000); // primer vertice (recuerda que x1,y1 y z1 son enteros con signo de 16 bits)
AddColorVertex((n+1)*8,tabla[n+1]+1, 1, 0xffff9000); // segundo vertice
AddColorVertex(n*8+1, tabla[n]+1, 1, 0xffff9000); // primer vertice (recuerda que x1,y1 y z1 son enteros con signo de 16 bits)
AddColorVertex((n+1)*8+1,tabla[n+1]+1, 1, 0xffff9000); // segundo vertice
}
GX_End();
//
//
WPAD_ScanPads(); //Lee todos los mandos
WPAD_GForce(0, &gforce); //Lee la aceleracion del mando 1
Angulo=3.1492*gforce.y;
// Dibuja la Nave
GX_Begin(GX_LINES, GX_VTXFMT0, 23*2); // dibuja Nave 23x2
for(n=0;n<23;n++)
{
Line_x1=Nave_x+Modelo_Nave[n][0]*cos(Angulo)/Zoom+Modelo_Nave[n][1]*sin(Angulo)/Zoom;
Line_y1=Nave_y-Modelo_Nave[n][0]*sin(Angulo)/Zoom+Modelo_Nave[n][1]*cos(Angulo)/Zoom;
Line_x2=Nave_x+Modelo_Nave[n][2]*cos(Angulo)/Zoom+Modelo_Nave[n][3]*sin(Angulo)/Zoom;
Line_y2=Nave_y-Modelo_Nave[n][2]*sin(Angulo)/Zoom+Modelo_Nave[n][3]*cos(Angulo)/Zoom;
AddColorVertex(Line_x1,Line_y1, 1, 0xffff9000); // primer vertice (recuerda que x1,y1 y z1 son enteros con signo de 16 bits)
AddColorVertex(Line_x2,Line_y2, 1, 0xffff9000); // segundo vertice
}
GX_End();
// #else
// // utiliza quads para hacer montañas solidas
//
// GX_Begin(GX_QUADS, GX_VTXFMT0, 80*4); // dibuja 80 quads (4 vertices)
//
// for(n=0;n<80;n++)
// {
// AddColorVertex(n*8, tabla[n], 1, 0xffff9000); // primer vertice (recuerda que x1,y1 y z1 son enteros con signo de 16 bits)
//
// AddColorVertex((n+1)*8,tabla[n+1], 1, 0xffff9000); // segundo vertice
//
// AddColorVertex((n+1)*8, SCR_HEIGHT, 1, 0xffff9000); // tercer vertice
//
// AddColorVertex(n*8, SCR_HEIGHT, 1, 0xffff9000); // cuarto vertice
// }
//
//
// GX_End();
// #endif
if (WPAD_ButtonsDown(0) & WPAD_BUTTON_PLUS) {
Zoom=1;
}
if (WPAD_ButtonsDown(0) & WPAD_BUTTON_MINUS) {
Zoom=2;
}
// scroll y actualizacion del mapa de alturas
for(n=0;n<80;n++)
{
tabla[n]=tabla[n+1];
}
m=((rand() & 0x3f00)>>8)-32;
if(m>-8 && m<8) m=0; // para generar planicies
tabla[n]=tabla[n-1]+m;
if(tabla[n]>SCR_HEIGHT) tabla[n]-=m*2; // limite de altura
if(tabla[n]<50) tabla[n]-=m*2; // limite de altura
// borra e intercambia la pantalla, espera al retrazado vertical
Screen_flip();
counter++;
}
exit(0);
}
Pulsando en el wiimote HOME se vuelve al HC, y con + y menos cambiamos el zoom.
Salu2
