Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Como hacer que el ratón...

Iniciado por Drácula, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

Drácula

                                Vereis, quiero que cuando el ratón llegue a los bordes de la ventana, vuelva a posicionarse en el otro borde . Por ejemplo, muevo el ratón a la derecha, y cuando llego al borde, quiero que aparezca por la izquierda.

Lo necesito porque cuando llego al final de la pantalla ya no puedes mover más el ratón hacia ese lado y claro...¡sería conveniente en los juegos que esto se hiciera!

Sé que con DirectInput no hay problemas, pero prefiero no utilizarlo para que el debug sea mucho más cómodo.

(por favor, én este post preferiría un poco de código en lugar de teoría)

Gracias                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Lord Trancos

                                Wenoooo,... tienes un mensaje de windows que te dice cuando el ratón ha sido movido : WM_MOUSEMOVE y las coordenadas en las que se encuentra;



WM_MOUSEMOVE



fwKeys = wParam;        // key flags

xPos = LOWORD(lParam);  // horizontal position of cursor

yPos = HIWORD(lParam);  // vertical position of cursor



...peroooo ese mensaje no lo recibiras si el raton sale de tu ventana... pero (como no...) para eso tienes otro mensaje:



The WM_CAPTURECHANGED message is sent to the window that is losing the mouse capture.



Entre esos dos mensajes, y las funciones del API: SetCursorPos y GetCursorPos, no deberias de tener problemas para hacer lo que quieres...

...siento no postearte código, pero seguro que no te hace falta. :ojo:                                
i>SaludoteZ de Lord Trancos!
http://www.dxlab.tk - http://dxlab.host.sk - programación de DirectX con Delphi.

fiero

                                Hola,
Lo que quiere Dracula no se puede resolver con la posición actual del cursor, con los mensajes WM_MOUSEMOVE, etc...

Si por ejemplo estamos en una pantalla de 800x600 y tenemos el ratón en la posición 799,400 (o sea a la derecha del todo) y en ese momento movemos el ratón a la derecha, el cursor no se va a mover ya que está en el límite de pantalla, sin embargo queremos detectar ese caso para situar el cursor en la posición 0+DESPLAZAMIENTOX,400 de la pantalla. Movimiento tipo 3DMAX cuando giras o mueves objetos.

Los mensajes WM_MOUSEMOVE no se activan, ya que el cursor no se ha movido, hay que detectar el movimiento antes de eso, o inventarse algun truquillo...

saludos                                
www.videopanoramas.com Videopanoramas 3D player

fiero

                                Hola,
Bueno, al final siempre resulta que hay una solución facil, esto puesto en tu bucle principal de animación funciona bastante bien:

   

   POINT pos;
   
int moverCursor=0,xPantalla=1024,yPantalla=768;
   GetCursorPos(&pos);
   
if(pos.x==xPantalla-1)
   {
       pos.x=1;
       moverCursor=1;
   }
   
else if(pos.x==0)
   {
       pos.x=xPantalla-2;
       moverCursor=1;
   }
   
if(pos.y==yPantalla-1)
   {
       pos.y=1;
       moverCursor=1;
   }
   
else if(pos.y==0)
   {
       pos.y=yPantalla-2;
       moverCursor=1;
   }
   
if(moverCursor) SetCursorPos(pos.x,pos.y);



un saludo                                
www.videopanoramas.com Videopanoramas 3D player

BeRSeRKeR

                                Existen unas funciones que pueden servirte y son SetCapture y ReleaseCapture. Lo que haces con SetCapture es que asocias el cursor con tu ventana y aunque te salgas de los bordes de ésta, el ratón seguirá enviando mensajes a tu ventana. Ahora bien, si haces click fuera de la ventana, perderas dicha asociación. Con ReleaseCapture pues rompes la asociación...

Un saludo
                               
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Drácula

                                Gracias a todos. La solución de fiero me parece que es la que yo necesito, por las necesidades que tengo.                                
ltimas mejoras en Merlín: Multitextura.Control y generación automática de LOD.Importa ASE y X. Frustum Clipping por BB.Render añadido de wireframe y del BB.Animaciones por interpolación.Animaciones de textura...
Actualmente:Octree y jerarquías

Ithaqua

                                El SetCursorPos no generará otro WM_MOUSEMOVE?
                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

fiero

                                Hola Ithaqua,
el SetCursorPos sí genera un mensaje WM_MOUSEMOVE, pero aunque se ponga este código en respuesta a ese mensaje, la segunda llamada no cumple ninguna condición para que se vuelva a llamar a SetCursorPos, por lo que no hay riesgo de bucle infinito.

un saludo                                
www.videopanoramas.com Videopanoramas 3D player

Ithaqua

                                Me refería a la hora de hallar los deltas del cursor. Para filtrar los WM_MOUSEMOVE que son generados con SetCursorPos()

                               
thaqua^Stravaganza
http://ithaqua.stravaganza.org

fiero

                                bueno, perdonar que suba otra vez este post. Estoy haciendo un minieditor y he metido el código de ahí arriba a la hora de girar y mover los objetos. Aquí esta el código completo que he usado, modificando los deltas como bien dice Ithaqua...por si alguien que esté aprendiendo le pueda servir...

   

void CEditor::OnMouseMove(UINT nFlags, CPoint point)
{
   POINT pos;
   
int moverCursor=0;
   GetCursorPos(&pos);
   
if(pos.x==m_visor.m_xPantalla-1)
   {
       m_pointAnterior.x=m_pointAnterior.y-pos.x;
       pos.x=1;
       moverCursor=1;
   }
   
else if(pos.x==0)
   {
       pos.x=m_visor.m_xPantalla-2;
       m_pointAnterior.x=pos.x+m_pointAnterior.x;
       moverCursor=1;
   }
   
if(pos.y==m_visor.m_yPantalla-1)
   {
       m_pointAnterior.y=m_pointAnterior.y-pos.y;
       pos.y=1;
       moverCursor=1;
   }
   
else if(pos.y==0)
   {
       pos.y=m_visor.m_yPantalla-2;
       m_pointAnterior.y=pos.y+m_pointAnterior.y;
       moverCursor=1;
   }
   
if(moverCursor)
   {
       SetCursorPos(pos.x,pos.y);
       
return;
   }
   
   
//...

   m_pointAnterior = point;



un saludo

[ Este Mensaje fue editado por: fiero el 2002-05-10 19:58 ]                                
www.videopanoramas.com Videopanoramas 3D player






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.