Bennu Game Development

Foros en Español => Sugerencias => Topic started by: panreyes on June 29, 2010, 11:07:48 PM

Title: Mejorar KEY
Post by: panreyes on June 29, 2010, 11:07:48 PM
Actualmente sólo podemos saber si está siendo pulsada o no.
Me gustaría mejorarla al más puro estilo de eventos javascript o actionscript con algo tipo onDown, onUp, y onPress que es lo que hay actualmente.

Parecerá una chorrada, pero nos evitaríamos cientos de esto:
if(key(_enter))
  while(key(_enter)) frame; end
  loquesea();
end


Sería ideal tener esto:
if(key(_enter,down))
  loquesea();
end


¿Sería difícil de implementar? ¿Hay alguna razón por la que no se deba hacer así? :)
Title: Re: Mejorar KEY
Post by: Drumpi on June 30, 2010, 12:05:39 AM
Hombre, por lo que a mi respecta, ya tengo elegido un método muy efectivo para hacer eso (lo que ya todos sabemos de tener una variable que vale 0 si no está pulsada, y aumentar su valor en 1 unidad a cada frame si lo está), y me ha salvado de más de un apuro a la hora de redefinir teclas, joysticks y demás.

Pero no es mala sugerencia para los novatos. Habría que comprobar su viabilidad.
Lo mismo se puede montar un módulo aparte.
Title: Re: Mejorar KEY
Post by: SplinterGU on June 30, 2010, 12:21:21 AM
las teclas solo dan pulsado cuando se tiene el evento down... y se liberan en el evento up.

podes armar una funcion para hacer eso muy simple, en codigo .prg.
Title: Re: Mejorar KEY
Post by: Windgate on June 30, 2010, 09:16:01 AM
Tengo por ahí un .prg que se ocupa de eso, pero su funcionamiento no me gustaba demasiado, sólo servía para procesos que deban bloquearse totalmente en espera de que se presione/libere una tecla.

Yo la verdad es que también pienso que deberían venir en mod_key esas funciones. Sería mucho más cómodo hacerlo con una llamada a función y no tener que armar el .prg cada vez y usar una función con todas sus locales para detectar el just_pressed y el just_released

Splinter, con eso que dices de armar la función, ¿Te refieres a algo así?

FUNCTION int key_released ( int key_code )
BEGIN
   IF ( NOT key ( key_code ) )
      RETURN FALSE;
   END
   LOOP
      IF ( NOT key ( key_code ) )
         RETURN TRUE;
      END
      FRAME;
   END
END


Eso no lo veo bien, porque la función tiene FRAME y bloquearía al proceso que la invoca, ¿Cómo propondrías el código para detectar si una tecla ha sido liberada usando FUNCTION y sin bloquear al proceso que la invoca? ???
Title: Re: Mejorar KEY
Post by: FreeYourMind on June 30, 2010, 09:21:21 AM
Efectivamente Windgate, usar el frame; como bloquea el proceso que lo invoca no es una solución buena ....

Tambien estoy de acuerdo que deberia venir nativo este proceso de bloqueo.

Y por cierto ya lo he hecho de tantas formas que ya ni se poner ejemplos :)
Title: Re: Mejorar KEY
Post by: JMP on June 30, 2010, 11:06:21 AM
Tengo hecha una funcion que podria sevir,

const
    _PRESS = 0;
    _RELEASED = 1;
end
global
byte released_c=0;
byte press_c=0;
end
FUNCTION int keys ( int key_c ,int mode )

BEGIN
SWITCH ( MODE )
CASE _RELEASED:
IF ( key ( key_c ) )
released_c = 1;
RETURN FALSE;
END
IF ( !KEY ( key_c ) && released_c == 1 )
released_c = 0;
RETURN TRUE;
END
END
CASE _PRESS:
IF ( KEY ( key_c ) && press_c !=1 )
press_c = 1;
RETURN TRUE;
END
IF ( !KEY ( key_c ) && press_c == 1 )
press_c = 0;
RETURN FALSE;
END
END
END
END


y para utilizarlo por ejemplo con el released
IF ( keys ( _up , _released )==TRUE )
say ( "!");
end
Title: Re: Mejorar KEY
Post by: SplinterGU on June 30, 2010, 03:41:02 PM
Quote from: Windgate on June 30, 2010, 09:16:01 AM
Tengo por ahí un .prg que se ocupa de eso, pero su funcionamiento no me gustaba demasiado, sólo servía para procesos que deban bloquearse totalmente en espera de que se presione/libere una tecla.

