Mejorar KEY

Started by panreyes, June 29, 2010, 11:07:48 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

SplinterGU

#30
no diras en serio lo del while y frame, no?

no hace diferencia eso...

y si, vi tu mensaje, por eso puse el codigo, para que veas que funciona, yo lo probe y funciona.

:)

pruebalo, te tiene que funcionar, te sugiero que reemplaces todos los key por esto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JMP

#31
Es verdad que el mio tenia unos fallos importantes pero viendo el codigo de SplinterGU creo haberlos solucionado, seguramente el de SplinterGU sea mucho mejor pero me hacia ilusion acabarlo. ;D


CONST
_RELEASED = 0;
_PRESS = 1;
END
GLOBAL
int state_key[127][1];
END
FUNCTION int keys ( int key_c , int mode )

BEGIN
SWITCH ( MODE )
CASE _RELEASED:
IF ( key ( key_c ) )
state_key[key_c][_released] = 1;
RETURN FALSE;
END
IF ( !KEY ( key_c ) && state_key[key_c][_released] > 0 )
state_key[key_c][_released] = 2;
RETURN TRUE;
END
END
CASE _PRESS:
IF ( KEY ( key_c ) && ( state_key[key_c][_press] == 0 || state_key[key_c][_press] == 2) )
state_key[key_c][_press] = 2;
RETURN TRUE;
END
IF ( !KEY ( key_c ) && state_key[key_c][_press] > 0 )
state_key[key_c][_press] = 0;
RETURN FALSE;
END
END
END
END

PROCESS k ()
PRIVATE
int i;
BEGIN
loop
frame;
for (i=0;i<127;i++)
if (!key (i))
if ( state_key[i][0] == 2 )
state_key[i][0] = 0;
end
else
if ( state_key[i][1] == 2 )
state_key[i][1] = 1;
end
end
end
end
END

Edito:
Con esto ya cogeria todos eventos de una misma tecla.

SplinterGU

jmp, el problema en tu codigo esta que si usas la funcion para la misma tecla varias veces en un mismo frame no va a funcionar correctamente, algunos eventos los va a procesar 1 sola vez, fijate el ejemplo que puse ultimo, llamo 4 veces la funcion dentro del frame para la tecla _5, 2 veces el evento de pulsacion (_key_down, en tu codigo, ese evento solo se haria 1 vez, el primer keys que se usa, y eso puede no ser lo deseado) y eso con tu metodo no funcionaria.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

#33
Quote from: FreeYourMind on July 02, 2010, 07:12:54 AM
Vale, si miras mi mensajes anteriores verás que esto:

IF (_key( _5, _key_down)) creditos +=1; END


fúe lo primero que hice y no me iba.

Cuando llegue a casa vuelvo a probarlo.

Tampoco quiero el While...frame; por medio, sólo el if, el cual llamo dentro de un proceso.

para, que while frame me hablas? el del proceso controlador? eso debe ser necesario, ya que es el que toma la foto de las teclas en ese frame, no sirve un metodo donde se evaluan y se setean variables cuando se llama a la funcion, debe ser una foto para todo el frame.

ya veo, te referis a este while...


   while( !_key( _ESC, _key_pressed ) )

       a = _key( _5, _key_down );
       b = _key( _5, _key_up );
       c = _key( _5, _key_pressed );

       if ( _key( _5, _key_down ) ) creditos +=1; end

       frame;
   end


obviamente ese while no hace a la logica del key_event.lib, es simplemente a modo de ejemplo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Como te he dicho me parece raro, pero no me estaba funcionando, así que llegue a casa lo pruebo, tranqui :)

FreeYourMind

No hay forma Splinter, tu ultimo código aparte de bloquearme el proceso del juego algunos instantes, no funciona la tecla....


Process juego()
begin
.....

Loop

_key_init();

if ( _key( _5, _key_down ) )
   Creditos += 1;
end

_key_exit();

