lib for abstaction of controls, for PC and wiz for now... (based on apagame project)
jkeys.lib
import "mod_key";
import "mod_joy";
import "mod_proc";
/* -------------------------------------------------------------------------- */
const
_JKEY_UP = 0 ;
_JKEY_UPLEFT = 1 ;
_JKEY_LEFT = 2 ;
_JKEY_DOWNLEFT = 3 ;
_JKEY_DOWN = 4 ;
_JKEY_DOWNRIGHT = 5 ;
_JKEY_RIGHT = 6 ;
_JKEY_UPRIGHT = 7 ;
_JKEY_MENU = 8 ;
_JKEY_SELECT = 9 ;
_JKEY_L = 10 ;
_JKEY_R = 11 ;
_JKEY_A = 12 ;
_JKEY_B = 13 ;
_JKEY_X = 14 ;
_JKEY_Y = 15 ;
_JKEY_VOLUP = 16 ;
_JKEY_VOLDOWN = 17 ;
_JKEY_CLICK = 18 ;
_JKEY_LAST = 19 ;
end
/* -------------------------------------------------------------------------- */
#define jkeys_controler() _jkeys_old_version=1;jkeys_init()
/* -------------------------------------------------------------------------- */
global
int _jkeys_exit = 0;
int _jkeys_old_version = 0;
int jkeys[_JKEY_LAST];
int jkeys_state[_JKEY_LAST];
end
/* -------------------------------------------------------------------------- */
function jkeys_set_default_keys()
begin
jkeys[ _JKEY_UP ] = _UP ;
jkeys[ _JKEY_UPLEFT ] = 0 ;
jkeys[ _JKEY_LEFT ] = _LEFT ;
jkeys[ _JKEY_DOWNLEFT ] = 0 ;
jkeys[ _JKEY_DOWN ] = _DOWN ;
jkeys[ _JKEY_DOWNRIGHT ] = 0 ;
jkeys[ _JKEY_RIGHT ] = _RIGHT ;
jkeys[ _JKEY_UPRIGHT ] = 0 ;
jkeys[ _JKEY_MENU ] = _ESC ;
jkeys[ _JKEY_SELECT ] = _ENTER ;
jkeys[ _JKEY_L ] = 0 ;
jkeys[ _JKEY_R ] = 0 ;
jkeys[ _JKEY_A ] = _A ;
jkeys[ _JKEY_B ] = _D ;
jkeys[ _JKEY_X ] = _S ;
jkeys[ _JKEY_Y ] = _W ;
jkeys[ _JKEY_VOLUP ] = 0 ;
jkeys[ _JKEY_VOLDOWN ] = 0 ;
jkeys[ _JKEY_CLICK ] = 0 ;
end
/* -------------------------------------------------------------------------- */
process jkeys_init()
private
i;
#if 0
axis_x, axis_y;
#endif
begin
signal_action( s_kill, s_ign );
signal( type jkeys_init, s_kill );
signal_action( s_kill, s_dfl );
priority = 999999;
loop
for ( i = 0; i < _JKEY_LAST; i++ )
if ( jkeys[i] )
jkeys_state[i] = key( jkeys[i] );
else
jkeys_state[i] = 0;
end
end
switch ( os_id )
case OS_GP2X_WIZ, OS_CAANOO: /* Wiz */
jkeys_state[ _JKEY_UP ] |= joy_getbutton( 0, _JKEY_UP );
jkeys_state[ _JKEY_UPLEFT ] |= joy_getbutton( 0, _JKEY_UPLEFT );
jkeys_state[ _JKEY_LEFT ] |= joy_getbutton( 0, _JKEY_LEFT );
jkeys_state[ _JKEY_DOWNLEFT ] |= joy_getbutton( 0, _JKEY_DOWNLEFT );
jkeys_state[ _JKEY_DOWN ] |= joy_getbutton( 0, _JKEY_DOWN );
jkeys_state[ _JKEY_DOWNRIGHT ] |= joy_getbutton( 0, _JKEY_DOWNRIGHT );
jkeys_state[ _JKEY_RIGHT ] |= joy_getbutton( 0, _JKEY_RIGHT );
jkeys_state[ _JKEY_UPRIGHT ] |= joy_getbutton( 0, _JKEY_UPRIGHT );
jkeys_state[ _JKEY_MENU ] |= joy_getbutton( 0, _JKEY_MENU );
jkeys_state[ _JKEY_SELECT ] |= joy_getbutton( 0, _JKEY_SELECT );
jkeys_state[ _JKEY_L ] |= joy_getbutton( 0, _JKEY_L );
jkeys_state[ _JKEY_R ] |= joy_getbutton( 0, _JKEY_R );
jkeys_state[ _JKEY_A ] |= joy_getbutton( 0, _JKEY_A );
jkeys_state[ _JKEY_B ] |= joy_getbutton( 0, _JKEY_B );
jkeys_state[ _JKEY_X ] |= joy_getbutton( 0, _JKEY_X );
jkeys_state[ _JKEY_Y ] |= joy_getbutton( 0, _JKEY_Y );
jkeys_state[ _JKEY_VOLUP ] |= joy_getbutton( 0, _JKEY_VOLUP );
jkeys_state[ _JKEY_VOLDOWN ] |= joy_getbutton( 0, _JKEY_VOLDOWN );
jkeys_state[ _JKEY_CLICK ] |= joy_getbutton( 0, _JKEY_CLICK );
jkeys_state[ _JKEY_UP ] |= jkeys_state[ _JKEY_UPLEFT ] | jkeys_state[ _JKEY_UPRIGHT ] ;
jkeys_state[ _JKEY_DOWN ] |= jkeys_state[ _JKEY_DOWNRIGHT ] | jkeys_state[ _JKEY_DOWNLEFT ] ;
jkeys_state[ _JKEY_LEFT ] |= jkeys_state[ _JKEY_UPLEFT ] | jkeys_state[ _JKEY_DOWNLEFT ] ;
jkeys_state[ _JKEY_RIGHT ] |= jkeys_state[ _JKEY_UPRIGHT ] | jkeys_state[ _JKEY_DOWNRIGHT ] ;
end
#if 0
case OS_CAANOO: /* Caanoo */
axis_x = joy_getaxis( 2, 0 );
axis_y = joy_getaxis( 2, 1 );
jkeys_state[ _JKEY_UP ] |= ( axis_y < -16384 );
jkeys_state[ _JKEY_UPLEFT ] |= ( axis_y < -16384 ) && ( axis_x < -16384 );
jkeys_state[ _JKEY_LEFT ] |= ( axis_x < -16384 );
jkeys_state[ _JKEY_DOWNLEFT ] |= ( axis_y > 16384 ) && ( axis_x < -16384 );
jkeys_state[ _JKEY_DOWN ] |= ( axis_y > 16384 );
jkeys_state[ _JKEY_DOWNRIGHT ] |= ( axis_y > 16384 ) && ( axis_x > 16384 );
jkeys_state[ _JKEY_RIGHT ] |= ( axis_x > 16384 );
jkeys_state[ _JKEY_UPRIGHT ] |= ( axis_y < -16384 ) && ( axis_x > 16384 );
jkeys_state[ _JKEY_MENU ] |= joy_getbutton( 0, _JKEY_MENU );
jkeys_state[ _JKEY_SELECT ] |= joy_getbutton( 0, _JKEY_SELECT );
jkeys_state[ _JKEY_L ] |= joy_getbutton( 0, _JKEY_L );
jkeys_state[ _JKEY_R ] |= joy_getbutton( 0, _JKEY_R );
jkeys_state[ _JKEY_A ] |= joy_getbutton( 0, _JKEY_A );
jkeys_state[ _JKEY_B ] |= joy_getbutton( 0, _JKEY_B );
jkeys_state[ _JKEY_X ] |= joy_getbutton( 0, _JKEY_X );
jkeys_state[ _JKEY_Y ] |= joy_getbutton( 0, _JKEY_Y );
jkeys_state[ _JKEY_VOLUP ] |= joy_getbutton( 0, _JKEY_VOLUP );
jkeys_state[ _JKEY_VOLDOWN ] |= joy_getbutton( 0, _JKEY_VOLDOWN );
jkeys_state[ _JKEY_CLICK ] |= joy_getbutton( 0, _JKEY_CLICK );
jkeys_state[ _JKEY_UP ] |= jkeys_state[ _JKEY_UPLEFT ] | jkeys_state[ _JKEY_UPRIGHT ] ;
jkeys_state[ _JKEY_DOWN ] |= jkeys_state[ _JKEY_DOWNRIGHT ] | jkeys_state[ _JKEY_DOWNLEFT ] ;
jkeys_state[ _JKEY_LEFT ] |= jkeys_state[ _JKEY_UPLEFT ] | jkeys_state[ _JKEY_DOWNLEFT ] ;
jkeys_state[ _JKEY_RIGHT ] |= jkeys_state[ _JKEY_UPRIGHT ] | jkeys_state[ _JKEY_DOWNRIGHT ] ;
end
#endif
end
frame;
end
onexit:
if ( !_jkeys_exit && !_jkeys_old_version ) jkeys_init(); end
end
/* -------------------------------------------------------------------------- */
function jkeys_exit()
begin
_jkeys_exit = 1;
signal( type jkeys_init, s_kill );
end
/* -------------------------------------------------------------------------- */
Sample of use....
import "mod_video";
import "mod_map";
import "mod_proc";
import "mod_screen";
import "mod_say";
#include "jkeys.lib"
BEGIN
jkeys_set_default_keys();
jkeys_init();
set_mode(320,240,8);
graph = map_new(32,32,8);
map_clear(0,graph,rgb(128,0,0));
x = 160;
y = 120;
repeat
IF (jkeys_state[_JKEY_UP ] && y > 0 ) y-=4; end
IF (jkeys_state[_JKEY_DOWN ] && y < 240 - 16 ) y+=4; end
IF (jkeys_state[_JKEY_LEFT ] && x > 0 ) x-=4; end
IF (jkeys_state[_JKEY_RIGHT] && x < 320 - 16 ) x+=4; end
if(jkeys_state[_JKEY_A]) map_clear(0,graph,rgb(128,0,0)); end
if(jkeys_state[_JKEY_B]) map_clear(0,graph,rgb(0,128,0)); end
if(jkeys_state[_JKEY_X]) map_clear(0,graph,rgb(0,0,128)); end
if(jkeys_state[_JKEY_Y]) map_clear(0,graph,rgb(128,128,128)); end
if(jkeys_state[_JKEY_SELECT]) map_clear(0,graph,rgb(255,255,255)); end
FRAME;
until(jkeys_state[_JKEY_MENU])
let_me_alone();
jkeys_exit();
END
Esto estaría muy bien en el wiki. Hay que contar un poco la vida, pero estaría muy bien. Lo subiría yo mismo, pero ya sabeis: exámenes :(
Estoy intentando integrar este codigo con el mio, para hacerlo funcionar... y no lo consigo
no se porque, pero no tengo la constante OS_GP2X_WIZ por ningun lado... me hechais una manita?
no debes tener de las ultimas versiones...
Pregunta relámpago:
¿El valor de las constantes es el valor que devuelve el "mando" de WIZ cuando se pulsa cada boton? espero que sí, porque coincidirían a la perfección con GP2X y sería un ahorro de código (sobre todo teniendo en cuenta que GP2X podría hacer uso de sus 16 direcciones).
¿Y qué botón es _JKEY_LAST?
son los valores que devuelve, si...
_JKEY_LAST es una constante que indica que los valores menores a dicha constante son valores validos de botones.
de donde la puedo descargar?
o viene ya incluida en la ultima version de bennu?
q cosa?
...pense que era una especie de modulo o algo asi para bennu, por eso pedia la descarga.
entonces con crear yo el archivo jkeys.lib con el codigo que publicaste alcanza?
EDITO: Gracias, funciona perfecto!
Ya viene de serie, es la mod_joy.
La jkeys.lib es el primer código que ha puesto, símplemente es para definir las constantes para tu código y eso.
si, justo edite el mensaje anterior.
No conocia los archivos .lib
Son practicos, definen sus propias variables y todo.
Muchas gracias!
tomada sugerencia de windgate sobre uso de onexit, se adapta la lib para poder aprovechar el onexit.
se agrega prioridad 999999 al controlador.
se agrega funcion jkeys_exit() y jkeys_controler pasa a llamarse jkeys_init() (tambien se mantiene compatibilidad con la vieja jkeys_controler, si se usa jkeys_controler(), la nueva funcionalidad no trabaja)
y se podría añadir soporte para key_down, key_pressed y key_up añadiendo la otra lib que hiciste, splinter?
añadiendo no, pero se podria adaptar el codigo a esta.
Lo del key_down, key_pressed y compañía lo veo algo indispensable después de haberlo usado xD
Y una lib para entrada de texto por teclado también, yo tengo una por ahí en un .prg que va de lujo...
Comparte amigo, por cierto el algun post yo ponia tambien código para eso, donde DCElso tambien aportaba algo.
Estoy teniendo problemas con el joy de Caanoo, en las diagonales la distancia de movimiento se duplica (tengo las esquinas mapeadas)....
Estoy intentando hacer el port para CAANOO y me peta a iniciar el programa. No sé si es por las teclas o algo relacionado con los graficos. Por lo relativo a las teclas tengo puesto el código asi:
IMPORT...
#include "jkeys.lib"
...
PROCESS Main()
BEGIN
jkeys_set_default_keys();
jkeys_init();
REPEAT
...
UNTIL(key (_esc))
let_me_alone();
jkeys_exit();
END
No sé si tengo que declarar el jkeys_init en cada proceso o que... Hay algun tuto para las keys?
Por si quereis el código entero (http://ubuntuone.com/p/SO7/).
que es eso que la diagonal en la distancia se duplica? no te entiendo.
Sencillamente he comentado los mapeos de las diagonales.
Nada, que no he tenido que cambiar ningun mapeo en relación a las versiones de Wiz, ni cambiar nada en el código usado para los joy(), unicamente he tenido que quitar las diagonales, porque por ejemplo, aparte de la respuesta que tenia haciendo un izquierda + arriba, tenia tambien la respuesta de un izquierda_arriba (diagonal), con lo cual el prota se movia el doble de espacio...
Quote from: FreeYourMind on December 06, 2010, 11:48:59 PM
Sencillamente he comentado los mapeos de las diagonales.
Nada, que no he tenido que cambiar ningun mapeo en relación a las versiones de Wiz, ni cambiar nada en el código usado para los joy(), unicamente he tenido que quitar las diagonales, porque por ejemplo, aparte de la respuesta que tenia haciendo un izquierda + arriba, tenia tambien la respuesta de un izquierda_arriba (diagonal), con lo cual el prota se movia el doble de espacio...
pero eso tambien pasa en wiz... el problema es que no tienes un case o un if con else...
voy a verificarlo, pero creo que las diagonales en wiz tambien activan la horizontal y vertical.
No lo hacen porque estoy usando el mismo código, de todas formas yo no uso tu lib actual, pero si una que me ayudaste a crear antes que pusieras la tuya en el foro.
lo tendre que chequear y eventualmente corregir en caanoo si es que corresponde cuando me lleguen las memorias.
avisame si estas y podes probar una nueva version de la dll a ver si ya se corrije el tema...
gracias.
No te he entendido.
no es tan dificil lo que digo, tengo una version nueva de la libjoy.so para comportarse igual que en wiz.
Bueno, pues de momento no puedo probartelo, ya que no estoy usando tu lib en mi proyecto principal, cuando saque el modulo de DCElso ya lo probaré, ya que me voy a poner con su modulo de nuevo (estuve arreglando mi ordenador, y parece que ya esta ok de nuevo).
puf... parece que explicar las cosas es mas dificil de lo que pense... o quizas hablo en chino...
no hablo de mi libreria, hablo del modulo oficial de bennugd, que espero estes usando porque me volviste loco con lo de usar la SDL oficial... pero dejalo, no importa, ya lo probare cuando pueda...
Quote from: FreeYourMind on December 07, 2010, 10:41:13 AM
No te he entendido.
No esque hables chino ,lo que pasa Splinter que tienes que tirar el chicle para parlar... xD
Se habra comprao la maquina esta xDDDD
(http://coinsandmoreonline.com/images/Toy-MickeyMouseGumballMachine-1968-VG.jpg)
Estoy llamando la SDL del firmware, como se solia hacer en WIZ.
a ver... me estas tomando el pelo o me hablas en serio? me estoy poniendo nervioso...
a ver... ultima vez...
vos usas la mod_joy.so? haces un import "mod_joy"; ?
si tu respuesta es afirmativa, entonces te estoy ofreciendo eso, una mod_joy nueva (que en realidad se llama libjoy.so)... no te estoy ofreciendo ningun prg, sino un binario linux caanoo.
como no tengo memoria en la caanoo, hasta no probarla no la liberare, ni subire el codigo al SVN, necesito alguien que la pruebe por mi.
que quede claro: NO TE ESTOY OFRECIENDO LA JKEYS.LIB (LIBRERIA PRG DE ESTE HILO)
Calma Splinter, no deberias entrar tanto en Gp32spain :D
Si, correcto, uso la mod_joy efectivamente, no te habia entendido.
bueno, si quieres probarla, me avisas y te la paso... saludos.
Vale, te la pruebo con el juego que he portado ayer poniendole de nuevo las diagonales.
fue al mail, gracias.
Ok, durante el día lo pruebo.
Buenas noticias para la comunidad (y malas para mi).
La nueva lib ya corrije el problema (se comporta como en Wiz, eso si esta nueva no se si sigue funcionando igual en Wiz, así espero), me imagino que la sacarás en la nueva beta.
Lo malo es que como le he quitado las diagonales debido a esto (en la versión publicada de mi juego), pues ahora con la nueva mi compilado antiguo sin diagonales ya no funciona y la nave no se desloca en diagonal, con lo cual tendré que recompilar de nuevo el juego para Caanoo cuando saques la nueva Beta con la nueva version de la lib.
podes usar la distro que ya tenes con esa lib... esto solo modifica la version de caanoo.
gracias por las pruebas.
Si claro, la incluyo en el juego. Pero ya sabemos como son estas cosas, quien pruebe el juego dentro de un mes, va mantener el runtime que tenga en la Caanoo (el mas reciente) y se llevará la sorpresa.
De todos modos voy a esperar, porque no se si te habrás dado cuenta, pero el rendimiento del juego se me ha quedado por debajo de la distro para Wiz (lo puedes ver en los comentarios en openhandhealds), así que voy a esperar a que el runtime/SDL mejoré esto, y cuando este ya volveré a publicar otra versión.
nadie se va a llevar ninguna sorpresa porque esa misma dll saldra en el proximo runtime.
con respecto al rendimiento, me parece raro, porque las pruebas que yo hice daban un rendimiento superior a WIZ... bueno, es cierto que eran con la anterior SDL.
Con el anterior si era por lo menos similar, pero ahora el tema me preocupa bastante :(
bueno, todo no se puede, vos querias la SDL del firmware, ahi esta la SDL del firmware, aunque es un poco lenta...
proba con la SDL compilada por los usuarios, creo que hay una optimizada.
Si sabes el link, se agradece, y si va mejor pues, lo ponemos chutando de nuevo de la carpeta del runtime :D
no recuerdo, busca en gp32spain
Que constante es la del boton para caanoo 'Help I' ?
(La del Help II es _JKEY_SELECT = 9 ;)
creo que no esta soportada por esta lib, la tenes que agregar.
Ya, ponerle una constante en codigo bennu no tiene mas, pero en la mod_joy esta implementado ?
si, esta implementado, solo tenes que ponerle la constante adecuada.
Tontaco soy, ya habia acertado en la constante pero tenia la condicion mal por eso no iba xD
no te voy a llevar la contra...
El número 20, pero no sé su nombre de constante.
Eso lo podrías haber mirado en el "BennuGD pad test" que viene en el runtime de caanoo, ahí puedes probar todos los botones y los sensores de movimiento... que no veas lo que se mueven.
Si no he entendido mal, hay uno para ver la inclinación lateral cuando la consola está tumbada, otro para la inclinación lateral cuando está en vertical y un último que nos dice cómo de tumbada está la consola ¿no? un poco confuso, es más sencillo el de Wii, que tenemos la misma información con solo dos giroscópios.
y que vibre como iria???
solo por preguntar...
la vibracion aun la tengo pendiente... la cosa es que no se que tanto normalizado esta...
Eso se lo preguntas a Link, que hizo el módulo de joys con vibración. Para Caanoo pregunta en gp32spain.
Y si no, leches, un módulo no oficial y sansacabó :D :D :D