[Homebrew] [SMPC] - Control Del PAD


Objetivo: [Homebrew] [SMPC] - Control Del PAD
Bien, les traigo un pequeño tutorial, muy básico pero completo de como controlar el pad.

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 :roll: .

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 :lol: .
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();
}
}


smpc

Después, subo un video y la ISO. :lol:

última edición por FacundoARG el 10 Agosto 2009, 12:34 AM; editado 1 vez
Perfil MP  
Objetivo: Re: [SaturnBrew] - SMPC - Control Del PAD
Grande facundo , muy bien explicado y super detallado me has despejado muchas dudas que tenia sobre este tema ya consegui arreglar mi problema con el pad y he conseguido hacer funcionar una pequeña prueba de codigo.

imagen5vrr

Ahora ando liado con los sprites , que yo y las 3d no nos llevamos bien y el maldito set_sprite me da error continuamente

set_sprite(tabla pictures, numero de graficos, tabla texturas); pues el Dev c me dice "undefined reference to set_sprite"...

En resumen sigue sacando tutos que se agradecen mucho

Perfil MP  
Objetivo: Re: [SaturnBrew] - SMPC - Control Del PAD
excelente, esta semana cunado tenga tiempo le meto caña.

Perfil MP  
Objetivo: Re: [SaturnBrew] - SMPC - Control Del PAD
Jean La Montarde escribió: [Ver mensaje]


Ahora ando liado con los sprites , que yo y las 3d no nos llevamos bien y el maldito set_sprite me da error continuamente

set_sprite(tabla pictures, numero de graficos, tabla texturas); pues el Dev c me dice "undefined reference to set_sprite"...

En resumen sigue sacando tutos que se agradecen mucho


Debe ser que no tenes declarada la función esa. Si creo que es la que creo :roll: , es para copiar los sprites a la memoria. y Despues tenes que usar slDispSprite.

Sino pasame el código que le pego una mirada a ver si entiendo que pasa :mrgreen: .

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
Puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.0213s (PHP: 56% SQL: 44%)
Consultas SQL: 10 - Debug off - GZIP Desactivado