Yo la verdad es que también pienso que deberían venir en mod_key esas funciones. Sería mucho más cómodo hacerlo con una llamada a función y no tener que armar el .prg cada vez y usar una función con todas sus locales para detectar el just_pressed y el just_released

Splinter, con eso que dices de armar la función, ¿Te refieres a algo así?

FUNCTION int key_released ( int key_code )
BEGIN
   IF ( NOT key ( key_code ) )
      RETURN FALSE;
   END
   LOOP
      IF ( NOT key ( key_code ) )
         RETURN TRUE;
      END
      FRAME;
   END
END


Eso no lo veo bien, porque la función tiene FRAME y bloquearía al proceso que la invoca, ¿Cómo propondrías el código para detectar si una tecla ha sido liberada usando FUNCTION y sin bloquear al proceso que la invoca? ???

no, asi no...

pongo el pseudocodigo, no tengo mucho tiempo.



import "mod_key";
import "mod_video";
import "mod_text";
import "mod_proc";

global
    _key_use = 0;
    _key_state[127][1];
end

#define _key_pressed    0
#define _key_down       1
#define _key_up         2

process _key_get_states()
private
    i;
begin
    priority = 1000;
    loop
        _key_use ^= 1;
        for ( i = 0; i < 127; i++ )
            _key_state[ i ][ _key_use ] = key( i );
        end
        frame;
    end
end

function int _key(int k, int ev)
begin

    if ( !exists( type _key_get_states ) ) _key_get_states(); end

    switch( ev )
        case _key_down:
            return ( _key_state[ k ][ _key_use ] && !_key_state[ k ][ _key_use ^ 1 ] );
        end

        case _key_up:
            return ( !_key_state[ k ][ _key_use ] && _key_state[ k ][ _key_use ^ 1 ] );
        end
    end

    return ( _key_state[ k ][ _key_use ] );
end

private
a,b,c;
begin

    write_int(0,0,0,0,&a);
    write_int(0,0,10,0,&b);
    write_int(0,0,20,0,&c);

    while( !_key( _ESC, _key_pressed ) )

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

        frame;
    end

    let_me_alone();

end


demasiado tonto el codigo.

amigo wind, no necesitas escribir contantemente el codigo, solo lo pones en un .inc o un .h y lo incluyes, si lo necesitas en tu proyecto.
Title: Re: Mejorar KEY
Post by: SplinterGU on June 30, 2010, 03:46:06 PM
edite el codigo, para acortarlo un poquito, quite unos if else y los reemplace por un return directo
Title: Re: Mejorar KEY
Post by: SplinterGU on June 30, 2010, 03:52:53 PM
es importante el let_me_alone(); otra opcion al codigo, que podria ser un poquito mas eficiente y no necesite el let_me_alone.


import "mod_key";
import "mod_video";
import "mod_text";
import "mod_proc";

global
    _key_use = 0;
    _key_state[127][1];
end

#define _key_pressed    0
#define _key_down       1
#define _key_up         2

process _key_init()
private
    i;
    pid;
begin
    if ( ( pid = exists( type _key_init ) ) && pid.id != id ) return; end

    priority = 1000;

    loop
        _key_use ^= 1;
        for ( i = 0; i < 127; i++ )
            _key_state[ i ][ _key_use ] = key( i );
        end
        frame;
    end
end

function _key_exit()
begin
    signal( type _key_init, s_kill );
end

function int _key(int k, int ev)
begin
    switch( ev )
        case _key_down:
            return ( _key_state[ k ][ _key_use ] && !_key_state[ k ][ _key_use ^ 1 ] );
        end

        case _key_up:
            return ( !_key_state[ k ][ _key_use ] && _key_state[ k ][ _key_use ^ 1 ] );
        end
    end

    return ( _key_state[ k ][ _key_use ] );
end

private
a,b,c;
begin

    _key_init();

    write_int(0,0,0,0,&a);
    write_int(0,0,10,0,&b);
    write_int(0,0,20,0,&c);

    while( !_key( _ESC, _key_pressed ) )

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

        frame;
    end

    _key_exit();

end


debo decir que a diferencia de todos los codigos que pusieron, esto no frena ningun proceso, mantiene estados independientes y constantes para todas las teclas, y es generico.
Title: Re: Mejorar KEY
Post by: Windgate on June 30, 2010, 08:43:34 PM
Aún no termino de entender el código, estoy en ello :P pero funciona tan perfectamente que me lo quedo para mí para siempre y te doy un Karma Splinter, por ser tan groso ;D
Title: Re: Mejorar KEY
Post by: SplinterGU on June 30, 2010, 10:06:01 PM
Quote from: Windgate on June 30, 2010, 08:43:34 PM
Aún no termino de entender el código, estoy en ello :P pero funciona tan perfectamente que me lo quedo para mí para siempre y te doy un Karma Splinter, por ser tan groso ;D

