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...
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).
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?
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
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..
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.
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
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.
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 :)
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.
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);
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.
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.
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..
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...
Vale, me refiero a los de la consola (todos los perifericos no oficiales de la consola que sea tienen que tener conectores identicos a los originales, ya que son sistemas fijos).
Sobre los de PC, pues logicamente aunque fisicamente existan clonicos que parezcan iguales a los de una ps por ejemplo, internamente pueden ser muy distintos, por eso existen programas de configuración del joy con casi todos los juegos, incluso vienen con la mayoria de los joysticks.
auqnue si haces un juego que sólo utilize hasta 2 botones, puedes asegurarte de que va funcionar en más del 90% de los joysticks que existen para PC, ya que es uno de los padrones más viejuno de todos.
no se si me respondes a mi, pero yo me refiero a los originales dualshock 2, de ps2.
El caso es que los dualshock te miden la intensidad de la pulsacion. Si pulsas un poco Snake anda un poco y si pulsas mucho corre XD No se como lo haran pero midiendo el tiempo de pulsacion imposible.
Splinter, estoy probando y buscando alguna funcion que me lea cuantas setas analogicas tiene el mando. Hay alguna funcion que me valga para tal cosa? Los axis por lo que veo son los gatillos superiores del mando. Los hats tal vez? Los estoy probando pero me devuelve valor 0...
No, lo bueno del foro es que te avisa que han posteado mientras escribes, y justo ahora ha vuelto a ocurrir :)
Quote from: Mr Matsusaka on April 07, 2010, 04:24:37 PM
El caso es que los dualshock te miden la intensidad de la pulsacion. Si pulsas un poco Snake anda un poco y si pulsas mucho corre XD No se como lo haran pero midiendo el tiempo de pulsacion imposible.
Splinter, estoy probando y buscando alguna funcion que me lea cuantas setas analogicas tiene el mando. Hay alguna funcion que me valga para tal cosa? Los axis por lo que veo son los gatillos superiores del mando. Los hats tal vez? Los estoy probando pero me devuelve valor 0...
Lo que hace el dualshock con los analogicos es recorrer un intervalo de valores, cuanto más deprisa le des, más rápido los recorre, eso lo vi con el programa de test, y es muy dificil que se queden en un valor estable aunque no toques en ellos.
Quote from: FreeYourMind on April 07, 2010, 04:25:41 PM
No, lo bueno del foro es que te avisa que han posteado mientras escribes, y justo ahora ha vuelto a ocurrir :)
a mi no me aviso, se ve que postee antes, a vos si?
Quote from: FreeYourMind on April 07, 2010, 04:28:11 PM
Quote from: Mr Matsusaka on April 07, 2010, 04:24:37 PM
El caso es que los dualshock te miden la intensidad de la pulsacion. Si pulsas un poco Snake anda un poco y si pulsas mucho corre XD No se como lo haran pero midiendo el tiempo de pulsacion imposible.
Splinter, estoy probando y buscando alguna funcion que me lea cuantas setas analogicas tiene el mando. Hay alguna funcion que me valga para tal cosa? Los axis por lo que veo son los gatillos superiores del mando. Los hats tal vez? Los estoy probando pero me devuelve valor 0...
Lo que hace el dualshock con los analogicos es recorrer un intervalo de valores, cuanto más deprisa le des, más rápido los recorre, eso lo vi con el programa de test, y es muy dificil que se queden en un valor estable aunque no toques en ellos.
Ya ya, si lo digo mas que nada porque Splinter decia que en realidad no son analogicos. Yo solo decia que aunque realmente no lo sean, se portan como tales.
Quote from: SplinterGU on April 07, 2010, 04:08:04 PM
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...
Según tengo entendido tiene una membrana plástica que incorpora una resistencia en cada botón, de ahí la característica que hace que cada botón sea progresivo (analógico) y permita varios niveles de presión, sin esa membrana la apariencia el mando es normal y corriente y solo digital, el mando original de psx no tenia.
(http://farm3.static.flickr.com/2791/4101070364_d385ee6f5e.jpg)
(aquí se ve bien la membrana que digo)
También creo haber jugado juegos de carreras pulsando botones normales y notar eso, ahora en el caso del metal gear me has hecho dudar porque hay un delay en la acción de agacharse y ponerse de rodillas ;)
---
Algunos controles más :
Mando original PS2 (12 botones) :
Triangulo = 1
Redonda = 2
X = 3
Cuadrado = 4
L2 = 5
R2 = 6
L1 = 7
L2 = 8
Select = 9
Start = 10
L3 (seta1) = 11
R3 (seta2) = 12
Mando Logitech clonico para pc (12 botones) :
Triangulo = 4
Redonda = 3
X = 2
Cuadrado = 1
L2 = 7
R2 = 8
L1 = 5
L2 = 6Select = 9
Start = 10
L3 (seta1) = 11
R3 (seta2) = 12
Cuando escribes y acaban de postear encuanto escribes, sale un aviso en rojo antes del Subject al darle al post, me ha ocurrido ahora de nuevo :)
Ahh, lo que decia Splinter no son las setas sino los botones analogicos.
Y bueno, hay alguna funcion para cojer el numero de setas?
joy_numaxes es para los gatillos y joy_numhats no me devuelve nada...
Bueno, ante tal silencio deduzco que efectivamente no existe manera de averiguar cuantas setas analogicas tiene el mando. Con lo que la pregunta pasa a convertirse en sugerencia: deberia poderse saber el numero de setas analogicas, principalmente para poder detectar el boton de start.
Al margen de eso, mirando la wikipedia he visto que no hay nada acerca de vibracion en los mandos. Seria interesante contar con tal funcion tambien.
Un segundo, hats te devuelve 0 en el mando de Saturn ??
Creo que lo estabamos enfocando mal, porque usar get_joy_position(0,0) es usar un control analogico, es decir siempre hemos estado usando un control analogico, aunque el mando use cruceta.
Los hats / POV me los suelo encontrar siempre en pads con varios joysticks y de hecho tuve que programarlo así, usando hats porque de otra forma no me iba la cruceta del mando de ps2 :)
Aqui tienes el JoyTest.prg
import "mod_video"
import "mod_wm"
import "mod_joy"
import "mod_text"
import "mod_key"
Global
int i,j; // counters
int joy_num; // total number of joysticks present
string name[9]; // names of the joysticks
int numaxes[9]; // number of axes on each joystick
int numballs[9]; // number of balls on each joystick
int numbuttons[9]; // number of buttons on each joystick
int numhats[9]; // number of hats on each joystick
int a[9][9]; // axis-values: [joysticknr][axisnr]
int t[9][9][1]; // ball-values: [joysticknr][ballnr][0/1] (0: X-value 1: Y-value)
int b[9][29]; // button-values: [joysticknr][buttonnr]
int h[9][9]; // hat-values: [joysticknr][hatnr]
int joy_yoffset[9]; // y-offset of each joystick relative to the top
End
Process Main()
Begin
// Get number of joysticks
joy_num = joy_numjoysticks();
// Iterate over all joysticks
for(i=0; i<joy_num; i++)
// Get name and numbers
name[i] = joy_name(i);
numaxes[i] = joy_numaxes(i);
numballs[i] = joy_numballs(i);
numbuttons[i] = joy_numbuttons(i);
numhats[i] = joy_numhats(i);
// Calculate the yoffset for displaying
if(numbuttons[i]>10)
joy_yoffset[i+1] = 70+(numbuttons[i]-9)/2*10;
else
joy_yoffset[i+1] = 70;
end
joy_yoffset[i+1] += joy_yoffset[i];
// Build display
write( 0 , 0 , joy_yoffset[i] , 0 , "Joystick" );
write( 0 , 0 , joy_yoffset[i]+10 , 0 , "Number:" );
write( 0 , 50 , joy_yoffset[i]+10 , 0 , i );
write( 0 , 0 , joy_yoffset[i]+20 , 0 , "Axes:" );
write( 0 , 50 , joy_yoffset[i]+20 , 0 , numaxes[i] );
write( 0 , 0 , joy_yoffset[i]+30 , 0 , "Balls:" );
write( 0 , 50 , joy_yoffset[i]+30 , 0 , numballs[i] );
write( 0 , 0 , joy_yoffset[i]+40 , 0 , "Buttons:" );
write( 0 , 50 , joy_yoffset[i]+40 , 0 , numbuttons[i] );
write( 0 , 0 , joy_yoffset[i]+50 , 0 , "Hats:" );
write( 0 , 50 , joy_yoffset[i]+50 , 0 , numhats[i] );
write( 0 , 140 , joy_yoffset[i] , 0 , "Axes" );
write( 0 , 190 , joy_yoffset[i] , 0 , "Balls" );
write( 0 , 240 , joy_yoffset[i] , 0 , "Buttons" );
write( 0 , 290 , joy_yoffset[i] , 0 , "Hats" );
for( j=0 ; j<numaxes[i] ; j++ )
write_int( 0 , 140 , 10+j*10+joy_yoffset[i] , 0 , &a[i][j] );
end
for( j=0 ; j<numballs[i] ; j++ )
write_int( 0 , 190 , 10+j*10+joy_yoffset[i] , 0 , &t[i][j][0] );
write_int( 0 , 190 , 18+j*10+joy_yoffset[i] , 0 , &t[i][j][1] );
end
for( j=0 ; j<numbuttons[i] ; j++)
write_int( 0 , 240+(j%2)*20 , 10+(j/2)*10+joy_yoffset[i] , 0 , &b[i][j] );
end
for( j=0 ; j<numhats[i] ; j++)
write_int( 0 , 290 , 10+j*10+joy_yoffset[i] , 0 , &h[i][j] );
end
// Found joystick
write(0, 200, 200, 0, "FOUND JOYSTICK: " + name[i]);
end
// Set a resolution big enough for the display
set_fps(30,0);
set_title("Joystick tester");
if(mode_is_ok(320,joy_yoffset[joy_num],0,0))
set_mode(320,joy_yoffset[joy_num]);
elseif(joy_yoffset[joy_num]<=240)
set_mode(320,240);
else
set_mode(640,480);
end
// Update joystick state every frame until ESC or the X button is pressed
Repeat
for(i=0; i<joy_num; i++)
for(j=0; j<numaxes[i]; j++)
a[i][j] = joy_getaxis(i,j);
end
for(j=0; j<numballs[i]; j++)
t[i][j] = joy_getball(i,j,&t[i][j][0],&t[i][j][1]);
end
for(j=0; j<numbuttons[i]; j++)
b[i][j] = joy_getbutton(i,j);
end
for(j=0; j<numhats[i]; j++)
h[i][j] = joy_gethat(i,j);
end
end
frame;
Until(key(_ESC)||exit_status)
End
capas es una tonteria, pero si al inicio del juego pones " PRESS P1 START" y ahi conseguis el boton Start, y de acuerdo a ese resultado, y a la cantidad de botones y todo lo que estuvieron hablado, conseguis configurar todo el joystick? :)
jeje, se que no es la idea, pero seguro puede servir...
Hhehehhehe, la cosa no funciona así. Podrias tocar los botones que quisieras, si en el código no llamas el código de un boton o tecla de nada te va servir por más press start's que pongas hheheeheheh :D
hombre, esa resistencia no se ve afectada con la presion... es lo mismo que los controles remotos, tienen la misma pintura conductora... es cierto que tiene un valor de resistencia... pero no son analogicos... son pulsado o no pulsado...
yo no creo que devuelvan valores analogicos... lo que deben hacer los juegos es medir cuanto tiempo estan pulsados y en consecuencia, a medida que el contador de pulsaciones (asi como un if (key(blah)) tecla_blah++; else tecla_blah=0; ) simula presion pero no es presion es tiempo, lo que sucedes es que cuando apenas pulsas el boton pulsas y soltas muy rapido, cuando queres ejercer presion mantenes pulsado el boton mas tiempo... pero a mi no me consta que esto lo haga el pad, yo creo que es el juego...
Quote from: BoMbErLiNk on April 07, 2010, 06:58:53 PM
Un segundo, hats te devuelve 0 en el mando de Saturn ??
No, uso un mando tipo dual
Este:
(http://imagesa.ciao.com/ies/images/products/normal/808/product-749808.jpg)
Y me sale a 0...
El de Saturn lo acabo de probar ahora y tambien me da 0. He probado otro mando mas y me sale 0 tambien. Es posible que me de el fallo por estar programando en Linux? Ya probare mañana en Windows a ver si saco algo en limpio...
FreeYourMind gracias por tu codigo, mañana cuando me despierte y ande mas fresco le hechare un vistazo.
Pues si que es raro, que tal si los catalogaras por número de botones ?
--
Splinter lo que dices del tiempo esta bien, pero el mando si reconoce diferentes niveles, ahi tienes el ejemplo de la membrana, los mandos digitales no la necesitan, no tiene sentido ponerla para que no haga nada, hay folletos promocionales de pads clonicos que aseguran tener botones analogicos como el mando de ps2, de declaraciones oficiales de desarrolladoras como Konami hablando de ello y de como iban a utilizarlo en Metal gear solid 2 en los inicios de vida de la consola.
Hablaban de acciones como el apuntado inteligente, pulsando y manteniendo ligeramente el boton apuntas, si lo sueltas no llegas a disparar y vuelves al estado sigilo, si apretas más fuerte (sin soltar el boton) disparas, en este caso podrias tirarte 20 minutos manteniendo ligeramente el boton y apretar más fuerte que seguiria disparando en cualquier momento, de ser un simple contador no podrias hacer esto y después de pasarme todos los juegos de la saga, este apuntado es vital manejarlo bien.
esas membranas las he visto incluso en pads de ps1... y tambien en el viejo spectrum...
sinceramente creo que es mas bien un truco... las membranas esas solo son un plastico con pintura conductora...
pero bueno, a mi me gustaria ver una especificacion tecnica real y no un comentario de una wiki o un foro...
El tema de la sensibilidad de botones lo puedes ver documentado en las SDL lib de ps2, tampoco digo que las membranas lo hagan todo, es solo una parte de un sistema muy ingenioso que usaron (quizas por eso creas que hay truco).
Aquí hay una explicación sobre ello :
http://www.gamesx.com/controldata/ps2pad.htm
He hecho pruebas en Windows y el resultado varia ligeramente. El mando de las setas me devuelve un valor para los hats de 1 (???). El resto de mandos que solo tienen una cruceta el valor que devuielve es 0, igual que Linux.
El numero de axes si me los hace bien.
Este es el codigo que uso:
[code language="bennu"] pad_1_analogs = joy_numballs(0);
say ("balls");
say (pad_1_analogs);
pad_1_analogs = joy_numaxes(0);
say ("axis");
say (pad_1_analogs);
pad_1_analogs = joy_numhats(0);
say ("hats");
say (pad_1_analogs);
[/code]
Como digo los axis si estan bien, pero los hats me devuelve valores raros y ademas varian segun el SO.
Si, el 1 que te devuelve es el de la cruceta como POV cuando hay varias setas, en lugar de averiguar cuantas setas hay, sabes que hay setas porque el hat se pone a la cruceta solo cuando las hay.
Quizas podrias usar este metodo en windows y otro menos preciso en linux como el de los botones
Bueno, despues de hacer ciertas pruebas he llegado a la conclusion de que con las funciones actuales es imposible adivinar con el 100% de garantias cual es el boton start... Existe otra manera si obviamos las setas, y es asignandole el boton start al codigo que sigue al ultimo gatillo, pues hasta donde se siempre es asi.
Sin embargo tampoco he encontrado forma de saber que codigo de tecla tienen los gatillos sin pulsarlos previamente.
Splinter, por el Metal Gear Solid 3, doy fe notarial de que los botones se comportan como analógicos reales, lo que ya no se es si es por arte de magia potagia o como xD
Lo que es curioso es que se aprovechó en muy pocos juegos que yo sepa, solo me viene a la mente el Metal Gear y creo que en algún GTA se notaba al conducir si pisabas "a fondo" el acelerador o suave (Quiza se use en mas juegos de coches, pero nunca fui de juegos de conducción)
Os haceis un lio con la sensibilidad de los botones... Porque no jugais al World Heroes de Neo Geo, si le das rápido al boton das puñetazos rápidos y flacos y si le das con fuerza o despacio das un puñetazo fuerte, esto del 'tacto' de los botones no es nuevo ni tampoco de la era de lo analogico...
Quote from: FreeYourMind on April 08, 2010, 10:19:00 PM
Os haceis un lio con la sensibilidad de los botones... Porque no jugais al World Heroes de Neo Geo, si le das rápido al boton das puñetazos rápidos y flacos y si le das con fuerza o despacio das un puñetazo fuerte, esto del 'tacto' de los botones no es nuevo ni tampoco de la era de lo analogico...
A ver, eso que tu dices si que es lo que comentaba Splinter de usar contadores de tiempo, en realidad no te esta midiendo la fuerza con la que le das al boton ni mucho menos, sino el tiempo...si aprietas fuerte siempre vas a pulsar sin darte ni cuenta unas decimas de segundo el botón mas tiempo que si le quieres dar flojo.
Sin embargo, siguiendo con el ejemplo que ponía antes, el del acelerador en un juego de coches, puedes estar el tiempo que quieras con el botón pulsado y en el momento que te de la gana, y sin haberlo soltado en ningun momento, cargarle mas fuerte para pisar a fondo, y el juego lo detecta y actua en consecuencia. Eso es lo que digo yo que hace el mando de Ps2, y eso no se puede hacer con botones de los de toda la vida por muchos trucos de programacion que uses...
Del mismo modo, en el Metal Gear 3 recuerdo que podias agarrar por sorpresa desde atras a los enemigos (con cuadrado si mal no recuerdo), los podías retener el tiempo que quisieses, y en el momento que apretabas fuerte el boton los degollabas con el cuchillo.
yo tengo los pedales de la ps2... y ninguno de los juegos da carreras que tengo hacen lo que dicen... cuando pisas, pisas, sea a fondo o no...
Los pedales ya no se, estabamos hablando del dual shock 2, pero lo puedes ver definitivamente, si tienes a mano el Metal Gear 3, con esto:
En las escenas cinemáticas hechas con el motor del juego, se puede hacer zoom con triángulo, y se aprecia perfectamente como el botón es análogico o al menos se comporta como tal, cuanto más aprietas mas se acerca el zoom (Y con "más" me refiero a presión, no a tiempo, claro xD).
O con un video ;D
www.bombergames.net/gta.wmv (http://www.bombergames.net/gta.wmv)
Voy apretando de menos a más, en el segundo 13 ya apreto a fondo que es cuando el coche hace BRUUUM y acelero de verdad y NO se trata de la aceleración del coche al mantenerlo pulsado durante un rato, ni de la inercia, ni de nada, porque puedes hacer un arranque rápido si presionas fuerte desde el inicio.
(casí atropello al poli, EY EY EY)
Tener Hardware que complementa la aceleración de un coche en un juego de coches es tan viejuno como la vida de los juegos en si :)
No os perguntais porque el coche de Cruisn' USA en mame no para en direccion firme si no tocais la setas del teclado izq. y derecha para poder mantenerlo ? (Una pesadilla por cierto).
El Out Run arcade que utilizaba la tecnologia 'Force Feedback'
http://en.wikipedia.org/wiki/Force_feedback#Games
O el juego Cabal, que tenia un trackball para dar volteretas, que en las versiones piratas desaparecia la opcion de dar volteretas porque les faltaba esta pieza hardware :) Aunque lo adaptaron despues a un boton, ya que no gusto mucho la idea.
El hardware para hacer cosas especiales en juegos, como medir la intensidad que uno le da a los botones no es nada nuevo, los mejores ejemplos los tenemos en las recreativas.
Y quien dice lo contrario ? Un resumen.
Tema : Como conseguir saber START en cualquier mando ?
Offtopic : los botones de ps2 no son analogicos, es todo un truco, un mito.
Respuesta al offtopic : existen funciones SDL con sensibilidad de botones exclusivamente en la lib de ps2, link hablando sobre el hardware del mando, experiencias propias de diferentes usuarios con ejemplos claros, video enseñando la sensibilidad de 1 solo boton.
Siempre terminamos petandole los hilos a Mr Matsusaka :D
entonces debe ser asi...
Quote from: BoMbErLiNk on April 10, 2010, 03:32:45 PM
Siempre terminamos petandole los hilos a Mr Matsusaka :D
Por algo será que sólo te veo en los de Mr. Matsusaka. :D
Que es broma ;D
Yo no tengo mandos de PS2 para decir si son analógicos o no, los únicos que he visto que REALMENTE son analógicos son los botones L y R de GameCube, creo que detectaban 16 puntos de presión o así. Lo cierto es que me parece un mito que los botones de PS2 sean analógicos, o al menos, que detecten 2 valores de presión, sobre todo teniendo en cuenta que la goma que sujetan los botones hacen muy difícil apretarlos "a medias".
Yo conozco el truco de contar el tiempo pulsado (que ya se hacía en los tiempos de MD con Sonic e incluso antes), pero hasta hoy no había oido nada de botones analógicos en PS2 (y me consta que, en caso de necesitar algo así, recurren a trucos como el F1, que usan los analógicos como acelerador y freno.
Volviendo al hilo: hasta donde se, los mandos de PC hay que pre-configurarlos en todos los juegos, no se usa ninguna base de datos. Hasta donde sé, se sigue un estandar de numeración (por ejemplo, 1, 2, 3 y 4 son las direcciones) ¿Que hay cambios? bueno, si, el start suele ir detrás de los botones de acción, por lo que no sería raro encontrarse que el start sea el boton 7 en un mando de 2 botones, o 9 en uno de 4... aunque puede existir una contranorma: el botón start será el último del mando siempre que este no tenga más de 8 botones (direcciones incluidas), en cuyo caso siempre será el 9.
Otra cosa: yo pensaba que para saber el número de mandos analógicos de un mando bastaba con detectar el número de ejes y dividirlo entre 2. Se que hay mandos con 3 ejes, pero a mi en el mando de N64, al calibrarlo, me pide hacerlo con el eje z, y lo toma como el horizontal.