Mapeo de Controles según plataforma

Started by KeiDash, November 21, 2017, 09:26:33 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KeiDash

Buenos días a todos,

Sigo desarrollando mi juego yme ha surgido una duda con respecto al teclado y al mapeo de los botones de pads de plataformas compatibles, me explico.

BennuGD te representa los controles (_LEFT, _A, _F, _RIGHT, _ESC, etc.) de un teclado de PC. He estado buscando en la documentación, cómo mapeo el soporte de teclas del teclado con el pad de una determinada consola a la que BennuGD da soporte, en este caso, Dreamcast.

De mi juego (lo poco que tengo) he creado una iso y la he puesto en el emulador y en la consola original. El juego funciona pero sólo consigo que funcione las teclas direccionales (_LEFT, _RIGHT, _UP, _DOWN) y el boton de Start (_ENTER), los botónes no se como encajan, es decir, que CONSTANTE de BennuGD hace referencia a los botones A, B, X, Y, L y R de Dreamcast? O de otras posibles consolas.. ¿Dónde se encuentra esa documentación? Si es que existe.

Muchas gracias por la posible ayuda.

panreyes

Desconozco cómo funciona el port de Dreamcast exactamente, pero la última vez que leí algo sobre él creo que mapeaba los botones a las teclas QWEASD (me suena, no lo sé con seguridad). De todas formas, puedes averiguarlo con este código:
write_int(0,0,0,0,&scan_code)
loop
frame;
end

Aparte de las teclas, también existe el módulo de joysticks para leer los gamepads correctamente (http://wiki.bennugd.org/index.php?title=Mod_joy)

KeiDash

Quote from: panreyes on November 21, 2017, 09:35:16 PM
Desconozco cómo funciona el port de Dreamcast exactamente, pero la última vez que leí algo sobre él creo que mapeaba los botones a las teclas QWEASD (me suena, no lo sé con seguridad). De todas formas, puedes averiguarlo con este código:
write_int(0,0,0,0,&scan_code)
loop
frame;
end

Aparte de las teclas, también existe el módulo de joysticks para leer los gamepads correctamente (http://wiki.bennugd.org/index.php?title=Mod_joy)

Aps!! Pues no conocía esa funcionalidad para averiguar el botón pulsado, muchas gracias @panreyes.

Con respecto al módulo de joystick, voy a re-leerlo por que no termino de entender muy bien como funciona exactamente y qué es lo que hace.

Drumpi

Cada plataforma usa unos botones diferentes para remapear los controles, y por eso es importante leerse el "leeme" que acompaña cada distribución, suele ser ahí donde se especifican los contoles, la resolución y otros detalles como los formatos sonoros soportados, etc.
La mod_joy, donde la he ido probando ha funcionado muy bien. Básicamente es que en lugar de usar KEY, usas constantes JOY, y aparte, puedes usar joysticks analógicos, que no son más que variables con rangos de valores por cada eje: un joy analógico suele tener 2 (3 si es de un simulador de vuelo), y si la usas con mandos de Wii, los giroscopios se mapean también como ejes.

Como consejo aparte, nunca uses directamente en el código IF (KEY(_UP)) ni cosas así. Yo siempre recomiendo tener un array con dos posiciones por cada tecla que necesites usar: una para guardar la constante de la tecla para esa acción, y otra que se incremente si está pulsada o que valga cero si no.
Yo suelo crear un array que llamo TECLAS(8)(2) (con corchetes), y guardo en TECLAS(x)(0) los valores _UP, _DOWN, _LEFT, _RIGHT, _Z, _X (salto y disparo, por ejemplo), _ENTER y _ESC.
Luego creo unas variables o unas constantes que llamo _TECLA_ARRIBA, _TECLA_ABAJO... y cuando quiero saber si alguna tecla está pulsada hago
IF (TECLAS(_TECLA_ARRIBA)(1) > 0)

Todo esto se ejecuta en un proceso, con muy alta prioridad, durante todo el programa, en bucle infinito.
De esta forma, si mañana decido cambiar los botones, o en lugar de KEY quiero usar JOY, o botones en una pantalla táctil, o quiero usar cualquier otro tipo de control, sólo tengo que modificar UN PROCESO, y no ir buscando en el código todas las llamadas a KEY, o a _UP.
Parece complicado pero a la larga salva vidas, especialmente si hay que portar a otras plataformas
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Ryo Suzuki

Se me había pasado esto, aunque ya lo habrás solventado supongo...

Te pongo las keys para la Dreamcast:

START es _RETURN);

Botón A es la _s
Botón B es la _d
Botón Y es la _a
Botón X es la _w

Digital izquierda, derecha, arriba y abajo son _LEFT _RIGHT _UP y _DOWN

Gatillo Derecho _ESCAPE);
Gatillo izquierdo _SPACE);

Lo que no recuerdo ahora es el analógico. Sé que lo detecta como mouse también, pero no sé bien si se podía detectar como JOY o de alguna otra forma.

Un saludo.

P.D: Todos los botones se podía detectar también como JOY. Pero yo uso siempr keys, no recuerdo el motivo...

Drumpi

Porque es más fácil de recordar y mapear :D
Los joys tienen la pega de que tienes que detectar si está enchufado, cuántos hay, y cuántos ejes lo componen (los gatillos, al ser analógicos, si no se han puesto como dos ejes más, podrían haberlo sido). Es un poco más complicado y pierdes "compatibilidad" con PC, que necesitas conectar un mando equivalente para jugar y probar. Por eso el método de usar un array intermedio.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

KeiDash

#6
Muy buena información que me has dado Ryo, muchas gracias, aunque me quedo con la duda de como mapear el analógico. De momento estoy haciendo pruebas en PC con un pad de playstation y los detecto, pero no consigo ejecutarlo en la Dreamcast para que funcione (más que nada por que no consigo grabar homebrew que funcione en la DC, no me lee los discos)

Una cosa, a que te refieres con el _RETURN? Esa tecla no está mapeada http://wiki.bennugd.org/index.php?title=Scancodes