:)

gracias
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 01, 2010, 06:41:37 AM
Parece que ultimamente estais resolviendo cosas que iba a implementar en mi actual juego, en este caso voy a probar vuestras funciones en lugar de buscar la forma como lo tenia en los juegos antiguos :)

Por cierto, aprovecho para hacer una pregunta:

Cuando arrastramos la ventana de nuestrio juego Bennu en modo ventana, el juego (objetos, musica, etc) se congela.
No habria forma, ni que fuera por configuración inicial, de que todo el timing del juego siguiera su desarrollo normal (aunque no se pintará nada) mientras la pantalla es arrastrada/movida de lugar ?

Cuando se minimiza la ventana creo que el juego sigue su desarrollo normal, púes seria tener el mismo comportamiento.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 01, 2010, 06:55:29 AM
creo que no hay control sobre eso del movimiento de la ventana.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 01, 2010, 07:16:41 AM
No duermes ? A nivel de SDL no habrá nada al respeto ?
Title: Re: Mejorar KEY
Post by: SplinterGU on July 01, 2010, 07:26:15 AM
no, a nivel sdl no vi nada.

bue, mira quien habla... que haces a esta hora despierto? (o sera que ahi es de dia?) la verdad es que me deprime dormir... pero en un rato tengo que hacerlo.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 01, 2010, 07:26:51 AM
9:26 AM
Title: Re: Mejorar KEY
Post by: SplinterGU on July 01, 2010, 07:41:10 AM
ahora me voy a dormir.
Title: Re: Mejorar KEY
Post by: panreyes on July 01, 2010, 01:00:25 PM
¿Y qué opinas sobre integrarlo en Bennu?
Sería un buen avance tenerlo ya integrado, y ya has demostrado que no tiene complicación ninguna :)
Title: Re: Mejorar KEY
Post by: SplinterGU on July 01, 2010, 04:37:37 PM
no esta mal, pero en este momento prefiero ocupar el tiempo de meter cosas en C en cosas que no se puedan hacer desde codigo bennu
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 01, 2010, 06:48:53 PM
Acabo de probar las funciones de Splinter y de JMP. La de Splinter no me funciona, en cambio JMP se lleva un karma porque la suya funciona perfectamente y no requiere tanto código.


Splinter:

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

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

No funciona...

JMP:

IF (keys (_5 , _press) == TRUE) creditos +=1; END // Va perfecto y no interfiere con el resto del proceso.
Title: Re: Mejorar KEY
Post by: JMP on July 01, 2010, 07:13:11 PM
Gracias por el karma, por cierto segun Windgate el codigo de SplinterGU funciona, lo unico que es mas largo y un poco más lioso.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 01, 2010, 07:29:12 PM
No digo que el ejemplo que puso no lo haga (imprime las teclas), sólo que utilizandolo para ejecutar una acción (como é puesto) no me ha funcionado. Si pone un ejemplo valido lo probaré de nuevo, pero soy partidario de poner el menor código posible.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 01, 2010, 10:32:35 PM
1) nadie dijo que va true

2) el codigo de ejemplo esta puesto, es imposible que no te funcione, no se cual usaste.
pero si te molestas en leer, y ves el ejemplo, en el 2do codigo tenes que hacer un init.

3) el codigo de jmp, no sirve, porque mantiene un solo status de presionado o no, y si pulsas (o soltas) varias teclas mientras otras estan pulsadas o no, a la vez vas a tener un serio problema, y ni que hablar si la llamas varias veces con la misma tecla dentro del mismo frame, y si la llamas para diferentes teclas que esten pulsadas y no, hara cualquier cosa, porque solo tiene 1 variable released y pressed (released_c y pressed_c) para todas las teclas que se pasen.

4) el codigo no es para nada y nada lioso, me extraña que digan eso, es demasiado simple y tonto, por otro lado, no necesitan entenderlo, solo necesitan usarlo.

sinceremante free deberias reveer el tema de decir que algo no funciona y no poner ejemplos, lo haces siempre y luego al ver que fue un error tuyo no lo decis.


import "mod_key";
import "mod_video";
import "mod_text";
import "mod_proc";

global
    _key_use = 0;
    _key_state[127][1];
end

#define _key_pressed    0
#define _key_down       1
#define _key_up         2

process _key_init()
private
    i;
    pid;
begin
    if ( ( pid = exists( type _key_init ) ) && pid.id != id ) return; end

    priority = 1000;

    loop
        _key_use ^= 1;
        for ( i = 0; i < 127; i++ )
            _key_state[ i ][ _key_use ] = key( i );
        end
        frame;
    end