IF (key(_esc) OR exit_status == 1)
       exit("Esto funciona bla bla ",0);
    END

  FRAME;
  END

END

JMP

A riesgo de equivocarme creo que el _key_exit(); sobra.

FreeYourMind

Por cierto JMP tu ultima version tambien ha dejado de funcionar, ahora no hace el true/false correctamente, y pone creditos a lo loco  ;D

FreeYourMind

Quote from: JMP on July 06, 2010, 07:34:25 PM
A riesgo de equivocarme creo que el _key_exit(); sobra.

Lo he quitado y he puesto el _key_init() antes del loop, con esto ya no se bloquea la aplicacion (me imagino que estaba creando procesos a lo loco), pero el boton sigue sin funcionar...

JMP

Con mi última version date cuenta que tengo un proceso que tienes que llamar antes del loop el k(); si no se volvera loco  ;D

Con la de SplinterGU no se me ocurre nada.

SplinterGU

ay, ay, ay...

siempre las funciones de inicializacion se llaman en el momento de inicializacion y las de desinicializacion en el momento de desinicializacion.

expliquemos un poco mas.

funciones init se llaman al cargar el programa, no van dentro de ningun loop.
funciones exit se llaman al finalizar el programa, no van dentro de ningun loop.
ambos, como en el programa de ejemplo.

_key_init va en el main del programa o funcion no nominada, la primera que se ejecuta cuando se ejecuta bennu. si hay algun let_me_alone en el codigo, es necesario llamar a la _key_init nuevamente.
la _key_exit debe ir cuando termina el programa, aunque si hay un let_me_alone al salir del programa no hace falta llamar al _key_exit, aunque recomiendo llamarlo siempre que se sale.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

luego pongo una modificacion para que no sea necesario llamar a la init luego del let_me_alone, ahora mismo no puedo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Grácias Splinter.
Lo que has explicado lo se perfectamente (lo uso en las versiones Wiz, donde utilizo una funcion propia para las keys).
Con las prisas uno se olvida ;)
Pero sigo teniendo problemas, de momento he dejado la antigua de JMP.

JMP:

No miré mucho tu ultima version antes de usarla (en realidad no suelo mirarlas sólo hago copy/paste y declaro las globales ;)) y pensaba que la función k() era usada internamente por la funcion keys.

JMP

Pues no se me habia ocurrido usarla internamente desde la funcion pero aquí va

CONST
_RELEASED = 0;
_PRESS = 1;
END
GLOBAL
int state_key[127][1];
END
FUNCTION int keys ( int key_c , int mode )

BEGIN
        IF (!exists ( type k ) )
                k();
        END
SWITCH ( MODE )
CASE _RELEASED:
IF ( key ( key_c ) )
state_key[key_c][_released] = 1;
RETURN FALSE;
END
IF ( !KEY ( key_c ) && state_key[key_c][_released] > 0 )
state_key[key_c][_released] = 2;
RETURN TRUE;
END
END
CASE _PRESS:
IF ( KEY ( key_c ) && ( state_key[key_c][_press] == 0 || state_key[key_c][_press] == 2) )
state_key[key_c][_press] = 2;
RETURN TRUE;
END
IF ( !KEY ( key_c ) && state_key[key_c][_press] > 0 )
state_key[key_c][_press] = 0;
RETURN FALSE;
END
END
END
END

PROCESS k ()
PRIVATE
int i;
BEGIN
loop
frame;
for (i=0;i<127;i++)
if (!key (i))
if ( state_key[i][0] == 2 )
state_key[i][0] = 0;
end
else
if ( state_key[i][1] == 2 )
state_key[i][1] = 1;
end
end
end
end
END

Ademas con esto funciona y no tiene problemas con los let_me_alone() que decia SplinterGU, aparte de no necesitar llamar el proceso.

FreeYourMind

#44
Vale, de momento pongo la tuya (me lo apunto para mañana que hoy ya no pico más  ;D).
Os doy un karma a ambos.
Grácias.