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

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

SplinterGU

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

JMP

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.

SplinterGU

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

FreeYourMind

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

JMP

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

SplinterGU

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

JMP

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

FreeYourMind


panreyes

Conste que yo ya lo he incluído en un proyecto y funciona DELUXE :)

FreeYourMind

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

FreeYourMind

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.

FreeYourMind

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

FreeYourMind

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

FreeYourMind

JMP ahora tambien he probado tu ultima version, donde llamas k dentro de keys, y sigue igual, tampoco funciona, se repite creditos++.