end

function _key_exit()
begin
    signal( type _key_init, s_kill );
end

function int _key(int k, int ev)
begin
    switch( ev )
        case _key_down:
            return ( _key_state[ k ][ _key_use ] && !_key_state[ k ][ _key_use ^ 1 ] );
        end

        case _key_up:
            return ( !_key_state[ k ][ _key_use ] && _key_state[ k ][ _key_use ^ 1 ] );
        end
    end

    return ( _key_state[ k ][ _key_use ] );
end

private
a,b,c;
begin

    _key_init();

    write_int(0,0,0,0,&a);
    write_int(0,0,10,0,&b);
    write_int(0,0,20,0,&c);

    while( !_key( _ESC, _key_pressed ) )

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

        frame;
    end

    _key_exit();

end


funcionar perfectamente
Title: Re: Mejorar KEY
Post by: SplinterGU on July 01, 2010, 10:45:10 PM
mas chico y mas rapido

key_event.lib

#ifndef __KEY_EVENT_LIB
#define __KEY_EVENT_LIB

import "mod_key";
import "mod_proc";

global
    _key_use = 0;
    _key_state[127][1];
end

#define _key_pressed    0
#define _key_down       1
#define _key_up         2

process _key_init()
private
    i;
    pid;
begin
    if ( ( pid = exists( type _key_init ) ) && pid.id != id ) return; end

    priority = 1000;

    loop
        _key_use ^= 1;
        for ( i = 0; i < 127; i++ )
            _key_state[ i ][ _key_use ] = key( i );
        end
        frame;
    end
end

function _key_exit()
begin
    signal( type _key_init, s_kill );
end

#define _key(k,ev) ((ev==_key_down)?(  _key_state[ k ][ _key_use ] && !_key_state[ k ][ _key_use ^ 1 ] ): \
                    (ev==_key_up  )?( !_key_state[ k ][ _key_use ] &&  _key_state[ k ][ _key_use ^ 1 ] ): \
                    ( _key_state[ k ][ _key_use ]))
#endif


key_event_test.prg

import "mod_video";
import "mod_text";

#include "key_event.lib";

private
a,b,c;
begin

    _key_init();

    write_int(0,0,0,0,&a);
    write_int(0,0,10,0,&b);
    write_int(0,0,20,0,&c);

    while( !_key( _ESC, _key_pressed ) )

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

        frame;
    end

    _key_exit();

end


Al que le parezca complicado, no necesita entenderlo, solo necesita usarlo, como se usa en el ejemplo "key_event_test.prg".

funciona perfectamente, con las _5 o con cualquiera, el ejemplo, tiene _5 para que free lo vea.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 01, 2010, 10:47:46 PM
por favor, no te tomes a mal mis comentarios, pero es que decir tan libremente que no funciona cuando puse un ejemplo clarito me puso mal.
Title: Re: Mejorar KEY
Post by: Windgate on July 01, 2010, 11:04:34 PM
Gracias de nuevo Splinter, a mí me ha quedado la duda de combinarlo para usarlo dentro de un juego porque veo algún let_me_alone ( ) que me mosqueó, pero cuando tenga un rato lo miro a fondo y lo añado al 3Dit que es donde añado las utilidades fundamentales de Bennu, ya sabes...

No pidáis mucho a Splinter que ahora mismo está ocupadísimo, es cuestión de que pongamos ese código en nuestro juego y lo hagamos funcionar nosotros mismos, bastante a hecho por su parte.

Y es bueno que el poco tiempo que dedique a Bennu ahora mismo sea para programar cosas en C que no podrían hacerse en Bennu directamente, para hacer cosas en Bennu aquí estamos ya gente de sobra, así que pongámonos las pilas ;)

Al primero que haga funcionar esto lluvia dorada de Karmas ;D
Title: Re: Mejorar KEY
Post by: SplinterGU on July 01, 2010, 11:44:03 PM
gracias wind.

estas ultimas versiones ya no tienen let_me_alone.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 02, 2010, 04:41:14 AM
Te lias tu mismo Splinter  ;D

Si que he hecho el init, y no me va.

El código de JMP no afecta en nada las otras pulsaciones, tambien es cierto que sólo lo he usado en una tecla, no se si será por esto.

Hombre, lo unico que te pido es que me traduzcas esta condición usando tu código:

IF (keys (_5 , _press) == TRUE) creditos +=1; END

