Duda sobre los pads

Started by Mr Matsusaka, April 06, 2010, 10:52:29 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Mr Matsusaka

Existe alguna manera de saber cual es el boton de Start de los pads?
En principio yo cogia el ultimo boton del pad para ello, que suele ser el boton de Start. Sin enmbargo en ocasiones los mandos no estan configurados de tal modo...

FreeYourMind

Yo he mapeado todo el pad de Playstation 2 en mi juego 'Skull'. Puedes probarlo si lo tienes (yo tengo un conector usb para jugar en el pc con este pad).

Si nadie te ayuda, luego te paso el código con todo el mapeo para este pad, no se si difiere de otros pads mas sencillos, no los he probado con Bennu (probe un pad de PC con menos botones en Fenix hace años).

Mr Matsusaka

Quote from: FreeYourMind on April 06, 2010, 11:36:34 AM...no se si difiere de otros pads mas sencillos...

Es que ese es el problema! El boton de Start del mando de la Playstation 2 sera diferente, por ejemplo, al mando de la Saturn. Mi pregunta es si hay manera de saber cual es el boton Start sin importar el mando.

¿Como lo hacen en los juegos profesionales?

FreeYourMind

En los juegos profesionales se permite mapearlos en las opciones, eso tambien seria posible en Bennu poniendo un Menu, ya que dependiendo del pad los botones se asignan automaticamente dependiendo del orden que tengan del mapeado de los imputs. Si algun boton no sale por defecto el que te gustaria, ya se cambiaria despues en este menu. Pero para darte más info no soy el indicado, ya llegarán los experts  ;D

BoMbErLiNk

Si mal no recuerdo algunos drivers de mandos añaden "nombres" sobre los botones, así sería fácil saber cual es START, cual son los triggers, etc.. pero nose si hay funciones que extraigan esos nombres en bennu, quizas en la dll que tiene forcefeedback..

Lo que si que hay es joy_name ( <INT JoyID> ), que te extrae el nombre del joystick, quizas haciendo una pequeña base de datos de los mandos más conocidos, pero necesitas pads para saberlo.. en el " DUAL SHOCK " START sería el boton 10 del mando por ejemplo, creo que serviría para los 3 mandos de playstation y los no oficiales que siguen el mismo esquema, los clonicos solo para pc tienen otro orden, aunque sean iguales como el Logitech donde START era el 9, pero en los mandos oficiales no fallaría.

El problema es que el nombre depende del conector o del driver, así te encuentras el Dualshock 2 nombrado como " PC DUAL SHOCK " o como " SONY PLAYSTATION DUAL SHOCK 2 tm" etc.. eso varía y habría que hacer recorte y comparación de strings a palabras más reducidas para conseguir partes seguras como " DUAL SHOCK "

Otra forma es usar joy_numbuttons ( [ <INT JoyID> ] ) , para saber de cuantos botones se trata el mando y intentar colocar START en el que creamos que va a estar  ;D

Si el mando tiene 7 botones podría tratarse del mando de 6 botones de la mega, siendo el septimo el START, etc..

Drumpi

Yo hice una pequeña utilidad en Fenix que te muestra varios números y se destapan aquellos que correspondan con el botón que estás apretando. Te pego el código:

[code language="bennu"]
program test_joy;

private
       graficos1;
       joy_seleccionado;
       cont;
       ant_l;
       ant_r;
       hijos[255];
       
begin
     set_mode(320,240,16);
     graficos1=new_map(30,10,16);
     set_center(0,graficos1,0,0);
     map_clear(0,graficos1,rgb(255,255,255));
     write(0,0,0,0,"Número de mandos: "+select_joy(-1));
     write(0,0,10,0,"Mando seleccionado: ");
     write_int(0,200,10,0,&joy_seleccionado);
     select_joy(0);
     //joy_seleccionado=select_joy(-1);
     //select_joy(joy_seleccionado);
     for (cont=0;cont<=255;cont++)
         write(0,(cont%10)*30,((cont/10)+2)*10,0,cont);
         hijos[cont]=boton_select((cont%10)*30,((cont/10)+2)*10);
     end
     
     //debug
     //cont=boton_select(10,10);
     //cont.graph=graficos1;
     
     loop
         if (key(_backspace) && !ant_l)
            ant_l=true;
            joy_seleccionado++;
            select_joy(joy_seleccionado);
         end
         if (!key(_backspace) && ant_l) ant_l=false; end
         if (key(_tab) && !ant_r && (joy_seleccionado>0))
            ant_r=true;
            joy_seleccionado--;
            select_joy(joy_seleccionado);
         end
         if (!key(_tab) && ant_r) ant_r=false; end
         
         for (cont=0;cont<=255;cont++)
             if (0==get_joy_button(cont)) //¿por qué no va con != ?
             //if (!key(cont))            //¿por que no va afirmado?
                hijos[cont].graph=graficos1;
             else
                 hijos[cont].graph=0;
             end
         end
         if (key(_enter) && key(_space)) break; end
         frame;
     end
     let_me_alone();
     unload_map(0,graficos1);
     frame;
end

process boton_select (x,y)
begin
     //flags=4;
     file=0;
     signal(id,s_freeze);
     frame;
end[/code]

Seguramente haya que modificarlo, pues lo preparé para comprobar los botones que usa la GP2X en modo joystick. No me he puesto a portarlo a Bennu porque no he tenido necesidad, pero para mapear, básicamente es recorrer la lista de números mirando qué botón se pulsa y guardarlo en una variable, por ejemplo, K_UP.
Así luego tendrías que comprobar si el botón K_UP está pulsado o no.
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)

