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?
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).
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.
¡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 "
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.
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)
no nos gusta usar la wiki eh. :D
http://wiki.bennugd.org/index.php?title=Mouse_status
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
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í?
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...
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
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.
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.
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
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
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
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.
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 :-*
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.