Pero has vuelto a poner tu ejemplo cambiandole la tecla a la _5, yo no quiero eso, sólo quiero hacer una acción que es aumentar sólo 1 crédito al pulsar.
Nadie va querer usar tu código para imprimir una letra en pantalla segundo la acción, pero si controlar cosas, que es lo que normalmente se hace con las teclas en un juego  ;D

Grácias por tu atención  ;)
Title: Re: Mejorar KEY
Post by: SplinterGU on July 02, 2010, 06:28:45 AM
if ( _key( _5, _key_down ) ) creditos+=1;end

Quote
Nadie va querer usar tu código para imprimir una letra en pantalla segundo la acción, pero si controlar cosas, que es lo que normalmente se hace con las teclas en un juego  Sonreir

jeje, no hace falta eso...



import "mod_video";
import "mod_text";

#include "key_event.lib";

private
a,b,c;
int creditos;
begin

    _key_init();

    write_int(0,0,0,0,&a);
    write_int(0,0,10,0,&b);
    write_int(0,0,20,0,&c);
    write_int(0,0,30,0,&creditos);

    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

    _key_exit();

end


usa la key_event.lib

saludos
Title: Re: Mejorar KEY
Post by: 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.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 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.
Title: Re: Mejorar KEY
Post by: JMP on July 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


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.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 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.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 02, 2010, 07:45:26 AM
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.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 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 :)
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 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
Title: Re: Mejorar KEY
Post by: JMP on July 06, 2010, 07:34:25 PM
A riesgo de equivocarme creo que el _key_exit(); sobra.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 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
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 06, 2010, 07:43:04 PM
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...
Title: Re: Mejorar KEY
Post by: JMP on July 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.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 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.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 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.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 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.
Title: Re: Mejorar KEY
Post by: JMP on July 06, 2010, 08:48:27 PM
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.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 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.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 06, 2010, 08:58:00 PM
Quote from: JMP on July 06, 2010, 08:48:27 PM
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.

ja, pero esto es el primer codigo que puse yo... :P

lo malo de esto es, que si bien evitar hacer el init, los let_me_alone, etc, por cada llamada a la funcion de testeo, estas recorriendo la lista de procesos para verificar si existe el controlador... es poco optimo, por eso lo quite.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 06, 2010, 09:03:31 PM
Quote from: FreeYourMind on July 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.



como puede ser que no te funciona la mia, y esta si, si esta ultima es el mismo codigo que puse yo anteriormente, salvo que un poco mas rebuscado?

perdon por el edit a tu post, puse modificar en vez de citar... :P
Title: Re: Mejorar KEY
Post by: JMP on July 06, 2010, 09:09:44 PM
No pasa nada por el edit, en serio que no me he dado cuenta de la similitud del codigo hasta que me lo has dicho :P,con lo del fallo de FreeYourMind creo que si sube el codigo completo podriamos ver mejor en que falla.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 06, 2010, 09:23:45 PM
si, al final me va a obligar a que lo tenga que implementar en C, pero lo voy a tener que hacer como un modulo opcion, para evitar si se quiere la carga adicional que va a meter esto.

no puedo creer que no le funcione, los ejemplos son bien simples, y funcionan.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 06, 2010, 09:26:31 PM
Lo uso en la funcion del juego, el esqueleto con sólo el uso de la key ya os lo he puesto.

Prueba a hacerlo en tu ejemplo tambien dentro de un loop con un if a ver si te funciona.



Program blabla

......


BEGIN

Game();

END



PROCESS Game();

BEGIN


....

_key_init();

  LOOP


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

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

  FRAME;
  END

END
Title: Re: Mejorar KEY
Post by: JMP on July 07, 2010, 08:07:29 AM
Lo he probado y funciona perfecto, no se como no te puede ir.

PROGRAM buscaminas;

INCLUDE "DLL/import.prg";
INCLUDE "prg/buscaminas.prg ";
INCLUDE "key_event.lib";


BEGIN
RAND_SEED ( time ( ) );
set_mode ( 800 , 600 , 32 , MODE_WINDOW );
set_fps ( 45 , 0);
_key_init();

load_fpg ( "images/buscaminas.fpg" );
LOOP
IF ( _key( _5, _key_down ) )
puntero();
campo();
BREAK;
END
FRAME;
END

END
Title: Re: Mejorar KEY
Post by: SplinterGU on July 07, 2010, 08:21:46 AM
Quote from: JMP on July 07, 2010, 08:07:29 AM
Lo he probado y funciona perfecto, no se como no te puede ir.

PROGRAM buscaminas;

INCLUDE "DLL/import.prg";
INCLUDE "prg/buscaminas.prg ";
INCLUDE "key_event.lib";


