¿Como hacer que solo se pueda pulsar una vez?

Started by scuws, April 02, 2010, 01:33:09 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

scuws

Tengo el problema que cuando pongo:
IF (key(_up))
...
END


El problema es que mientras mantengo pulsado arriba ejecuta codigo(...), yo quiero que sea solo cuando lo pulsas una vez y que tengas que soltar y volver a pulsar para que se vuelva a cumplir la condicion

no se si me he explicado bien


BoMbErLiNk

Puedes probar con estados :

[code language="bennu"]
IF (key(_up))

IF (arriba_pulsado==0)
... codigo ...
arriba_pulsado=1;
END

ELSE

arriba_pulsado=0;

END[/code]

Rein (K´)ah Al-Ghul

#2
tmb se puede usar el scan_code


IF (key(_up))

while( scan_code == _up )
frame;
end

END


Lo unico que esto te congela el proceso mientras se mantiene precionado la tecla, lo cual te obliga a soltar la tecla para volver a usarla...
es similar a los de que dijo bomberlink,

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

SplinterGU

por lo general cuando necesitas hacer eso, el proceso en cuestion no hace nada hasta que sueltes dicha tecla... y en esos casos la solucion es simple (no es necesario usar scan_code, ya que eso no te va a evitar que solo tome 1 pulsacion de dicha tecla)


if ( key(_up))
    while( key(_up))
        frame;
    end
end
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

BoMbErLiNk

Pero esa teoría de pulsar y congelar el proceso no la veo correcta, si un ninja lanza una estrella mientras salta lo vas a dejar ahí congelado en el aire hasta que sueltes la tecla  :D

SplinterGU

man... para los personajes animados nunca esperamos a soltar la tecla... esto es otro caso... como ser, seleccion de la opcion de un menu, pulsacion de una tecla cuando escribimos un texto, ese tipo de cosas... en los movimientos de un personaje, nunca esperamos a soltar la tecla para el siguiente movimiento...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

BoMbErLiNk

Por eso digo, el autor no ha especificado para que quiere usarlo y mejor que queden los conceptos claros, porque el que yo digo vale para ambos casos :)

Futu-block

yo se lo que quiere, lo que quiere es que por ejemplo le dé a saltar y no siga el muñeco saltando por mas que siga pulsando el boton...

eso se hace con un testigo de pulsacion

Rein (K´)ah Al-Ghul

Quote from: BoMbErLiNk on April 02, 2010, 08:24:50 PM
Pero esa teoría de pulsar y congelar el proceso no la veo correcta, si un ninja lanza una estrella mientras salta lo vas a dejar ahí congelado en el aire hasta que sueltes la tecla  :D
seria gracioso ver algo asi xD
tambien lo pense para los casos que dijo splinter...

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

SplinterGU

Quote from: Futublog on April 02, 2010, 09:28:18 PM
yo se lo que quiere, lo que quiere es que por ejemplo le dé a saltar y no siga el muñeco saltando por mas que siga pulsando el boton...

eso se hace con un testigo de pulsacion

dudo que sea eso, porque el salto no debe depender solo de que se pulse la tecla... tiene que depender de cosas como "!estoy_saltando" o "estoy_saltando == 0" y/o "tengo_un_piso_debajo"... si yo estoy en el aire no puedo saltar... a menos que tenga algun poder especial que me permita tomar impulso en el aire como el juego "prototype".

no digo que lo que digan sea incorrecto, pero si alguien hace este tipo de preguntas es porque todavia tiene un nivel inicial en bennu, y por ende hay que explicarle primero la opcion mas simple... y no complicarlo con cosas raras... y lo mas simple y logico es "si pulso la tecla... espero hasta que dicha tecla deje de estar pulsada" lo que se traduce en lo que yo puse... ademas es el uso mas comun y simple...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

scuws

#10
Esto lo pensaba aplicar a dos cosas como bien a dicho Futublog para que no se quede saltando todo el rato y para hacer un menu como decia SplinterGU  y cambiar de opcion cada vez que soltabas y le dabas,

¿Seria correcto utilizarlo en una animacion?


Edito: con los estados me funciona bien


Futu-block

hombre, para el menú le das a la tecla para cambiar de opción y se mueve a una velocidad de vertigo, con lo que te hace plantearte si hay una solucion...

lo suyo es una ''conmutada'' como digo yo:
[code language="bennu"]
if (key(_up) and !varup)
      hacer tal cosa;
      varup = true;
end



if (!key(_up) and varup)
      varup = false;
end

[/code]

varup es una variable (que tendras que declarar) que actua de testigo de pulsacion de la tecla, en este caso arriba; la primera parte del codigo verifica si el testigo no está activado y lo activa, inmediatamente se ejecuta lo deseado.
la segunda parte del codigo es la que vigila cuando se suelta la tecla deja de hacer lo deseado.

scuws

Yo lo que he hecho para el menu es lo siguiente

IF (key(_down))
contador--;
WHILE ( key(_down))
FRAME;
         END
END
IF (key(_up))
contador++;
WHILE ( key(_up))
FRAME;
END
END
IF ( contador < 1 )
contador = 2;
END
IF ( contador > 2 )
contador = 1;
END
IF ( contador == 1 )
x = x_1;
y = y_1;
END
IF ( contador == 2 )
x = x_2;
y = y_2;
END
IF ( key(_enter))
IF ( contador == 1)
delete_text ( all_text );
inicializador ( );
BREAK;
         END
        IF ( contador == 2 )
BREAK;
END
END
FRAME;


Aqui tengo un grafico de una flecha que va cambiando a posiciones predefinidas (x_1 , y_1 ...) y al pulsar intro coge el valor de contador
y inicializa o cierra el juego, solo hay dos opciones empezar y salir

BoMbErLiNk

scuws, usar estados y guardar el estado de las teclas es completamente correcto, a la fuerza vas a tener que montarte un sistema similar en cuanto trabajes con objetos animados  ;)

Quote from: Futublog on April 03, 2010, 09:20:05 AM
[code language="bennu"]
if (key(_up) and !varup)
      hacer tal cosa;
      varup = true;
end



if (!key(_up) and varup)
      varup = false;
end

[/code]


Pero eso es lo que yo he puesto hombre  ???, la única diferencia es que aquí estas usando 4 condiciones obligatorias por frame.

Drumpi

¿Y qué me decís del siguiente método?

if (key(_up)) tecla_up++; else tecla_up=0; end

de esta forma, basta con hacer que

If (tecla_up==1) .......

siendo tecla_up una variable global.
Así si la acabas de pulsar, vale 1, si lleva más tiempo valdrá el número de frames que han pasado desde que empezaste, y 0 si no está pulsada.

Bajo mi punto de vista es más sencillo y útil que el código básico de comprobar el estado anterior.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)