¿Cuál es la forma más común de manejar los clics del mouse en los juegos?
Dado que todo lo que tiene para detectar la entrada del mouse es si un botón está arriba o abajo.
Actualmente solo confío en que el mouse hacia abajo sea un clic, pero este enfoque simple me limita mucho en lo que quiero lograr. Por ejemplo, tengo un código que solo debe ejecutarse una vez con un clic del mouse, pero usar el mouse hacia abajo como clic del mouse puede hacer que el código se ejecute más de una vez, dependiendo de cuánto tiempo se mantenga presionado el botón. ¡Entonces necesito hacerlo con un clic!
Pero, ¿cuál es la mejor manera de manejar un clic? Es un clic cuando el mouse va de arriba hacia abajo o de abajo hacia arriba o es un clic si el botón estuvo presionado por menos de x cuadros / milisegundos y luego, si es así, se considera un mouse hacia abajo y un clic si está abajo para x cuadros / milisegundos o un clic y luego el mouse hacia abajo?
Puedo ver que cada uno de los enfoques puede tener sus usos, pero ¿cuál es el más común en los juegos? ¿Y quizás pregunte más específicamente cuál es el más común en los juegos RTS?
Respuestas:
Estás en el camino correcto al descubrir cuándo el mouse está haciendo la transición de abajo hacia arriba y escribiendo un controlador para eso. Para muchos juegos, es lo suficientemente bueno para tratar un evento mouseUp como un clic.
Dependiendo de su juego, es probable que desee manejar ambos eventos; por ejemplo, en un RTS, es probable que desee incorporar la selección de cuadro de arrastre y la selección de un solo clic. La diferencia está en determinar cuánto tiempo estuvo el mouse en el estado Down antes de liberarlo.
(Sí, básicamente respondiste tu propia pregunta)
fuente
No existe el "mejor": los necesita a todos.
Si estoy disparando un arma, no quiero esperar a que se suelte el mouse para activar el efecto de disparo del arma. Y si arrastra un cuadro alrededor de un grupo de unidades, comienza la acción de arrastrar con el mouse hacia abajo.
Por otro lado, si estoy haciendo clic en un elemento de la GUI, entonces quiero esperar el clic completo porque a eso estoy acostumbrado.
Por lo tanto, probablemente debería implementar el mouse hacia abajo, el mouse hacia arriba, el arrastre del mouse (el mouse hacia arriba en un lugar significativamente diferente al mouse hacia abajo) y el clic del mouse (mouse hacia arriba en el mismo lugar que el mouse hacia abajo), y conectarlos a partes de su juego como te parece bien.
fuente
La forma en que la mayoría de los sistemas de ventanas lo manejan, así como los juegos en los que he trabajado (y tuve que implementarlos parcialmente) es tener un bit en cada botón que detecta si el mouse ingresó en el estado de abajo del mouse sobre el botón dado. Solo establece el marco en el que el mouse baja y solo se borra cuando se suelta el botón del mouse. Si y solo si se suelta el mouse sobre el botón y se establece el bit, dispare el evento de clic del botón.
(Probablemente también desee una bandera que se establece verdadera cuando se establece el bit y el mouse se mueve sobre su botón, para que pueda cambiar el botón para usar una textura presionada en lugar de la normal).
Este es el esquema básico detrás de la mayoría de los botones. Continúe y encuentre un mensaje de diálogo. Presione el botón de cancelar pero no lo suelte. El botón se presiona mientras el mouse está sobre él y vuelve a la normalidad si el mouse deja de desplazarse sobre él, pero volverá a presionarlo si se mueve nuevamente sobre él. Solo ejecuta su acción si lo sueltas y lo superas. No use un recuento de milisegundos, eso es principalmente para detectar clics dobles dentro de su umbral.
(y si realmente quiere ser elegante, tenga eventos que pueda conectar a cada una de esas transiciones, por ejemplo, MouseOver al entrar y al salir, MouseDown ingresar / salir, MouseUp ingresar / salir, MouseClicked ingresar / salir, etc. )
fuente
Los botones del mouse y las teclas del teclado pueden tener varios eventos diferentes, lo que está disponible depende de su elección de idioma / biblioteca, lo más común:
Tecla abajo, se dispara cuando se presiona un botón.
Tecla arriba, se dispara cuando se suelta un botón.
Tecla retardada hacia abajo, se dispara cuando se presiona un botón y luego se dispara repetidamente en algún intervalo dependiente del sistema hasta que se suelta la tecla.
Además de esto, también puede haber una llamada para saber si una tecla se mantiene presionada o no.
Es importante que sepa exactamente qué herramienta está utilizando, más comúnmente necesitará las dos primeras, si no están disponibles, compílelas a partir de lo que esté disponible.
El método estándar para registrar que se presiona un botón en pantalla usando el mouse es afirmar que se apuntó el mismo botón tanto en el evento hacia abajo como hacia arriba. Sin embargo, para muchos elementos del juego esto puede ser demasiado lento, por lo que para muchas acciones puede ser prudente hacer que sucedan en el evento inactivo.
fuente
XOr puede ser tu amigo en esta situación.
Esto llamará a sendMouseClickEvent () siempre que el estado del botón del mouse cambie de falso a verdadero.
fuente
if (!oldIsButtonUp && isButtonUp) {
.Una versión XNA de este código sería algo así (simplificado solo para detectar el evento de mouse down, para detectar clics dobles necesitará algo más sofisticado);
fuente