BEGIN
RAND_SEED ( time ( ) );
set_mode ( 800 , 600 , 32 , MODE_WINDOW );
set_fps ( 45 , 0);
_key_init();

load_fpg ( "images/buscaminas.fpg" );
LOOP
IF ( _key( _5, _key_down ) )
puntero();
campo();
BREAK;
END
FRAME;
END

END


gracias por probarlo... karma para vos.
Title: Re: Mejorar KEY
Post by: JMP on July 07, 2010, 08:57:16 AM
FreeYourMind prueba esto te tiene que funcionar si o si.


PROGRAM test;

import "mod_video";
import "mod_text";
INCLUDE "key_event.lib";


BEGIN
set_mode ( 800 , 600 , 32 , MODE_WINDOW );
set_fps ( 45 , 0);
_key_init();

LOOP
IF ( _key( _5, _key_up ) )
write(0,300,100,0,"Funciona");
END
FRAME;
END

END
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 07, 2010, 03:44:11 PM
Voy a probarlo.
Title: Re: Mejorar KEY
Post by: panreyes on July 07, 2010, 03:53:51 PM
Conste que yo ya lo he incluído en un proyecto y funciona DELUXE :)
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 07, 2010, 03:56:23 PM
No funciona nada....
A ver, yo uso las funciones de Splinter internamente, o sea, no uso el import, os pongo la estrutura de como declaro sus variables.

Program blala;

CONST

....

#define _key(k,ev) ((ev==_key_down)?(  _key_state[ k ][ _key_use ] && !_key_state[ k ][ _key_use ^ 1 ] ): \
                   (ev==_key_up  )?( !_key_state[ k ][ _key_use ] &&  _key_state[ k ][ _key_use ^ 1 ] ): \
                   ( _key_state[ k ][ _key_use ]))

#define _key_pressed    0
#define _key_down       1
#define _key_up         2



global

_key_use = 0;
_key_state[127][1];


....


begin
set_mode(224, 256, 16);
set_fps(24, 0);
....
game();

end


PROCESS game();

BEGIN

....


_key_init();

 LOOP


IF ( _key( _6, _key_up ) )
   write(0,100,100,0,"Funciona");
END
   

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

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

 FRAME;
 END

END


process _key_init()
private
    ii;
    pid;
begin
    if ( ( pid = exists( type _key_init ) ) && pid.id != id ) return; end

    priority = 1000;

    loop
        _key_use ^= 1;
        for ( ii = 0; ii < 127; ii++ )
            _key_state[ ii ][ _key_use ] = key( ii );
        end
        frame;
    end
end

function _key_exit()
begin
    signal( type _key_init, s_kill );
end
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 07, 2010, 04:02:51 PM
Ahora si que pienso que el problema tiene un origen desconocido y raro.
He separao las funciones en la lib, hago el import como teneis en el ejemplo, y es igual, no funciona....

Voy a compilar vuestro ejemplo por separado a ver.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 07, 2010, 04:07:10 PM
Acabo de probar tu test.prg con la misma lib que estaba usando en el juego. Tu test si ha funcionado....

Ahora estoy loco, hay algo en mi codigo que entra en conflicto internamente y hace que no funcione.....
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 07, 2010, 04:11:28 PM
He dado en el clavo  :D, esto no funciona:

PROGRAM test;

import "mod_video";
import "mod_text";
INCLUDE "key_event.lib";


BEGIN
set_mode ( 800 , 600 , 32 , MODE_WINDOW );
set_fps ( 45 , 0);
Game();
END

PROCESS Game();
BEGIN

_key_init();

LOOP
IF ( _key( _5, _key_up ) )
write(0,300,100,0,"Funciona");
END
FRAME;
END

END
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 07, 2010, 06:09:29 PM
JMP ahora tambien he probado tu ultima version, donde llamas k dentro de keys, y sigue igual, tampoco funciona, se repite creditos++.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 07, 2010, 06:21:03 PM
es cierto, no funciona, ya pongo el fix en el hilo correspondiente.
Title: Re: Mejorar KEY
Post by: JMP on July 07, 2010, 07:03:48 PM
Pues a mi el mío me va, pero no te aconsejo usarlo. El de SplinterGU me lo guardo para usarlo que va perfecto ;D
Por cierto karma para SplinterGU.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 07, 2010, 07:29:15 PM
Si el tuyo va pero sólo el primero.
El de Splinter va ser el que use, aunque por lo poco que iba a utilizarlo en el juego tu primer código era más que suficiente, esto para no ponerlo como lo tengo en otros juegos, donde tambien controlo el presionar sin usar frame; pero me gusta variar y aprender cosas nuevas con los demás  ;D
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 22, 2010, 10:51:19 PM
Crashhhhhhhhhhhhhhhhhhhhhhhhhhhh

