Para comenzar:
- Nivel de dificultad: fácil.
- Lenguaje: ANSI C/C++.
- Herramientas: SaturnOrbit
Copiamos el ejemplo S_2_2 de la carpeta C:SaturnOrbitSGL_302jSAMPLE en la raiz del disco C: ó donde quieran.
Cambiamos las rutas necesarias para que compile, si no sabes como hacerlo aca podes ver el como.
Bien este ejemplo solo tiene un cuadrado blanco de fondo, que se pinta en cierta posición.
Lo que vamos a hacer en este tutorial será, moverlo me diante nuestro joystick. Pero siempre controlando que tengamos un Pad conectado a la consola, necesariamente el primero.
Primero vamos a entender como se manejan los pads.
El SMPC(System Manager & Pheriperal Control) Sistema de administración y Control de Periféricos, tiene como una de sus tantas tareas controlar nuesotros joysticks.
Tenemos dos constantes Per_Connect1 y Per_Connect2 que contienen el estado de los periféricos/puertos 1 y 2 respectivamente.
El resultado/valor que se puede obtener en todo momento (lo asigna el SMPC) son:
- 0 Si hay algo conectado al puerto.
- 1 Si no esta conectado algún pad al puerto.
EJ: ¿Comó saber si tengo conectado el Pad al puerto número 1?
if((Per_Connect1) == 0)
{slPrint("No conectaste el PAD",slLocate(2,20));}
Por otro lado tenemos Smpc_Peripheral[] que es un array, donde el indice del arreglo/vector es el número de pad. Que van desde el 0 al 11.
Recuerden que podemos conectar 12 joysticks con el multitap; 6 por cada puerto.
Tenemos 3 tipos de datos en la estructura del array Smpc_Peripheral[].
- data (es el metodo conocido como Pressed que significa persionado constantemente ó mantener presionado)
- push (es el metodo conocido como press, que significa que ejecuta la accion apenas presionamos el boton)
- pull (es el metodo conocido como release, que significa que se ejecuta la accion una vez soltado el boton que hayamos presionado)
Los botones:
- PER_DGT_ST
- PER_DGT_KU
- PER_DGT_KR
- PER_DGT_KD
- PER_DGT_KL
- PER_DGT_TA
- PER_DGT_TB
- PER_DGT_TC
- PER_DGT_TX
- PER_DGT_TY
- PER_DGT_TZ
- PER_DGT_TL
- PER_DGT_TR
Supongo que PER_DGT significa Peripheral_Didital, TA = Trigger A, KU = Keypad Up , ST = Start .
A cualquiera de estos tipos de datos les tenemos que hacer una operación lógica "AND",para obtener el resultado; ya que cada Joytick tiene un registro de 16bits (Uint16).
Ej: Si queremos saber si el botón A, del pad 1 esta presionado.
Uint8 index=0;
if( (Smpc_Peripheral[index].data & PER_DGT_TA) == 0)
{
slPrint("Felicitaciones estas apretando el botón A del PAD - 1",slLocate(1,5));
}
Ej: Si queremos saber si el boton A,ByC del pad 1 estan presionados.
Uint8 index=0;
if(((Smpc_Peripheral[index]. & PER_DGT_TA) == 0) && ((Smpc_Peripheral[index]. & PER_DGT_TB) == 0) && ((Smpc_Peripheral[index]. & PER_DGT_TC) == 0))
{
slPrint("PAD - 1 :: Estas apretando A,B,C",slLocate(1,5));
}
Les dejo el código de una pequeña aplicación que hice como demostración.
Primero les detallo del tipo de dato de la estucura que utiliza cada uno:
- Los botones del keypad, UP,RIGHT,DOWN,LEFT; utilizan la estructura de dato .data.
- A,B,C; utilizan la estructura de dato .push.
- X,Y,Z; utilizan la estructura de dato .pull.
- L,R; utilizan la estructura de dato .data.
Ahora, que función cumple cada uno:
- Keypad, mueve hacia arriba, derecha, abajo e izquierda.
- A,C mueven hacia izquierda y derecha respectivamente.
- B,Y Rotan en el eje X, hacia abajo y arriba respectivamente.
- X,Z Rotan en el eje Z, hacia izquierda y derecha respectivamete.
- L,R Rotan en el eje Z, hacia izquierda y derecha respectivamete.
- START Reinicia la posición del cuadrado.
Hice esto para que noten la diferencia entre los distintos tipos de datos de la estructura Smpc_Peripheral[index].
Este código pertenece al main.c .
void ss_main(void)
{
static ANGLE ang[XYZ];
static FIXED pos[XYZ];
slInitSystem(TV_320x240, NULL, 1);
ang[X] = ang[Y] = ang[Z] = DEGtoANG(0.0);
pos[X] = toFIXED( 0.0);
pos[Y] = toFIXED( 0.0);
pos[Z] = toFIXED(220.0);
slPrint("SMPC - Pad Control", slLocate(9,2));
slPrint("www.segasaturno.com", slLocate(9,3));
while(-1){
slPushMatrix();
{
slTranslate(pos[X], pos[Y], pos[Z]);
slRotX(ang[X]);
slRotY(ang[Y]);
slRotZ(ang[Z]);
slPutPolygon(&PD_PLANE1);
}
slPopMatrix();
if((Per_Connect1) == 0)
{slPrint("No conectaste el PAD",slLocate(2,20));}
//Utilizamos 0 si es el primer PAD.
Uint8 index = 0;
if( (Smpc_Peripheral[index].data & PER_DGT_ST) == 0)
{ //Reiniciamos la posicion del Poligono
ang[X] = ang[Y] = ang[Z] = DEGtoANG(0.0);
pos[X] = toFIXED( 0.0);
pos[Y] = toFIXED( 0.0);
}
//Controlando KEY-PAD------------------------------
if( (Smpc_Peripheral[index].data & PER_DGT_KU) == 0)
{
pos[Y] = pos[Y] - toFIXED( 5.0);
}
if( (Smpc_Peripheral[index].data & PER_DGT_KR) == 0)
{
pos[X] = pos[X] + toFIXED( 5.0);
}
if( (Smpc_Peripheral[index].data & PER_DGT_KD) == 0)
{
pos[Y] = pos[Y] + toFIXED( 5.0);
}
if( (Smpc_Peripheral[index].data & PER_DGT_KL) == 0)
{
pos[X] = pos[X] - toFIXED( 5.0);
}
//Controlando Trigger-A,B,C------------------------
if( (Smpc_Peripheral[index].push & PER_DGT_TA) == 0)
{
pos[X] = pos[X] - toFIXED( 5.0);
}
if( (Smpc_Peripheral[index].push & PER_DGT_TB) == 0)
{
ang[Y] =ang[Y]- DEGtoANG(5.0);
}
if( (Smpc_Peripheral[index].push & PER_DGT_TC) == 0)
{
pos[X] = pos[X] + toFIXED( 5.0);
}
//Controlando Trigger-X,Y,Z------------------------
if( (Smpc_Peripheral[index].pull & PER_DGT_TX) == 0)
{
ang[Z] =ang[Z]+ DEGtoANG(5.0);
}
if( (Smpc_Peripheral[index].pull & PER_DGT_TY) == 0)
{
ang[Y] =ang[Y]+ DEGtoANG(5.0);
}
if( (Smpc_Peripheral[index].pull & PER_DGT_TZ) == 0)
{
ang[Z] =ang[Z]+ DEGtoANG(5.0);
}
//Controlando Triggers LEFT y RIGHT
if( (Smpc_Peripheral[index].data & PER_DGT_TL) == 0)
{ //Estamos apretando TiggerLEFT
ang[Z] =ang[Z]- DEGtoANG(5.0);
}
if( (Smpc_Peripheral[index].data & PER_DGT_TR) == 0)
{ //Estamos apretando TiggerRight
ang[Z] =ang[Z]+ DEGtoANG(5.0);
}
slPrint("Jano Dev Team - FacundoARG",slLocate(12,28));
slSynch();
}
}
{
static ANGLE ang[XYZ];
static FIXED pos[XYZ];
slInitSystem(TV_320x240, NULL, 1);
ang[X] = ang[Y] = ang[Z] = DEGtoANG(0.0);
pos[X] = toFIXED( 0.0);
pos[Y] = toFIXED( 0.0);
pos[Z] = toFIXED(220.0);
slPrint("SMPC - Pad Control", slLocate(9,2));
slPrint("www.segasaturno.com", slLocate(9,3));
while(-1){
slPushMatrix();
{
slTranslate(pos[X], pos[Y], pos[Z]);
slRotX(ang[X]);
slRotY(ang[Y]);
slRotZ(ang[Z]);
slPutPolygon(&PD_PLANE1);
}
slPopMatrix();
if((Per_Connect1) == 0)
{slPrint("No conectaste el PAD",slLocate(2,20));}
//Utilizamos 0 si es el primer PAD.
Uint8 index = 0;
if( (Smpc_Peripheral[index].data & PER_DGT_ST) == 0)
{ //Reiniciamos la posicion del Poligono
ang[X] = ang[Y] = ang[Z] = DEGtoANG(0.0);
pos[X] = toFIXED( 0.0);
pos[Y] = toFIXED( 0.0);
}
//Controlando KEY-PAD------------------------------
if( (Smpc_Peripheral[index].data & PER_DGT_KU) == 0)
{
pos[Y] = pos[Y] - toFIXED( 5.0);
}
if( (Smpc_Peripheral[index].data & PER_DGT_KR) == 0)
{
pos[X] = pos[X] + toFIXED( 5.0);
}
if( (Smpc_Peripheral[index].data & PER_DGT_KD) == 0)
{
pos[Y] = pos[Y] + toFIXED( 5.0);
}
if( (Smpc_Peripheral[index].data & PER_DGT_KL) == 0)
{
pos[X] = pos[X] - toFIXED( 5.0);
}
//Controlando Trigger-A,B,C------------------------
if( (Smpc_Peripheral[index].push & PER_DGT_TA) == 0)
{
pos[X] = pos[X] - toFIXED( 5.0);
}
if( (Smpc_Peripheral[index].push & PER_DGT_TB) == 0)
{
ang[Y] =ang[Y]- DEGtoANG(5.0);
}
if( (Smpc_Peripheral[index].push & PER_DGT_TC) == 0)
{
pos[X] = pos[X] + toFIXED( 5.0);
}
//Controlando Trigger-X,Y,Z------------------------
if( (Smpc_Peripheral[index].pull & PER_DGT_TX) == 0)
{
ang[Z] =ang[Z]+ DEGtoANG(5.0);
}
if( (Smpc_Peripheral[index].pull & PER_DGT_TY) == 0)
{
ang[Y] =ang[Y]+ DEGtoANG(5.0);
}
if( (Smpc_Peripheral[index].pull & PER_DGT_TZ) == 0)
{
ang[Z] =ang[Z]+ DEGtoANG(5.0);
}
//Controlando Triggers LEFT y RIGHT
if( (Smpc_Peripheral[index].data & PER_DGT_TL) == 0)
{ //Estamos apretando TiggerLEFT
ang[Z] =ang[Z]- DEGtoANG(5.0);
}
if( (Smpc_Peripheral[index].data & PER_DGT_TR) == 0)
{ //Estamos apretando TiggerRight
ang[Z] =ang[Z]+ DEGtoANG(5.0);
}
slPrint("Jano Dev Team - FacundoARG",slLocate(12,28));
slSynch();
}
}
Después, subo un video y la ISO.