Bennu Game Development

Foros en Español => Sugerencias => Mensaje iniciado por: Windgate en Octubre 31, 2009, 03:53:40 pm

Título: Detectar si el ratón se está moviendo
Publicado por: Windgate en Octubre 31, 2009, 03:53:40 pm
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 (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?
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Drumpi en Octubre 31, 2009, 04:10:39 pm
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).
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Windgate en Octubre 31, 2009, 04:30:25 pm
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.
Título: Re: Detectar si el ratón se está moviendo
Publicado por: osk en Octubre 31, 2009, 05:03:12 pm
¡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 "
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Windgate en Octubre 31, 2009, 05:11:34 pm
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.
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Drumpi en Octubre 31, 2009, 05:22:23 pm
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)
Título: Re: Detectar si el ratón se está moviendo
Publicado por: DCelso en Octubre 31, 2009, 05:38:34 pm
no nos gusta usar la wiki eh. :D
http://wiki.bennugd.org/index.php?title=Mouse_status
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Windgate en Octubre 31, 2009, 05:58:15 pm
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
Título: Re: Detectar si el ratón se está moviendo
Publicado por: TYCO en Octubre 31, 2009, 07:48:18 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....

Código: [Seleccionar]
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í?
Título: Re: Detectar si el ratón se está moviendo
Publicado por: La momia que fuma en Octubre 31, 2009, 08:12:32 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...
Título: Re: Detectar si el ratón se está moviendo
Publicado por: DCelso en Noviembre 01, 2009, 03:09:56 am
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
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Windgate en Noviembre 01, 2009, 05:10:06 am
Aquí tienes un ejemplo momia, resalto la parte encargada de detectar si la pantalla es panorámica:

Código: [Seleccionar]
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.
Título: Re: Detectar si el ratón se está moviendo
Publicado por: La momia que fuma en Noviembre 01, 2009, 08:52:00 pm
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.
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Windgate en Noviembre 01, 2009, 09:07:36 pm
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
Título: Re: Detectar si el ratón se está moviendo
Publicado por: La momia que fuma en Noviembre 01, 2009, 11:26:17 pm
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
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Windgate en Noviembre 02, 2009, 11:13:22 am
Sí, también es otra opción perfectamente válida, ¿Y si abres un hilo sobre ello querida momía?, es que me estás pisoteando el tema :P

No problem vaya, pero es que lo del ratón me tiene malo, estoy intentando programar los controles del WoW en un fin de semana y tomando birras, me exijo demasiado ;D
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Drumpi en Noviembre 02, 2009, 06:44:11 pm
Wind, haz lo que te dije, crea un proceso que guarde en sendas variables globales el desplazamiento del ratón en ese frame:

desp_mouse_x=mouse.x-(resolutionx/2);
desp_mouse_y=mouse.y-(resolutiony/2);
mouse.x=resolutionx/2;
mouse.y=resolutiony/2;

y después tienes otro proceso llamado por ejemplo:
process aux_mouse ()
begin
graph=raton_graf; //o lo que sea, ya sabes como va
loop

//movemos el ratón
x+=desp_mouse_x;
y+=desp_mouse_y;
//controlamos los límites de pantalla
if (x<0) x=0; end
if (y<0) y=0; end
if (x>resolutionx) x=resolutionx; end
if (y>resolutiony) y=resolutiony; end

frame;
end

end

Y ahora, en lugar de consultar la posición de mouse.x y mouse.y consultas la x y la y del proceso aux_mouse.
Más fácil imposible.

Es más, puedes aumentar los límites para hacer que el ratón se mueva en el plano horizontal de tu entorno 3D, o sin límites.
Y si sólo necesitas saber lo que se ha desplazado, tienes desp_mouse_x y desp_mouse_y, que no hacen ni caso a que el ratón esté en el límite de la pantalla.
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Windgate en Noviembre 02, 2009, 07:13:14 pm
Probemos Drumpi, tengo 1000 cosas pendientes pero al menos parece trabajada tu sugerencia, karma sólo por haberte molestado en tan complejo y novedoso tema :-*
Título: Re: Detectar si el ratón se está moviendo
Publicado por: Drumpi en Noviembre 03, 2009, 01:18:52 am
Es más, creo que esas cuatro primeras lineas también las puedes añadir al proceso dentro del loop, y ya tienes un proceso que controla todos los parámetros del ratón.

Hay una cosa que aprendes cuando haces videojuegos, y es que una cosa es lo que ve el PC y otra lo que sale en pantalla. En este caso el PC ve un proceso que sigue al ratón, pero el jugador verá un ratón. También se ve que el PC usa mapas de durezas reescaladas y el jugador un juego de plataformas. Y me pasó con el scroll isométrico: me obsesioné de que tenía que ser 3d, y en realidad debía ser 2D con una capa para los tiles que tapan al prota.