[Homebrew] [SMPC] - Control Del PAD

[Homebrew] [SMPC] - Control Del PAD
Artículo
Mensaje [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   .

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


smpc

Después, subo un video y la ISO.  



 
 FacundoARG [ 08 Agosto 2009, 05:45 AM ]


[Homebrew] [SMPC] - Control Del PAD
Comentarios
Mensaje 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



 
 Jean La Montarde [ 08 Agosto 2009, 12:33 PM ]
Mensaje Re: [SaturnBrew] - SMPC - Control Del PAD 
 
excelente, esta semana cunado tenga tiempo le meto caña.



 
 saturn_worship [ 08 Agosto 2009, 03:57 PM ]
Mensaje 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    , 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    .



 
 FacundoARG [ 09 Agosto 2009, 12:09 PM ]
Mostrar mensajes anteriores:    
Ocultar¿Este tema fue útil?
Compartir este tema
Correo a un amigo Facebook Twitter Windows Live Favorites MySpace del.icio.us Digg SlashDot google.com LinkedIn StumbleUpon Blogmarks Diigo reddit.com Blinklist co.mments.com
technorati.com DIGG ITA linkagogo.com meneame.net netscape.com newsvine.com yahoo.com Fai Informazione Ok Notizie Segnalo Bookmark IT fark.com feedmelinks.com spurl.net
Página 1 de 1