Comunidad de diseño web y desarrollo en internet online

Problema con Key.isDown

Citar            
MensajeEscrito el 03 Dic 2008 09:12 am
buenas a todos!, no era mi intención molestar, pero no se como solucionar mi problema :oops:
mi versión es Flash 8.

Mi problema es el siguiente:

Código :

function comprueba(numero_de_tecla){
if(Key.isDown(numero_de_tecla)){
//hacer algo.
}
}
this.onEnterFrame=function(){
control_time++;
if((control_time==array_de_tiempos[j]) && (j<array_de_tiempos.length){
comprueba(numero_de_tecla);
j++;
}
}


Por ejemplo si array_de_tiempos[0]=5000; cuando control_time llegue a 5000 da lo mismo si la tecla fue presionada en el momento o antes, ya que al estar presionada de antes y si el tiempo se cumple, se cumple la condición.
Como se puede hacer para que se cumpla la condición "sólo sí" la tecla fue presionada en el tiempo asignado y no desde antes?

espero me puedan ayudar...

Por Sonic_DS

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Dic 2008 12:00 pm
Parece que quieres comprobar si una tecla fue presionada y en que momento, te diría que uses algo así:

- Cuando la tecla es presionada, guardas el momento (puedes hacerlo a través de un objeto Date o getTimer)
- Decides en que momento chequeas los teclazos, si puedes evitar un onEnterFrame (porque hay un momento mas exacto que "tpodo el tiempo") mejor

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 Dic 2008 12:30 pm
gracias Jorge por tu idea, pero necesito que compruebe al presionar la tecla.
ya que necesito entregar una respuesta en ese momento, y en mi caso utilizo setInterval para llamar a la función.
Tu idea esta interesante, pero como seria en la practica?
Esta era mi idea, mira
pero no me resulto :P

Código :

function comprueba(numero_de_tecla){
 if(Key.isDown(numero_de_tecla)){
 sumar=true;
 }else{
 sumar=false;
 P=0;
 if(P==1){
 //hacer algo.
 }
}
this.onEnterFrame=function(){
if(sumar){
P++;
}
control_time++;
if((control_time==array_de_tiempos[j]) && (j<array_de_tiempos.length){
comprueba(numero_de_tecla);
j++;
}
}


Es algo dinámico y preciso, aun no se me ocurre nada :S
Gracias Jorge.

Por Sonic_DS

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Dic 2008 12:49 pm
A ver si entiendo: ¿al oprimir la tecla quieres chequear si se cumple alguna condición? Entonces el if debería ir en la función comprueba, no en un onEnterFrame

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 Dic 2008 01:25 pm
La idea en palabras es esta:
Tengo 2 arrays
tecla[0]=0 - time[0]=30 >> Presionar 0 a 30 con tolerancia ±10
tecla[1]=1 - time[1]=50 >> Presionar 1 a 50 con tolerancia ±10
tecla[2]=2 - time[2]=100 >> ..
tecla[3]=3 - time[3]=200 >> ..
tecla[4]=2 - time[4]=230 >> ..
tecla[5]=1-3 - time[5]=250 >> Presionar tecla[5][0] y tecla [5][1] con tolerancia ±10
tecla[6]=0 - time[6]=270-300 >> Presionar 0 para guia>time[6][0] y guia<time[6][1] //esto aun no lo implemento es solo teoría.
...
..
En el caso de las teclas utilizo un switch para que el usuario pueda elegir a su gusto las teclas que quiera(no es de importancia).

-Necesito un guía(la posición de una canción, un numero incrementado...
-Una tolerancia ±10

Si el guía==time[0]-10 y guía==time[0]+10{
Si presionar tecla[0]{ //Que permita la entrada una sola vez para time[0], y luego para time[1]...
Puntaje=un porcentaje entre time[0] y guía, siendo time[0] el 100%
}
}

Es algo mas o menos asi...

Por Sonic_DS

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Dic 2008 01:40 pm
Bueno, veo que a partir de los teclazos chequeas si fue hecho en tal o cual tiempo, etc.
Lo dicho, el disparador es el Key.down. Para no tener un rosario de if encadenados, conviene que te armes una función que a partir de un objeto chequee sus condiciones. Si las condiciones son totalmente arbitrarias, no podrás tener mucha eficiencia en las comprobaciones, si hay algún tipo de lógica (siempre entre A y B), puedes usar una estructura de objetos con las propiedades A y B.
Si te suena a chino lo que digo, comienza encadenando if dentro del Key.isDown

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 Dic 2008 02:21 pm
No te entiendo mucho Jorge :S
Si al menos lo presentaras en pseudo, seria mas fácil de entender la idea. Yo lo que no tengo muy claro aun si Key.isDown es el único para detectar teclas presionadas.

Código :

var nuevoObjeto:Object = new Object ();
Key.addListener (nuevoObjeto);
nombreObjeto.propiedad = function () {
// Acciones
};
nuevoObjeto.onKeyUp = function () {
trace ("");
};

Por Sonic_DS

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Dic 2008 02:44 pm
Esto me ayuda a tener un mejor control sobre las teclas presionadas.
Ahora veremos que se puede hacer al respecto...

Código :

//Campo de texto en el escenario "txt"
var txt:TextField;
//Variable que nos avisará cuando se presiona y suelta la tecla
var flag:Boolean = false;
//numero es cuantas veces se presiona la tecla
var numero:Number = 0;
//Texto inicial en "txt"
txt.text = "Haz click aquí y luego presiona la tecla derecha";
//Al presionar, cambiamos flag a true
txt.onKeyDown = function() {
 if (flag == false) {
  flag = true;
  //Incrementamos a numero y asignamos a txt
  if (Key.isDown(Key.RIGHT)) {
   numero++;
   if (numero == 1) {
    txt.text = "Presionastes "+numero+" vez";
   }
  }
  if (numero != 1) {
   txt.text = "Presionastes "+numero+" veces";
  }
 }
};
//Al soltar la tecla flag vuelve a false
txt.onKeyUp = function() {
 flag = false;
};
//addListener nos notifica que se han precionado las teclas
Key.addListener(txt); 

Por Sonic_DS

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Dic 2008 03:48 pm
Lo que mas me complica en este caso es la estructura -__-
Si alguien puede aportar con aspectos generales de la estructura seria genial ;)
bueno desde ya muy agradecido por el apoyo de Jorge
y el de poder publicar este problema que aun no puedo solucionar
Gracias.

Por Sonic_DS

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Dic 2008 03:58 pm
Ok, aquí un tip, basándome en las siguientes reglas:

- Hay un array que contiene un listado de teclas
- Hay otro array que contiene un listado de tiempos

El listado de tiempos indica que el teclazo tiene que haber sido en un rango +-10 del tiempo expresado
El teclazo crea un objeto con dos propiedades: code y tiempo

Un posible algoritmo (arr1 es lista de teclas, arr2 es lista de tiempos):

Código ActionScript :

function chequea(tm:Object):Boolean{
  for(var i:Number = 0; i<arr1.length; i++){
    if(arr1[i]==tm.code){
       if(Math.abs(arr2[i]-tm.tiempo)<=10){
             return true
             break
       }
    }    
  }
  return false
}


Lo mas probable es que no sea justo lo que necesitas, ajusta las reglas, luego el algoritmo de búsqueda

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.