Hice un código que, por lo que vi, anda bien, pero algunos nombres son un entrevero bárbaro, me refiero a la parte de:
onClipEvent (enterFrame) {
// Relativo a Clacs:
¿se les ocurre cómo los podría simplificar? Eso ayudaría a ver si funciona bien o no:
onClipEvent (load) {
// Para saber si el mouse se movió:
ActualXMouse = _level0._xmouse;
ActualYMouse = _level0._ymouse;
// Para saber si FramesMoviendoseC debe aumentar:
Moviendose = "No";
// Para determinar qué pantalla mostrar:
PantallaActual = 1;
TiempodePantalla = 333;
}
// Clics:
onClipEvent (mouseDown) {
_level0.ClicsC++;
// Para saber si FramesCliqueandoC debe aumentar
// (si al cambiar el frame es Recién, cambia a Sí y empieza...
// a aumentar. Se detiene cuando cambia a No, al descliquear).
Cliqueando = "Recién";
}
onClipEvent (mouseUp) {
_level0.DesclicsC++;
// Para que FramesCliqueandoC ya no aumente:
Cliqueando = "No";
}
// Teclas:
onClipEvent (keyDown) {
// Clacs sólo debe aumentar si ocurre un clac, no si se mantiene:
// Si la tecla presionándose no está indicada como tal:
if (eval("Tecla"+Key.getCode()+"PresionandoseDeAntes") == undefined && eval("Tecla"+Key.getCode()+"RecienPresionandose") == undefined) {
// Indicarla:
// trace("Se presionó la tecla: "+Key.getCode());
set ("Tecla"+Key.getCode()+"RecienPresionandose", "S");
trace("Tecla"+Key.getCode()+"RecienPresionandose: "+eval("Tecla"+Key.getCode()+"RecienPresionandose"));
_level0.ClacsC++;
// Para más adelante saber qué tecla se soltó,
// y cuánto debe aumentar FramesClaqueandoXC:
TeclasRecienPresionandose++;
// Esto es para saber cual eliminar cuando deje de presionarse:
set ("TeclaRecienPressedNro"+TeclasRecienPresionandose, Key.getCode());
trace("TeclaRecienPressedNro"+TeclasRecienPresionandose+": "+eval("TeclaRecienPressedNro"+TeclasRecienPresionandose));
}
}
onClipEvent (keyUp) {
// Se quitará la tecla ya no presionada:
// Para saber cual es se revisarán 2 listas:
// La de TeclaPressedDeAntes y la de TeclaRecienPressed:
// TeclaPressedDeAntes:
Puntero = 0;
// Para saber si debe revisarse la siguiente lista o no:
Deleted = "No";
while (Puntero<TeclasPresionandoseDeAntes) {
Puntero = Puntero+1;
if (Key.isDown(eval("TeclaPressedDeAntesNro"+Puntero))) {
// trace("La tecla "+eval("TeclaPressedDeAntesNro"+Puntero)+" aún está presionada.");
} else {
// La tecla guardada como presionándose de antes nro (puntero),
// ya no está presionándose: Quitar la asignación:
// ¿Debo indicar que sólo si existe?
trace("La tecla "+eval("TeclaPressedDeAntesNro"+Puntero)+" no está presionada.");
trace("Se elimina.");
delete eval("Tecla"+eval("TeclaPressedDeAntesNro"+Puntero)+"PresionandoseDeAntes");
// _level0.DesclacsC++;
// Eliminar tecla de la lista de presionándose:
delete eval("TeclaPressedDeAntesNro"+Puntero);
// Reordenar lista si es necesario:
Puntero2 = Puntero;
while (Puntero2<TeclasPresionandoseDeAntes) {
set ("TeclaPressedDeAntesNro"+Puntero2, eval("TeclaPressedDeAntesNro"+(Puntero2+1)));
Puntero2 = Puntero2+1;
}
// Borrar la última tecla de la lista (fue movida a antes):
delete eval("TeclaPressedDeAntesNro"+Puntero2);
TeclasPresionandoseDeAntes--;
// Para que el loop termine ahora:
Puntero = TeclasPresionandoseDeAntes;
Deleted = "Sí";
// TeclasSoltadasEnEsteFrame++;
}
}
if (Deleted == "No") {
// TeclaRecienPressed:
Puntero = 0;
while (Puntero<TeclasRecienPresionandose) {
Puntero = Puntero+1;
if (Key.isDown(eval("TeclaRecienPressedNro"+Puntero))) {
// trace("La tecla "+eval("TeclaRecienPressedNro"+Puntero)+" aún está presionada.");
} else {
// La tecla guardada como presionándose de antes nro (puntero),
// ya no está presionándose: Quitar la asignación:
// ¿Debo indicar que sólo si existe?
trace("La tecla "+eval("TeclaRecienPressedNro"+Puntero)+" no está presionada.");
trace("Se elimina.");
delete eval("Tecla"+eval("TeclaRecienPressedNro"+Puntero)+"RecienPresionandose");
// _level0.DesclacsC++;
// Eliminar tecla de la lista de presionándose:
delete eval("TeclaRecienPressedNro"+Puntero);
// Reordenar lista si es necesario:
Puntero2 = Puntero;
while (Puntero2<TeclasRecienPresionandose) {
set ("TeclaRecienPressedNro"+Puntero2, eval("TeclaRecienPressedNro"+(Puntero2+1)));
Puntero2 = Puntero2+1;
}
// Borrar la última tecla de la lista (fue movida a antes):
delete eval("TeclaRecienPressedNro"+Puntero2);
TeclasRecienPresionandose--;
// Para que el loop termine ahora:
Puntero = TeclasRecienPresionandose;
// TeclasSoltadasEnEsteFrame++;
}
}
}
// Desclaqueando = "Sí";
}
onClipEvent (enterFrame) {
// Relativo a Frames:
_level0.Frames = _level0.Frames+1;
// Relativo al Movimiento del Mouse:
// Si se movió:
if (ActualXMouse != _level0._xmouse or ActualYMouse != _level0._ymouse) {
// Si estaba quieto:
if (Moviendose == "No") {
_level0.MovimientosC++;
Moviendose = "Sí";
} else {
_level0.FramesMoviendoseC++;
}
} else if (Moviendose == "Sí") {
// No se movió pero estaba moviéndose:
Moviendose = "No";
_level0.FrenadasC++;
}
ActualXMouse = _level0._xmouse;
ActualYMouse = _level0._ymouse;
// Relativo a Clics:
if (Cliqueando == "Sí") {
_level0.FramesCliqueandoC++;
} else if (Cliqueando == "Recién") {
Cliqueando = "Sí";
}
// Relativo a Clacs:
if (TeclasPresionandoseDeAntes > 0) {
_level0.FramesClaqueando1C++;
_level0.FramesClaqueandoXC = _level0.FramesClaqueandoXC+TeclasPresionandoseDeAntes;
trace ("TeclasPresionandoseDeAntes: "+TeclasPresionandoseDeAntes);
}
// Las recién presionadas pasarán a ser de antes:
while (TeclasRecienPresionandose > 0) {
trace("Las recién presionadas pasarán a ser de antes");
TeclasPresionandoseDeAntes++;
// Agregarlas a la lista de TeclaPressedDeAntes:
set ("TeclaPressedDeAntesNro"+TeclasPresionandoseDeAntes, eval("TeclaRecienPressedNro"+TeclasRecienPresionandose));
trace("La tecla "+eval("TeclaPressedDeAntesNro"+TeclasPresionandoseDeAntes)+" se agregó a la lista en TeclaPressedDeAntesNro"+TeclasPresionandoseDeAntes);
trace("TeclaPressedDeAntesNro"+TeclasPresionandoseDeAntes+": "+eval("TeclaPressedDeAntesNro"+TeclasPresionandoseDeAntes));
// Agregarlas a la otra lista, en que se les asigna S:
set ("Tecla"+eval("TeclaRecienPressedNro"+TeclasRecienPresionandose)+"PresionandoseDeAntes", "S");
trace("La tecla "+eval("TeclaRecienPressedNro"+TeclasRecienPresionandose)+" quedó indicada como presionada en "+"Tecla"+eval("TeclaRecienPressedNro"+TeclasRecienPresionandose)+"PresionandoseDeAntes");
trace("Tecla"+eval("TeclaRecienPressedNro"+TeclasRecienPresionandose)+"PresionandoseDeAntes: "+eval("Tecla"+eval("TeclaRecienPressedNro"+TeclasRecienPresionandose)+"PresionandoseDeAntes"));
// Eliminarlas de la lista de recientes:
delete eval("Tecla"+eval("TeclaRecienPressedNro"+TeclasRecienPresionandose)+"RecienPresionandose");
// Eliminar tecla de la lista de presionándose:
delete eval("TeclaRecienPressedNro"+TeclasRecienPresionandose);
TeclasRecienPresionandose--;
}
// Relativo a cambiar pantalla:
TiempodePantalla--;
if (TiempodePantalla == 0) {
TiempodePantalla = 333;
if (PantallaActual == 1) {
PantallaActual = 2;
} else {
PantallaActual = 1;
}
_level0.gotoAndStop(PantallaActual+3);
}
}
Seguiré pensando. Entiendo que si no explico el código es más difícil que puedan ayudarme, pero es que a mí también me cuesta entenderlo. Lo complicado es lo de los clacs, explicaré eso.
Un clac es cuando se presiona una tecla, no importa durante cuánto tiempo.
Cuando hay un clac, el contador de clacs debe aumentar 1.
El problema es que no es tan fácil que el programa sepa que esa tecla presionándose se está presionando de antes, el programa sólo capta si se está presionando o no, si fuese sólo por eso presionar una tecla causaría que el contador Clacs aumente muchas veces.
La solución que se me ocurrió es guardarlas en una lista, entonces cuando se capta que hay un clac se mira la lista de teclas y el contador solo aumenta si la tecla no está en la lista. Y la tecla se agrega, sino no.
Tampoco hay, que yo sepa, una función que indique o guarde cual fue la última tecla soltada, así que cuando eso ocurre hay que averiguar cual, para eliminarla de la lista. Eso andaba bien también pero con tanto lío de nombres que hice no puedo comprobarlo bien. Cuando hay un desclac, el contador de desclacs aumenta 1.
El contador FramesClaqueando1C es sobre cuántos frames estuvo mantenida alguna tecla, no importa cuántas sean durante un mismo frame, es decir, si se mantuvo presionada una tecla durante 5 frames, el contador aumentará 5, y si fueron 2 teclas también aumentará 5.
Pero yo quise que aumente a partir del 2ndo frame, porque sino, en realidad no habría pasado 1 frame, podría ser 1/2 frame, pasa un frame cuando hay cierta diferenc¡a de tiempo entre un frame y otro, pero el clac está en medio, así que al llegar el siguiente frame el tiempo normal aún no pasó. Para lograr que aumente a partir del 2ndo frame, hay que ver si alguna tecla estuvo siendo presionada desde el frame anterior, pero sólo hay una lista de presionadas, no se sabe si son del frame anterior o no. Bueno, para mejorar eso, cuando hay un clac la tecla se agrega una lista de recién presionadas, y durante un nuevo frame las de esa lista se pasan a otra de teclas presionadas de antes.
Pero son 4 listas en vez de 2, porque...
Cuando hay un clac, hay que ver si la tecla estaba presionada. Para eso se guarda así:
TeclaXRecienPresionandose = "S"
donde X es el código ACII o como se llame. Así cuando se presiona la tecla se mira si esa variable existe ("S") o no (undefined) y no hay que revisar listas.
Cuando hay un desclac, hay que ver cual tecla se soltó. Como dije no conozco si hay un indicador de la última tecla soltada, así que no hay X, no puedo decir "borra la variable TeclaXRecienPresionandose", no sé X. Para averiguarla el programa debe mirar otra lista, en que las variables son así:
TeclaRecienPressedNro1 = 38
donde ese 1 es la posición en la lista y el 38 es la tecla presionada que se mira a ver si es igual a X.
Esa lista tiene las teclas presionadas. La hago con variables en vez de arrays, no viene mucho al caso.
Las otras 2 listas son del mismo estilo pero con otros nombres, y son para otra cosa como su nombre indica:
Tecla38PresionandoseDeAntes
TeclaPressedDeAntesNro1
¿Podría hacer 2 listas en vez de 4? Lo pensaré.
Por último está FramesClaqueandoXC, que es como FramesClaqueando1C pero este tiene en cuenta cuántas teclas han estado presionadas, así que puede aumentar más de 1 a la vez. La cantidad está marcada por TeclasPresionandoseDeAntes.
El lío de los nombres me resulta difícil explicarlo y ya fue bastante cansador explicar todo esto así que será en otra ocasión, pero por ejemplo como algunas variables empiezan con Tecla y otra con Teclas me entrevero, parece una sopa de letras por momentos.