[wiz+others] jkeys.lib

Started by SplinterGU, August 28, 2009, 03:17:05 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

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
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

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  :(

Jurk

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?

SplinterGU

no debes tener de las ultimas versiones...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

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?
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)

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

gecko

de donde la puedo descargar?

o viene ya incluida en la ultima version de bennu?
Torres Baldi Studio
http://torresbaldi.com

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

gecko

#8
...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!
Torres Baldi Studio
http://torresbaldi.com

Drumpi

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.
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)

gecko

si, justo edite el mensaje anterior.

No conocia los archivos .lib

Son practicos, definen sus propias variables y todo.

Muchas gracias!
Torres Baldi Studio
http://torresbaldi.com

SplinterGU

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)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

y se podría añadir soporte para key_down, key_pressed y key_up añadiendo la otra lib que hiciste, splinter?
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

añadiendo no, pero se podria adaptar el codigo a esta.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

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...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es