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.

FreeYourMind


SplinterGU

ahora me voy a dormir.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes

¿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 :)

SplinterGU

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

FreeYourMind

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.

JMP

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.

FreeYourMind

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.

SplinterGU

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

SplinterGU

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

SplinterGU

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

Windgate

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

SplinterGU

gracias wind.

estas ultimas versiones ya no tienen let_me_alone.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

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

SplinterGU

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

FreeYourMind

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.