Mr Matsusaka

Al final la mejor solucion que se me ocurre es la de BomberLink, mapeando el ultimo boton como Start... Sin embargo se me ha dado un caso con un mando dual con controles analogicos. Segun este mando las ultimas teclas son las correspondientes a las cruzetas analogicas cuando son pulsadas.

Si esto fuese asi con todos los mandos analogicos solo seria necesario averiguar si el mando tiene cruzeta analogicaa o no. Pero me da a mi que no va a ser asi XD

Bien pensado probablemente los profesionales de juegos de PC tengan una buena base de datos sobre los mandos disponibles en el mercado y trabajen en base a esa informacion. El tema del pad debe ser un dolor mayor del que nos imaginamos... XD

FreeYourMind

Los botones analogicos se mapean de forma distinta, cada uno tiene un rango de valores (sensibilidad de movimiento), lo que yo he echo para que se pueda jugar tambien con ellos fue hacer que el personaje sólo se mueva cuando ultrapasa el limite para cada lado (izquierda, derecha, arriba y abajo).

Este rango de valores es muy sensible, incluso con el mando parado suelen variar.

Luego te paso un programilla joyTest que te pone los valores y puedes ver que valores tiene cada uno en dado momento.

BoMbErLiNk

Free creo que se refiere a los botones de las setas, vamos cuando pulsas el joystick hacia adentro y hace click.

En realidad todos los botones de ps2/ps3 son analogicos, con diferentes grados de presión, sea el triangulo, el cuadrado, etc.. todo eso va controlado por el driver (la sensibilidad), lo de la presión de botones lo puedes ver en el metal gear como pulsando suave se agacha o pulsando más fuerte se tira al suelo, o en juegos de carrera.

El caso de este orden en concreto es que el mando de psx nacio de una forma y luego se fue ampliando, al principio salio sin setas analogicas, luego las metieron, luego el rumble.. por eso los botones de las setas van después del START, porque ya no podian cambiar el orden y en las siguientes generaciones, para mantener la retrocompatibilidad, lo que tampoco se es si los mandos clonicos o similares siguen este esquema, luego de eso el mando psx se volvio un estandard y es difícil saber, en el LOGITECH que tengo era así, solo habia algunos cambios en el orden de algunos botones, como los 4 frontales.

--
En unos dias me llegaran el mando oficial de SEGA para pc, que es como el de Saturn pero usb, el adaptoid para conectar el mando de N64 al pc y un conector usb para mandos de GC, PS2 y XBOX.. ya comentare como van montados  :)

Mr Matsusaka

#9
El problema de las setas analogicas es saber si estan o no.
Si todos los manos siguiesen la logica de poner las setas despues de los botones select y start solo quedaria detectar si el mando tiene setas o no. Sino las tiene se supondria que el boton Start es el ultimo. Si las tuviese podriamos suponer que el boton start es el antepenultimo.

Hay alguna forma de saber si el mando tiene setas analogicas?

El mapeo del mando de la saturn ya te lo digo yo.
A=1; B=2; C=3; X=4; Y=5; Z=6; L=7; R=8; Start=9;
Ojala fuesen todos asi  ;D

EDIT: Efectivamente se puede saber si el mando tiene setas analogicas o no.
La funcion se llama joy_numaxes
Se podria deducir cual es el boton Start de la siguiente forma:

[code language="bennu" options="singleline"]boton_start = joy_buttons(0) - oy_numaxes(0) - 1;[/code]

Voy a hacer unas pruebas y ya os comentare.

BoMbErLiNk

Guay  ;D

Ahora que lo pienso, el de mega debe ser diferente, porque primero vino el mando de 3 botones y luego el de 6..

Si, claro que hay, tienes estas 3 funciones :
Joy_numhats(id);
Joy_numaxes(id);
Joy_numballs(id);

FreeYourMind

Los mandos clonicos de las ps tienen que tener el mismo mapeado, sino las acciones por defecto serian distintas según los distintos botones ...

Luego te pongo el ejemplo que te digo, tiene las funciones que comenta Bomber.

Mr Matsusaka

Supongo que la mega cambio, si.
El de la Saturn es tal como he dicho. lo tengo aqui al lado ahora mismito XD

Yo tengo un pad analogico de Activbb y tambien me coje las setas depues de los botones Select y Start. Supongo que podemos concluir que la mayoria de mandos siguen ese estandar, lo cual facilita las cosas.

BoMbErLiNk

Free ya te he confundido  :D, es que hay 2 tipos de mando clonico, los que funcionan en psx y los que son clonicos usb para PC, los segundos ya te digo, he tenido hasta 3 mandos clonicos para pc por usb (marca SAITEK, LOGITECH, ..) y cada uno funcionaba distinto, uno traia hasta una ruedecilla para poder usar la funcion joy_numballs  ;D

Pero eso si, todos dejaban los botones de la seta para el final, solo cambiaban el orden de los botones frontales y el boton que cambia de analogico a digital en los mandos clonicos suele contar como boton mientras que en el mando oficial es un conmutador, luego confirmo..

SplinterGU

bueno, eso de que los botones del joys de la ps2 son analogicos y tienen sensibilidad es un mito... con desarmar el control te das cuenta que no hay pulsadores analogicos son pulsadores esos de goma con pintura conductora... por ende no pueden ser analogicos... quizas mide cuanto tiempo esta pulsando el boton y en base al tiempo va devolviendo valores analogicos... pero la verdad no me consta que los botones devuelvan valores analogicos...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2