Llamar 2 veces seguidas al 'IF (_key(_space, _key_down))' en un LOOP saca un pete muy feooooo.....

(http://forum.bennugd.org/index.php?action=dlattach;topic=1485.0;attach=1349)

Crash!!!!



...

LOOP ...

IF (LetraAEditar == 1)
 IF (_key(_space, _key_down))
     LetraAEditar++;
 END
END

IF (LetraAEditar == 2)
 IF (_key(_space, _key_down))
     LetraAEditar++;
 END
END

...

FRAME;
END

...





Fix:



...

LOOP ...

IF (LetraAEditar == 1)
 IF (_key(_space, _key_up))
     LetraAEditar++;
 END
END

IF (LetraAEditar == 2)
 IF (_key(_space, _key_down))
     LetraAEditar++;
 END
END

...

FRAME;
END

...

Title: Re: Mejorar KEY
Post by: DjSonyk on July 22, 2010, 11:05:04 PM

¿Free para que quieres 2 'IF (_key(_space, _key_down)) practicamente iguales en un mismo Loop?

ademas de que puedes hacerlo asi...
IF (LetraAEditar == 1 || LetraAEditar == 2)
  IF (_key(_space, _key_down))
      LetraAEditar++;
  END
END
y te ahorras 5 lineas ^^
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 22, 2010, 11:14:37 PM
No no no, hehehehehe, es que dentro de cada if tengo mas operaciones. Es justo lo que quiero, al darle al space, cambio de letra, o sea tengo 3 letras, cada vez que le doy al space me voy a la siguiente, donde despues la puedo cambiarla con izquierda y derecha.

El problema es que ahora en la tercera letra al darle al space quiero salir del menu, pero al cambiar a la tercera como esta en el loop me hace la tercera condicion automaticamente (salir al menu) y no me deja editar la tercera letra.
Ahora ni con down o up tengo suerte para separar el tercer caso.
Tendré que poner un temporizador en esta ultima para que el boton me deje editar la ultima letra antes de salir...
Title: Re: Mejorar KEY
Post by: DjSonyk on July 22, 2010, 11:24:11 PM
Sigo pensando...esque me parece rarisimo que te de error ,ya que para que se ejecute cada IF (_key(_space, _key_down))
tiene primero que cumplir una condición ,asi que no se podria llamar 2 veces seguidas ,sin a ver cumplido la condición,porque o bien es LetraAEditar 1 o LetraAEditar 2 ....ect ,a lo que me refiero que no puede ser por un conflicto de sentencias o se ejecuta una o otra ,devido al primer IF,IF (LetraAEditar == 1),ect, otro caso seria si no existiera ese IF antes,asi que no se como te puede dar ese error,visto asi me parece casi imposible....
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 22, 2010, 11:36:40 PM
Ya lo he resuelto hehehehehe.


....
IF (LetraAEditar == 3 OR LetraAEditar == 4)

   // .... (Logica de cambio de letras)

    IF (_key(_space, _key_up))
       LetraAEditar++;
     END
      
END
    
IF (LetraAEditar == 4)
     IF (_key(_space, _key_down))
          BREAK;
     END
END


Hheheheh, sólo ha sido jugar con el PAR/IMPAR que en este caso es down/up :)

Sobre el error es así como te digo, si pongo alternadamente up, down el error no ocurre, pero con 2 down seguidos, voila: crashing pump :)
Title: Re: Mejorar KEY
Post by: DjSonyk on July 22, 2010, 11:45:05 PM
Me alegro de que lo allas resuelto,pero ahora al ver tu ultimo post,me ha venido la luz a los ojos....Vamos que veo el fallo de porque no te funciona bien.
Te hace crahs,porque al pulsar la barra espaciadora,te suma 1 a LetraEditar con lo que te salta el siguiente IF , :P,para que no te cascase se tenia que parar en ese punto,y no comprobar la siguiente sentencia pues su condicion resulta verdadera al a ver incrementado la variable LetraAEditar en el anterior IF,¿me explico?
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 22, 2010, 11:56:19 PM
Hombre, eso pensaba que lo habias visto al principio :)
Por eso hace 2 key_down seguidos, pero eso no tiene que ser motivo de crash, si existe el crash ya es por algo que ocurre con esta funcion al repetirse.

De todos modos, es posible hacerlo con key_down y key_up alternado sin tener problemas ni de crash ni de funcionalidad, porque cuando haces key_up ya sabes que no vas a tener un key_down despúes, al menos que vuelvas a presionar el boton :)
Title: Re: Mejorar KEY
Post by: DjSonyk on July 22, 2010, 11:59:51 PM
 ;)
