elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Detectar que luego de moverse el mouse, se detuvo.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Detectar que luego de moverse el mouse, se detuvo.  (Leído 849 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.225


Superhacker (es broma xD )


Ver Perfil
Detectar que luego de moverse el mouse, se detuvo.
« en: 23 Febrero 2024, 09:32 am »

Y entonces quiero que ocurra cierto evento.

Con esto el evento (_level0.gotoAndStop(5)) ocurre por el simple hecho de mover el mouse, aunque el mouse no se haya detenido, está mal:
Código
  1. // En frame 1:
  2. Movement = "Never";
  3. onClipEvent (enterFrame) {
  4. if (Movement == "Sí") {
  5. Movement = "Frenado";
  6. } else if (Movement == "Frenado") {
  7. _level0.gotoAndStop(5);
  8. }
  9. }
  10. onClipEvent (mouseMove) {
  11. Movement = "Sí";
  12. }
  13. onClipEvent (mouseDown) {
  14. if (Movement != "Frenado") {
  15. _level0.Mensaje = "Perdiste por hacer clic.";
  16. _level0.gotoAndStop(6);
  17. }
  18. }
  19. onClipEvent (keyDown) {
  20. if (Movement != "Frenado") {
  21. _level0.Mensaje = "Perdiste por hacer clac.";
  22. _level0.gotoAndStop(6);
  23. }
  24. }
Se supone que al moverlo Movement cambia a "Sí", luego el frame se repite y cambia a "Frenado" pero si el mouse se sigue moviendo debería cambiar a "Sí" de nuevo, por lo que la condición de Movement == "Frenado" no debería cumplirse, pero sí se cumple.

Intenté esto:
Código
  1. // En frame 1:
  2. Movement = "Never";
  3. ActualXMouse = _xmouse;
  4. ActualYMouse = _ymouse;
  5. onClipEvent (enterFrame) {
  6.    if (_level0.ActualXMouse != _level0._xmouse or _level0.ActualYMouse != _level0._ymouse) {
  7.        Movement = "Sí";
  8.        trace ("_level0.ActualXMouse era: "+_level0.ActualXMouse);
  9.        _level0.ActualXMouse = _level0._xmouse;
  10.        trace ("_level0.ActualXMouse es: "+_level0.ActualXMouse);
  11.        trace ("_level0.ActualYMouse era: "+_level0.ActualYMouse);
  12.        _level0.ActualYMouse = _level0._ymouse;
  13.        trace ("_level0.ActualYMouse es: "+_level0.ActualYMouse);
  14.    } else if (Movement == "Sí") {
  15.        trace ("Movement == Sí");
  16.        if (_level0.ActualXMouse == _level0._xmouse && _level0.ActualYMouse == _level0._ymouse) {
  17.            _level0.gotoAndStop(5);
  18.        }
  19.    }
  20. }
  21. onClipEvent (mouseMove) {
  22.    // Movement = "Sí";
  23. }
  24. onClipEvent (mouseDown) {
  25.    if (Movement != "Frenado") {
  26.        _level0.Mensaje = "por hacer clic.";
  27.        _level0.gotoAndStop(6);
  28.    }
  29. }
  30. onClipEvent (keyDown) {
  31.    if (Movement != "Frenado") {
  32.        _level0.Mensaje = "por hacer clac.";
  33.        _level0.gotoAndStop(6);
  34.    }
  35. }
Y obtengo el mismo resultado.

Había hablado con GPT, cambié algo, y al final ya no entiendo lo que dice.

Citar
En Macromedia Flash 5 ¿la velocidad conque se ejecutan los frames puede ser más rápida que la velocidad conque se actualiza la posición del mouse?

Citar
En Macromedia Flash 5, la velocidad con la que se ejecutan los frames está determinada por la configuración de fotogramas por segundo (FPS) del proyecto. Por defecto, la configuración de FPS es de 12 fotogramas por segundo, pero se puede ajustar según las necesidades del proyecto.

La velocidad con la que se actualiza la posición del mouse en Flash 5 está vinculada a la frecuencia de actualización del sistema operativo y del hardware del mouse. En general, la posición del mouse se actualiza con bastante rapidez y en tiempo real, lo que significa que los eventos del mouse se pueden detectar y responder de manera rápida.

Dicho esto, es posible que en situaciones extremas, donde haya una alta carga de trabajo en el procesador o limitaciones de rendimiento, la velocidad de actualización de la posición del mouse pueda ser más lenta en comparación con la velocidad de ejecución de los frames de Flash. Sin embargo, esto no es una limitación inherente de Flash 5, sino más bien una cuestión de rendimiento del sistema en el que se ejecuta.

En resumen, en condiciones normales y en sistemas bien configurados, la velocidad de ejecución de los frames en Flash 5 generalmente es más rápida que la velocidad de actualización de la posición del mouse.

Le mostré el código y le pregunté por qué no funcionaba.

Citar
El código que proporcionaste parece tener un par de problemas que podrían estar impidiendo que funcione correctamente. A continuación, te señalaré los posibles problemas y te daré una solución propuesta:

1. Comparación de posiciones del mouse: En tu condición `if (_level0.ActualXMouse != _level0._xmouse && _level0.ActualYMouse != _level0._ymouse)`, estás utilizando el operador lógico "&&" (y) para verificar si las posiciones X e Y del mouse han cambiado. Sin embargo, esto significa que el código dentro de esa condición se ejecutará solo si ambas condiciones son verdaderas al mismo tiempo, lo que puede ser poco probable. Es posible que desees utilizar el operador lógico "||" (o) en su lugar, para verificar si al menos una de las condiciones es verdadera.

Solución propuesta:
```actionscript
if (_level0.ActualXMouse != _level0._xmouse || _level0.ActualYMouse != _level0._ymouse) {
    // Código para cuando la posición del mouse ha cambiado
} else if (Movement == "Sí") {
    // Código para cuando la posición del mouse se ha mantenido igual después de un movimiento previo
}
```

2. Inicialización de la variable "Movement": No se muestra en el código proporcionado cómo se inicializa la variable "Movement". Si no se inicializa correctamente en otra parte de tu código, la condición `else if (Movement == "Sí")` puede no evaluarse como verdadera y, por lo tanto, el código dentro de ese bloque no se ejecutará.

Solución propuesta:
Asegúrate de que la variable "Movement" se inicialice correctamente antes de que se active el código que has proporcionado, por ejemplo, al comienzo del juego o en otro evento relevante.

Espero que estas sugerencias te ayuden a resolver el problema y que tu juego funcione correctamente. Si sigues teniendo dificultades, no dudes en proporcionar más detalles o preguntar más preguntas.

Cambié algo que me propuso, que me pareció bien, pero el resultado no cambió.

Citar
Mis disculpas por la confusión anterior. Luego de revisar nuevamente el código, noto que hay un error en la lógica de las condiciones. El problema radica en que estás comparando la posición del mouse actual con la posición anterior en cada cuadro de animación (enterFrame), lo que hace que la condición siempre se cumpla mientras muevas el mouse.

Para lograr el comportamiento deseado de ganar al mover el mouse y luego detenerlo, puedes implementar una solución alternativa utilizando eventos del mouse en lugar de la lógica basada en enterFrame. A continuación, te muestro un ejemplo de cómo podrías modificar el código:

```actionscript
// Escucha el evento de movimiento del mouse
this.onMouseMove = function() {
    // Guarda la posición del mouse actual
    _level0.ActualXMouse = _level0._xmouse;
    _level0.ActualYMouse = _level0._ymouse;
}

// Escucha el evento de liberación del mouse
this.onMouseUp = function() {
    // Verifica si el mouse se ha movido previamente y luego se detuvo
    if (_level0.ActualXMouse != _level0._xmouse || _level0.ActualYMouse != _level0._ymouse) {
        // El mouse se ha movido y luego se detuvo, se gana el juego
        _level0.gotoAndStop(5);
    }
}
```

En este código, utilizamos los eventos `onMouseMove` y `onMouseUp` para detectar el movimiento y la liberación del mouse, respectivamente. Al mover el mouse, guardamos la posición actual en las variables `_level0.ActualXMouse` y `_level0.ActualYMouse`. Luego, al soltar el mouse, verificamos si la posición del mouse ha cambiado en comparación con la posición guardada previamente. Si ha habido un movimiento y luego se detuvo, se activa la condición y se gana el juego.

Espero que esta solución funcione correctamente para tu juego. Si sigues teniendo problemas o tienes más preguntas, no dudes en hacérmelo saber. Estoy aquí para ayudarte.

MouseUp en mi lenguaje creo que es el evento "se dejó de mantener el botón presionado", no es lo mismo. En fin, no entiendo qué me dice:
Citar
¿qué condición dices que se cumple siempre?

Citar
Mis disculpas por la confusión en mi respuesta anterior. La condición que mencioné anteriormente no se cumple siempre, fue un error en mi explicación.

El problema principal en tu código original es que la condición `if (_level0.ActualXMouse != _level0._xmouse && _level0.ActualYMouse != _level0._ymouse)` se cumple cuando cualquiera de las coordenadas X o Y del mouse cambia. Esto significa que si solo una de las coordenadas cambia, el código dentro de esa condición se ejecutará. Sin embargo, según tu descripción, deseas que el juego se gane solo cuando ambas coordenadas del mouse se mantienen iguales después de un movimiento previo.

Para corregir esto, podemos modificar la condición para que verifique si ambas coordenadas X e Y del mouse se mantienen iguales. Aquí tienes el código actualizado:

```actionscript
onClipEvent(enterFrame) {
    if (_level0.ActualXMouse != _level0._xmouse || _level0.ActualYMouse != _level0._ymouse) {
        // Actualiza las coordenadas del mouse si han cambiado
        _level0.ActualXMouse = _level0._xmouse;
        _level0.ActualYMouse = _level0._ymouse;
    } else if (Movement == "Sí") {
        // Verifica si las coordenadas del mouse se mantienen iguales después de un movimiento previo
        _level0.gotoAndStop(5); // Gana el juego
    }
}
```

En este código actualizado, utilizamos el operador lógico "||" (o) para verificar si cualquiera de las coordenadas X o Y del mouse ha cambiado. Si alguna de las coordenadas cambia, actualizamos las variables `_level0.ActualXMouse` y `_level0.ActualYMouse` para reflejar las nuevas posiciones del mouse. Luego, en el bloque `else if`, verificamos si ambas coordenadas se mantienen iguales después de un movimiento previo. Si es así, se ejecuta el código para ganar el juego.

Espero que esta aclaración solucione el problema y te permita lograr el comportamiento deseado en tu juego. Si tienes más preguntas, no dudes en hacerlas. Estoy aquí para ayudarte.

Ahí parece una versión más simple de la que hice y que no creo que funcione, pero me cuesta entender qué dice y ya me cansé.

¿Solución?


En línea

Tachikomaia


Desconectado Desconectado

Mensajes: 1.225


Superhacker (es broma xD )


Ver Perfil
Re: Detectar que luego de moverse el mouse, se detuvo.
« Respuesta #1 en: 25 Febrero 2024, 02:31 am »

Asumiré que es imposible que funcione, aunque no sé la causa.

He visto que la posición del mouse llega a actualizarse en cada frame con framerate 120, así que ese número no sería el problema.

Y disminuyendo el framerate (no quiero) funciona bien, así que el código no es el problema.

 ¿Tal vez la posición sólo se actualiza rápido luego de que lleva un rato moviéndose? De momento no sé cómo ver eso. ¿Cómo podría? Debería poner un contador de tiempo y... ver si al inicio se actualizaba tan rápido como luego. Haré eso.

Edit: Confirmado que no sirve.


« Última modificación: 27 Febrero 2024, 04:19 am por Tachikomaia » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines