Página 1 de 1
 
 

Mensaje [Homebrew] [SMPC] - Control Del PAD

#1  FacundoARG 08 Agosto 2009, 05:45 AM

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.  
 




____________
SegaSaturn Developer Addict
 
avatar
argentina.png FacundoARG Sexo: Masculino
Colaborador SEGASATURNO
Colaborador SEGASATURNO
Professional Videogamer Coder
Donante Unreleased €
 
Registrado: Diciembre 2006
Ubicación: San Luis
Mensajes: 691
  • Volver arriba Página inferior
 

Mensaje Re: [SaturnBrew] - SMPC - Control Del PAD

#2  Jean La Montarde 08 Agosto 2009, 12:33 PM

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
 



 
avatar
spain.png Jean La Montarde Sexo: Masculino
SEGA Fan
SEGA Fan
 
Registrado: Julio 2009
Mensajes: 181
  • Volver arriba Página inferior
 

Mensaje Re: [SaturnBrew] - SMPC - Control Del PAD

#3  saturn_worship 08 Agosto 2009, 03:57 PM

excelente, esta semana cunado tenga tiempo le meto caña.
 



 
avatar
blank.gif saturn_worship 
Staff Unreleased
Moderador
Moderador
Arqueologo Sega Saturn
 
Registrado: Abril 2007
Mensajes: 1198
  • Volver arriba Página inferior
 

Mensaje Re: [SaturnBrew] - SMPC - Control Del PAD

#4  FacundoARG 09 Agosto 2009, 12:09 PM

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    .
 




____________
SegaSaturn Developer Addict
 
avatar
argentina.png FacundoARG Sexo: Masculino
Colaborador SEGASATURNO
Colaborador SEGASATURNO
Professional Videogamer Coder
Donante Unreleased €
 
Registrado: Diciembre 2006
Ubicación: San Luis
Mensajes: 691
  • Volver arriba Página inferior
 


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