Autor Tema: Mejorar KEY  (Leído 12530 veces)

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12905
  • Karma: 378
Re: Mejorar KEY
« Respuesta #30 en: Julio 02, 2010, 07:17:21 am »
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.
« última modificación: Julio 02, 2010, 07:24:01 am por SplinterGU »
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

JMP

  • Newbie
  • *
  • Mensajes: 45
  • Karma: 13
Re: Mejorar KEY
« Respuesta #31 en: Julio 02, 2010, 07:32:26 am »
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

Código: [Seleccionar]
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
Código: [Seleccionar]
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.
« última modificación: Julio 02, 2010, 03:55:06 pm por JMP »

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12905
  • Karma: 378
Re: Mejorar KEY
« Respuesta #32 en: Julio 02, 2010, 07:43:21 am »
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

  • Hero Member
  • *****
  • Mensajes: 12905
  • Karma: 378
Re: Mejorar KEY
« Respuesta #33 en: Julio 02, 2010, 07:45:26 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...

Código: [Seleccionar]
   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.
« última modificación: Julio 02, 2010, 07:48:45 am por SplinterGU »
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

  • Hero Member
  • *****
  • Mensajes: 5684
  • Karma: 128
    • GECA soft
Re: Mejorar KEY
« Respuesta #34 en: Julio 02, 2010, 10:26:00 am »
Como te he dicho me parece raro, pero no me estaba funcionando, así que llegue a casa lo pruebo, tranqui :)

FreeYourMind

  • Hero Member
  • *****
  • Mensajes: 5684
  • Karma: 128
    • GECA soft
Re: Mejorar KEY
« Respuesta #35 en: Julio 06, 2010, 07:31:14 pm »
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

  • Newbie
  • *
  • Mensajes: 45
  • Karma: 13
Re: Mejorar KEY
« Respuesta #36 en: Julio 06, 2010, 07:34:25 pm »
A riesgo de equivocarme creo que el _key_exit(); sobra.

FreeYourMind

  • Hero Member
  • *****
  • Mensajes: 5684
  • Karma: 128
    • GECA soft
Re: Mejorar KEY
« Respuesta #37 en: Julio 06, 2010, 07:38:28 pm »
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

  • Hero Member
  • *****
  • Mensajes: 5684
  • Karma: 128
    • GECA soft
Re: Mejorar KEY
« Respuesta #38 en: Julio 06, 2010, 07:43:04 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

  • Newbie
  • *
  • Mensajes: 45
  • Karma: 13
Re: Mejorar KEY
« Respuesta #39 en: Julio 06, 2010, 07:54:08 pm »
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

  • Hero Member
  • *****
  • Mensajes: 12905
  • Karma: 378
Re: Mejorar KEY
« Respuesta #40 en: Julio 06, 2010, 08:14:27 pm »
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

  • Hero Member
  • *****
  • Mensajes: 12905
  • Karma: 378
Re: Mejorar KEY
« Respuesta #41 en: Julio 06, 2010, 08:16:14 pm »
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

  • Hero Member
  • *****
  • Mensajes: 5684
  • Karma: 128
    • GECA soft
Re: Mejorar KEY
« Respuesta #42 en: Julio 06, 2010, 08:40:51 pm »
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

  • Newbie
  • *
  • Mensajes: 45
  • Karma: 13
Re: Mejorar KEY
« Respuesta #43 en: Julio 06, 2010, 08:48:27 pm »
Pues no se me habia ocurrido usarla internamente desde la funcion pero aquí va

Código: [Seleccionar]
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
Código: [Seleccionar]
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

  • Hero Member
  • *****
  • Mensajes: 5684
  • Karma: 128
    • GECA soft
Re: Mejorar KEY
« Respuesta #44 en: Julio 06, 2010, 08:51:31 pm »
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.
« última modificación: Julio 06, 2010, 09:03:09 pm por SplinterGU »