Usar control pad por USB en lugar de teclas

Started by Shin_Asamiya, February 21, 2015, 03:12:55 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Shin_Asamiya

Pues aquí tengo otra duda.

Resulta que querría directamente ponerle los controles por pad de USB al juego que estoy haciendo de prueba en lugar de por teclas. Me he mirado la wiki de Bennu y he estado buscando en el foro sobre esto, pero no termino de entenderlo.

¿Cómo sé que valor tiene cada botón de mi pad y cada dirección de la cruceta? ¿Cuál sería el equivalente en joystick a If (key(_ <lo que sea>)?

Esto es totalmente nuevo para mi y no logro comprender como funciona.

La momia que fuma

Echa un ojo aquí


Eso si, la faena es que según que mando uses igual cambia la numeración de botones (y ejes) y algo que con tu mando vaya bien, a otra persona con un mando distinto igual le sale una configuración de botones que es un sindiós xD

Shin_Asamiya

#2
Bueno, de momento la idea es comprender cómo funciona. Luego ya tendría que incluir en el juego un menú para configurar botones.

Eso lo he mirado pero no lo he entendido. Estoy completamente perdido. No entiendo esas funciones. Yo vengo del if (key (_lo que sea)) y de ahí que no me saquen.

¿Alguien que pueda explicarme paso por paso cómo se hace esto?

La momia que fuma

A ver, si en realidad no tiene mucha ciencia....


-Joy_getbutton para comprobar los botones:


Viene siendo igual que key, pero especificando un numero de boton en el 2º parametro. En el primero le dices que joystick comprobar (si solo tienes uno conectado ponle 0 y listo). Chupao.


-Para las direcciones, aunque es sencillo si que tiene algo mas de chicha:


Se usa joy_getaxis para consultar un EJE de dirección (o sea, el horizontal o el vertical)


Si, por ejemplo, en el eje horizontal tenemos un valor mayor de 0, es que se le esta dando a la derecha, y si es menor a la izquierda.


Cosa a tener en cuenta: Normalmente, aun cuando no estes pulsando ninguna dirección, los ejes del mando en lugar de quedarse a 0 van a dar algún valor residual, asi que haces las comprobaciones en plan >0 o <0 van a pasar cosas raras, asi que tienes que dar un "margen"


Como hago yo es comprobando si un eje es >15000 o <-15000 y me va bien.


Y ya como consejo general....cuando no entiendas funciones nuevas....experimenta! Si sigues teniendo dudas de como funciona lo de la mod_joy montate un programilla sencillo a base de writes que te muestren en pantalla los valores que devuelven las funciones y usa el mando a ver como reaccionan esos valores.


Lo de "yo vengo de X y de ahí que no me saquen"......no vale! :P

Shin_Asamiya

No, a ver, si eso lo decía en broma. Tampoco es que no me saquen de ahí, pero lo del mando se me hace muy lioso.

Vamos por partes.

De tu explicación la primera pregunta que se me ocurre es ¿cómo sé que número tiene cada botón de mi control pad? ¿Dónde y cómo puedo averiguar esos valores?

Si no lo he entendido mal, el código básico para que un proceso haga algo al pulsar un botón ¿sería este?

if(Joy_getbutton (0,<valor del botón>)
     <acción>;
end


Sigo sin entenderlo bien, porque para mi esto es totalmente nuevo y además hace más de 10 años que no programo nada. Hasta muchas funciones que conocía y manejaba al dedillo antes, como define region, para hacer barras de energía estilo juego de lucha las tengo prácticamente olvidadas ahora.

Lo de las direcciones tampoco lo comprendo bien, pero de momento para no complicarlo lo dejo aquí.

La momia que fuma

Si, el codigo que pones es básicamente como se hace...


Para ver que botón se corresponde a cada numero...pues testea, asigna acciones a cada boton y prueba con el mando. O mira las propiedades del mando en el panel de control (La pantallita esta si usas windows...te digo de memoria, pero luego en bennu creo que los botones estarían numerados a partir de 0, así que habría que restar 1 a los que indican ahí)


Tu hazte a la idea de que Joy_getbutton (0,<valor del botón>) es lo mismo que key(<tecla>) y verás que no es tan complicado.


Lo de las direcciones es parecido....solo que no y además tampoco xD


La función Joy_getbutton (al igual que key) devuelve 1 o 0 (interpretado por el if como "verdadero" o "falso") dependiendo si se cumple o no que se esté pulsando el botón de marras.


Joy_getaxis en cambio devuelve un valor bastante tocho que puede ser mayor o menor de 0, por ejemplo:


if(joy_getaxis(0,1) > 0)


Aqui le digo que compruebe si el eje 1 del mando 0 es mayor que 0. Voy a suponer que el eje 1 es el eje horizontal de la cruceta del pad (también podría ser un stick analógico por ejemplo)


Si le estamos dando a la cruceta a la derecha, ese eje vale positivo, la condición se cumple y hacemos la acción. Para la izquierda el if sería igual pero mirando si es menor que 0 (pongo 0 para que se entienda mejor, pero por lo que explicaba en el otro post en realidad sería mejor comprobar con 15000 y -15000)


Resumiendo, el codigo que puse ahí equivaldría a if(key(_right))


Luego para mirar arriba o abajo sería lo mismo pero mirando en otro eje, el 2, por ejemplo.


Lo que si te puedo decir por experiencia es que ver que eje es cual es medio dolor de huevos xD....y al depender también del mando, cuando lo tengas y lo pruebe alguien con otro mando puede pasar perfectamente que tenga izquierda/derecha mapeado al eje vertical del analogico derecho de ese mando y barbaridades por el estilo xD, aunque ahora que la cosa de los mandos esta mas estandarizada a mandos de 360 o similares igual ya no da tanto problema, no se.




P.D: Yo aquí tratándote de novato, y veo en tu post de presentación que colaborabas en esas jodidas maravillas que eran el Flames of Courage y el Total Devastation! :P
El personaje invitado de la segunda parte del TD, Invento-Man, es cedido de un juego de lucha mío, por cierto xD

Shin_Asamiya

Piensa que soy casi novato, porque hace ya más de 10 años que no programo nada y además yo me quedé en DIV2 y en cosas muy básicas.

El KOF flames en realidad lo empezamos entre 3, pero uno se quedó con el proyecto hace tiempo. Con lo cual, casi todo lo que puedes ver en el ahora es suyo. Algo parecido pasa con el Total Devastation. Yo colaboré mucho en la primera parte (Indi lo hice yo entero, voces incluídas) pero el 2, que es el más famoso porque fue exportado a otros sistemas, yo no hice nada de el. De hecho, estoy mirando el programa y casi todo lo que hay en el no lo entiendo. Algunas cosas por ser nuevas del 2 y otras porque las he olvidado.

Como curiosidad te digo que no me convencen ninguno de los dos. El Total 2 tiene mucha paja que yo quitaría, como esos textos que salen arriba durante el combate, que se comen mucha pantalla. Tampoco me gusta cómo está tratado el sonido, es horrible. Algunas músicas se oyen demasiado altas, algunas voces también... y bueno, su interfaz y sus fuentes no me terminan de convencer. Hay más cosas pero tampoco quiero enrollarme con esto.

El KOF flames es un juego que le veo contrario a la filosofía con la que lo empezamos. La idea en un principio era priorizar calidad por encima de cantidad, por eso sólo tenía 4 personajes inicialmente (Kyo, Iori, Terry y Athena). Así podíamos testear bien las cosas hasta que funcionara todo de forma aceptable. Ahora lo que veo es que es lo contrario, cantidad por calidad. Mucho personaje, mucho striker, mucha cosa, pero a costa de ser un juego inestable y mediocre.

Bueno, dicho esto, tema pads.

Con frecuencia me encuentro juegos hechos con Bennu por aficionados que caen en el error de empezar directamente con el juego sin menús iniciales ni decirte siquiera cómo se controla. Yo estoy pensando hacer un juego simplito de momento para ver si puedo reengancharme a esto, pero si publico lo que haga no querría que el que jugara se encontrase con que no sabe ni cómo controlarlo. Por eso preguntaba lo de los control pads. Quiero dar nada más empezar la opción al jugador de que controle el juego con teclado o con pad, y que pueda configurar este último a su gusto. En ese aspecto tengo mucho camino por recorrer y el apartado de configuración se me hace muy difícil por el momento.

Parece que lo que voy a tener que hacer es un programa pequeño en el que muestre en pantalla qué número sale cuando pulse los distintos botones del mando, pero no sé aún bien cómo hacerlo. Recién empiezo a comprender un poco lo de los pads.

Lo de la cruceta (el analógico no creo que lo use nunca en ningún juego) no lo comprendo bien. ¿Hay alguna forma de ver en pantalla qué valor saca cada dirección? A lo mejor son preguntas un poco tontas pero se me hace muy lioso aún, esto.

La momia que fuma

Quote from: Shin_Asamiya on February 23, 2015, 06:18:43 PMLo de la cruceta (el analógico no creo que lo use nunca en ningún juego) no lo comprendo bien. ¿Hay alguna forma de ver en pantalla qué valor saca cada dirección? A lo mejor son preguntas un poco tontas pero se me hace muy lioso aún, esto.


Claro, asigna el resultado de get_position a una variable y listo. Luego la muestras con un write o con show <variable> en la consola de debug*


*Por si no lo conoces, compilas con el parametro -g para que tenga modo debug. Luego en el juego alt+c para sacar la consola de debug.

Shin_Asamiya

Pues no lo pillo bien. ¿Cómo sería el código para que pudiera ver en pantalla los valores que da cada botón o dirección cuando los pulso?

Lo de compilar con el parámetro -g tampoco lo entiendo. No sé dónde hay que poner la -g. Pero vamos que yo me conformaría con lo que estoy usando ahora para ver variables en pantalla, sencillamente escribir un texto con write_var.

La momia que fuma


Pues haz una variable, "valor" por ejemplo y para verla métela en un write_int*


Luego a cada frame haces valor=joy_getaxis(<mando>, <eje>);


(Date cuenta que el write_int se actualiza solo, mételo fuera de bucles)


Para lo del debug...bueno, no se que editor usas y si es uno de los que ya te ejecutan el programa...no es mi caso, yo la compilación y ejecución las hago con un .bat...


En el bat compilo el programa con bgdc -g programa.prg y luego ejecuto con bgdi programa.dcb para tener el modo debug. No se como será en otros entornos.








*Joer, está mal el ejemplo de la wiki ::)
Donde pone write_int(0,320/2,200/2,4,my_integer); es write_int(0,320/2,200/2,4,offset my_integer);

Shin_Asamiya

#10
El problema es que yo me acostumbré en su día mucho a pensar por "ifs" y hay cosas que no comprendo bien cuando me las sacan de condiciones. Porque yo pensaba, muy bien, tengo que ponerle que si presionas tal botón, por ejemplo, escriba algo en pantalla y entonces pensaba "si no sé qué número tiene ese botón ¿cómo se lo indico?".

Sigo sin comprenderlo bien. Si meto eso en un bucle, cada vez que presione un botón (o el eje en su caso) ¿escribirá el valor correspondiente?

Otra pregunta, ¿qué diferencia hay entre write_var y write_int? Yo últimamente uso write_var ¿Funcionan igual?

Yo compilo los prgs con el Prg Editor que viene con el Bennu Pack. Por eso no había entendido lo de la -g.

La momia que fuma


Fuera de bucle: write_int/write_var de variable <botonx>


En el bucle: botonx=Joy_getbutton (0,<nº de boton>);


El write esta hecho para actualizarse solo, por lo que no hay que meterlo en bucle (de hecho si lo metes en bucle la lías porque estarias creando nuevos writes uno encima de otro)


La otra linea es pura lógica. Al estar en un bucle, a cada frame tenemos en la variable botonx el resultado de si se esta pulsando o no el nº de boton que le estamos diciendo a Joy_getbutton.


Y al tener el valor de botonx mostrado en pantalla con el write, cuando probando con el mando aciertes en el botón que le has dicho a Joy_getbutton, el numero cambiará de 0 a 1 (mientras mantengas pulsado) y con el resto de botones no.


Joy_getbutton lo que hace es devolver un valor, 1 si se cumple que en ese momento se esta pulsando el boton indicado, y 0 si no.


Al meterlo en un if, el if interpreta el 1 como "verdadero" y el 0 como "falso"


Y key() hace exactamente lo mismo.

De verdad lo mejor es que pruebes y veas si falla o como falla o si sale bien o que pasa, te lo puedo explicar mil veces pero para estas cosas como mejor se aprende es haciendolas, en serio :P


Sobre write_var y write_int, si, vienen a funcionar igual, de hecho write_var es mejor porque vale para cualquier tipo de variables, y la otra solo para ints.

Shin_Asamiya

Vale, creo que ya lo he entendido. Copio aquí el programa de prueba que he hecho por si alguien que tenga la misma duda quiere utilizarlo. En mi caso es un pad de Saturn por USB, luego cada uno que haga sus ajustes.

Program control_pad;

import "mod_debug"
import "mod_draw"
import "mod_file"
import "mod_key"
import "mod_joy"
import "mod_grproc"
import "mod_map"
import "mod_math"
import "mod_rand"
import "mod_screen"
import "mod_scroll"
import "mod_sound"
import "mod_string"
import "mod_timers"
import "mod_text"
import "mod_blendop"
import "mod_video"
import "mod_wm"
import "mod_proc"
import "mod_say"

global

boton_a;
boton_b;
boton_c;

boton_x;
boton_y;
boton_z;

boton_l;
boton_r;

boton_start;

eje_horizontal;
eje_vertical;

begin

set_fps(60,0);
scale_resolution=12800960;
set_mode(320,240,32,MODE_WINDOW);

//Escribe los botones

write(0,80,80,3,"Boton A:");
write_var(0,140,80,3,boton_a);

write(0,80,90,3,"Boton B:");
write_var(0,140,90,3,boton_b);

write(0,80,100,3,"Boton C:");
write_var(0,140,100,3,boton_c);

write(0,180,80,3,"Boton X:");
write_var(0,240,80,3,boton_x);

write(0,180,90,3,"Boton Y:");
write_var(0,240,90,3,boton_y);

write(0,180,100,3,"Boton Z:");
write_var(0,240,100,3,boton_z);

write(0,80,60,3,"Boton L:");
write_var(0,140,60,3,boton_l);

write(0,180,60,3,"Boton R:");
write_var(0,240,60,3,boton_r);

write(0,130,30,3,"Start");
write_var(0,190,30,3,boton_start);

//Escribe los ejes

write(0,114,140,3,"Eje horizontal:");
write_var(0,214,140,3,eje_horizontal);

write(0,114,160,3,"Eje vertical:");
write_var(0,214,160,3,eje_vertical);

loop

//Comprueba si se pulsan los botones indicados

boton_a=Joy_getbutton(0,0);
boton_b=Joy_getbutton(0,1);
boton_c=Joy_getbutton(0,2);

boton_x=Joy_getbutton(0,3);
boton_y=Joy_getbutton(0,4);
boton_z=Joy_getbutton(0,5);

boton_l=Joy_getbutton(0,6);
boton_r=Joy_getbutton(0,7);

boton_start=Joy_getbutton(0,8);

//Comprueba si se pulsan las direcciones indicadas

eje_horizontal=joy_getaxis(0,0);
eje_vertical=joy_getaxis(0,1);

frame;

end
end


Los mods copio siempre todos esos por defecto para que no me de problemas.

Parece un test de recreativas, es curioso.

Por cierto, con mi pad he visto que cuando uno ha pulsado una dirección y la suelta ya no vuelve el valor a 0, sino a -1, pero no creo que eso sea un problema. En mi caso los valores de las direcciones suben de 30.000.

Ahora va mi siguiente pregunta. Si quiero hacer que se pueda configurar el pad para que sea posible jugar con cualquier mando sin problema ¿cómo puedo hacerlo?

FreeYourMind

Vaya! Me alegro de ver a un amiguete de Mr Matsusaka, el famoso trio de amiguetes que empezaron esos fantasticos juegos de lucha y que salen de espectadores en los mismos, juegos que tuve el honor de portar a varias plataformas  ;D