Title: Re: Mejorar KEY
Post by: SplinterGU on July 23, 2010, 06:18:50 AM
raro el error... ahhh, ya se que puede ser... a ver...
Title: Re: Mejorar KEY
Post by: SplinterGU on July 23, 2010, 06:26:58 AM
no, no era... tendre que esperar a terminar de actualizar el equipo porque no me funca bennu sin la libcrypto que no tengo instalada
Title: Re: Mejorar KEY
Post by: SplinterGU on July 23, 2010, 06:38:08 AM
lo acabo de probar y a mi no me falla...



import "mod_video";

import "mod_text";



#include "key_event.lib";



private

a,b,c;

int creditos;

LetraAEditar;
begin



    _key_init();



    write_int(0,0,0,0,&a);

    write_int(0,0,10,0,&b);

    write_int(0,0,20,0,&c);

    write_int(0,0,30,0,&creditos);



    while( !_key( _ESC, _key_pressed ) )



        a = _key( _5, _key_down );
say(_key( _5, _key_down ) );

        b = _key( _5, _key_up );

        c = _key( _5, _key_pressed );



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

     IF (_key(_space, _key_down))
       LetraAEditar++;
     END
     
     IF (_key(_space, _key_down))
          LetraAEditar++;
     END
say(LetraAEditar);

        frame;

    end



    _key_exit();



end


como siempre, y no me voy a cansar de decirlo, ejemplo completo con el error... creo que redactare una regla en la seccion de mesa de ayuda, donde solo se resolveran consultas ahi y que si no hay ejemplo compilable:

(http://www.frikipedia.es/images/e/ec/Hay_tabla.jpg)

no, en serio, si no hay ejemplo, no hay soporte... no es mala leche, pero perdemos mucho tiempo revisando cosas que pocas veces son bugs, cuando son bugs fantastico, e incluso el ejemplo ayuda a resolverlo mas rapido.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 23, 2010, 07:08:53 AM
Hheehehhehhe, le estas robando el ancho de banda a los frikis.

Lo del ejemplo, pues no necesitas resolver la duda si no quieres, pero lo de la regla no estoy de acuerdo, es preferible que si lo necesitas yo lo haga, pero no voy a estar haciendo prg's de prueba cada vez que me sale un error, sólo si es necesario, sino uno se vuelve loco, ya que muchas veces no es necesario.
Tienes que entender que esto no siempre es fácil, porque uno tiene que estar adaptando lo que tiene a un prg mas sencillo.
Si fuera cantar y coser no importaria poner siempre un prg de test para simular el error, ojala la vida fuera tan maravillosa como lo pintan en las pelis  :D
Title: Re: Mejorar KEY
Post by: SplinterGU on July 23, 2010, 07:19:36 AM
a ver, todo buen programador cuando tiene un error, lo aisla y trata de determinar cual es el problema, el analisis es parte de un buen programador, solo pido que tu ejemplo de pruebas para verificar el error lo hagas publico.
ahora si tu no analizas el error y solo te limitas a decir "no funciona", eso ya es otra cosa mas seria.
vamos que no estoy pidiendo nada grave, es el minimo precio que uno puede exigir como pago a la colaboracion, piensa tambien que no solo tu tiempo es valioso, el de los que te ayudan tambien.
Y a mi (como quien lleva adelante el proyecto) me pones en la obligacion de responderte cada vez que dices que bennu no funciona.

ademas, man, yo y todos los demas los tenemos que hacer para responderte, por que no lo haces vos que sos el que tenes el error? encima asi, te aseguro que preguntarias muchisimo menos, porque verias donde estas cometiendo el error.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 23, 2010, 08:07:29 AM
Ya te he dicho que te lo haria.
Title: Re: Mejorar KEY
Post by: FreeYourMind on July 23, 2010, 09:31:24 AM
No logro reproducir el error!!!! Ya ni en el original.....
Mejor olvidar el tema, estoy hasta las narizes del intento de reproducirlo de nuevo, y eso que en el original poca cosa cambie despúes de eso....
Title: Re: Mejorar KEY
Post by: SplinterGU on July 23, 2010, 12:24:19 PM
ok, te habia entendido mal, bien, no pierdas tiempo, si vuelve a pasar, avisas, saludo.
Title: Re: Mejorar KEY
Post by: SplinterGU on July 23, 2010, 01:04:11 PM
cerrare este hilo para no seguir ensuciandolo, esto es solo una sugerencia, el hilo de la libreria en cuestion es otro...