Detectar si el ratón se está moviendo

Started by Windgate, October 31, 2009, 03:53:40 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Estoy haciendo un juego nuevo con Bennu 3D y estoy implementando un comportamiento del mouse "parecido" al de World of Warcraft:

Entre muchas otras funciones, si tienes el botón derecho del ratón pulsado puedes rotar la cámara.

Para ello tengo que detectar si el ratón se está moviendo horizontalmente, y según la diferencia horizontal entre el frame anterior y el actual muevo la cámara. El problema es cuando el mouse llega al límite de la pantalla, puesto que ahí se queda clavado y no es posible determinar si se sigue desplazando o no...

He hecho un apaño con el código, pero es un apaño auxiliar que no da el resultado que pretendía :-[

Dejo aquí la descarga directa del proyecto para que lo podáis comprobar, viene con todas las DLL y un .bat para ejecutar cómodamente.

DESCARGA: http://trinit.es/DescargaDirecta/Bennu3D/Kombat3D%200.0.1.zip

Si hubiese "algo" para detectar si el ratón se está desplazando y a qué velocidad se desplaza sería un verdadero placer, esto es útil para Bennu 3D especialmente, aunque seguro que para 2D puede ofrecer utilidades adicionales.

También observo en la function_list una global llamada mouse_status, ¿Alguien sabe para qué sirve?
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

set_mode(800,600,16);
loop
movimiento=mouse.x-400;
mouse.x=400;
mover_camara(movimiento);
frame
end

Eso funciona mientras no te importe tener el ratón en el centro (aunque puedes crear un proceso auxiliar que se desplace "movimiento" pixeles en dicha dirección).
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)

Windgate

Puede servirme si reemplazo el 400 por RESOLUCION_X / 2, pero sigue siendo un "apaño", para que sea un comportamiento como el de WoW necesito una forma de conocer el desplazamiento exacto que se hace sobre la "alfombrilla".

Tengo la idea de que el mouse esté en pantalla y puedas seleccionar objetivos, así que la restricción de estar en el centro no me vale...

Por el momento, a no ser que salga una solución mejor me quedo con esa, gracias Drumpi.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

osk

¡He venido a hablar de mi libro!
Página 313 de mi manual:
"comentar la existencia de la variable global MOUSE_STATUS, la cual vale 1 cuando el puntero del ratón está dentro de los límites de la ventana (si la aplicación se ejecuta en modo ventana) y 0 cuando sale de ella.  Este valor  no  tiene utilidad si   la aplicación se ejecuta en modo de ventana modal "

Windgate

Gracias osk!

No me soluciona el problema, pero es bueno saberlo, sólo me faltaba eso para tener 100% controlado todo lo que hace falta saber sobre el mouse.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Es que me parece que no hay otra forma, wind.
Si quieres que el puntero no esté siempre en el centro deberás crear un puntero auxiliar y usar el mouse sólo para obtener los desplazamientos de cada momento.
Sé que existe algún método que en lugar de tomar como referencia la posición anterior toma un punto, llamémosle, neutro, pero eso ya va a más bajo nivel, y es lo que hace que las tabletas digitales (las tabletas estas que llevan el lápiz para pintar) se comporten en Bennu y en otros juegos como un "joystick analógico" (algo bastante molesto).

Y si, quería decir resolution_x/2, pero es que no me salía la explicación, sino el codigo, y era un ejemplo (nunca pongo ejemplos de copia/pega ;D)
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)

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Windgate

Pues he de reconocer DCelso que tenía la wiki como una Biblia complicada, pero veo que al menos mouse_status sí que se puede encontrar.

He probado a buscar mode_is_ok, una función que estoy usando ahora mismo para "evitar" que las imágenes se vean ensanchadas horizontalmente al verse en monitores panorámicos, el resultado:

There is no page titled "mode_is_ok". You can create this page.

Por ese motivo no solía usar la wiki, pero al menos veo que se puede editar libremente, lo tendré en cuenta :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

TYCO

Quote from: Windgate on October 31, 2009, 03:53:40 PM
Si hubiese "algo" para detectar si el ratón se está desplazando y a qué velocidad se desplaza sería un verdadero placer, esto es útil para Bennu 3D especialmente, aunque seguro que para 2D puede ofrecer utilidades adicionales.

Mmm... con un proceso que controle el ratón no podrías hacerlo???

Como por ejemplo....

PROCESS raton ()

PRIVATE
    int x_anterior;
    int y_anterior;
    int diferencia_x;
    int diferencia_y;
BEGIN
    LOOP
        // CALCULAS CUANTOS PIXELES HA RECORRIDO EL RATON ENTRE UN FRAME Y OTRO
        // PARA DESPUES MOVER LA CAMARA MAS RAPIDAMENTE O MAS LENTAMENTE
        IF (x_anterior <> mouse.x)
            diferencia_x=abs(x_anterior-mouse.x);
        END
        IF (y_anterior <> mouse.y)
            diferencia_y=abs(y_anterior-mouse.y);
        END

        // AQUI LE INDICARIAS AL MOTOR 3D QUE GIRE ESA "DIFERENCIA_X" y "DIREFENCIA_Y"

        // GUARDAS LA POSICION ACTUAL PARA EN EL SIGUIENTE FRAME COMPROBAR SI EL RATON SE MOVIO
        x_anterior=mouse.x;
        y_anterior=mouse.y;
        FRAME;
    END
END


Habría que probarlo y tal... pero no te podría valer algo así?
Programador, Escritor/Guionista y Deportista.

Todo Modo Gráfico tiene por detrás una Línea de Comandos.

SnowCraft Remake (100%)
Rally Mortal (87%)

La momia que fuma

Quote from: Windgate on October 31, 2009, 05:58:15 PM
He probado a buscar mode_is_ok, una función que estoy usando ahora mismo para "evitar" que las imágenes se vean ensanchadas horizontalmente al verse en monitores panorámicos

Comorl?¿? Eso existe? Me vendría cojonudo, como furula? Ardo en deseos de saber...

DCelso

Pues no te lo vas a creer pero se habla de él en la wiki, busqué esa función en el buscador del wiki y me apareció que está en el ejemplo de joystick, a ver parece que sirve para comprobar si un modo de pantalla es válido.
http://wiki.bennugd.org/index.php?title=Tutorial:Joystick_tester
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Windgate

#11
Aquí tienes un ejemplo momia, resalto la parte encargada de detectar si la pantalla es panorámica:

PROCESS inicializar_video ( );
// Proceso encargado de configurar el modo de vídeo y los frames por segundo
PRIVATE
   ancho_escritorio, alto_escritorio; // Para centrar la ventana
   ancho_ventana, alto_ventana;
   res_x, res_y;
BEGIN
   <b>IF ( mode_is_ok ( RESOLUCION_X, RESOLUCION_Y , MODO_COLOR , MODE_WINDOW ) )
set_mode ( RESOLUCION_X, RESOLUCION_Y , MODO_COLOR , MODE_WINDOW );
ELSE
set_mode ( 1024 , 768 , MODO_COLOR , MODE_WINDOW );
END</b>
set_fps ( FRAMES_POR_SEGUNDO , 0 );
   set_title ( NOMBRE_DEL_JUEGO );

   // Centra la ventana en función de la resolución de Escritorio y el tamaño de ventana
   get_desktop_size(&ancho_escritorio, &alto_escritorio);
   get_window_size(&ancho_ventana, &alto_ventana, &res_x, &res_y);
   set_window_pos((ancho_escritorio/2)-(ancho_ventana/2),
       (alto_escritorio/2)-(alto_ventana/2));

IF ( C_BENNU3D )
M8E_INIT ( EDT_OPENGL );
END
END


El problema de ello es que hay que programar teniendo en cuenta los 2 posibles modos de vídeo desde el principio, ya que si lo incluyes a mitad de proyecto puedes llevarte sorpresas con las imágenes que se ajustaban a la pantalla.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

La momia que fuma

aaah, vale, es para ver si el modo de video es válido (Bueno, ya lo dice el propio nombre de la función, menudo detective estoy hecho XDDD), entendi que valdría para corrección de aspecto o algo así...Gracias mil por la información.

Windgate

Por cierto, si te ves "condenado" a una resolución normal en monitor panorámico puedes usar un size_x = 80 y todo queda perfecto, con fotos de "personas" es como se nota esa diferencia, con gráficos apenas se nota nada :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

La momia que fuma

Lo que se me ocurre ahora para eso es meter resolución panorámica para que no haya deformación (y en mi caso además emborronamiento) y el juego en si ponerlo en una región tamaño 4:3