Autor
|
Tema: [Consulta] SDL2 arreglar movimiento de ventana con click (Leído 4,632 veces)
|
BloodSharp
Desconectado
Mensajes: 811
¡ Hiperfoco !
|
Buenas gente del foro, tengo una consulta con SDL2 que ojalá algún gurú de esta librería sepa resolver... Estaba creando una ventana con renderizado en OpenGL y mi problema es que al mover la ventana manteniendo click produce un temblor en el movimiento demasiado extraño. Con WinAPI no tengo problema en mi código pero al portar esto a SDL2 (porque deseo crear la aplicación multiplataforma) produce esa sacudida extraña... // Main loop bool bOpen = true; while (bOpen) { SDL_Event event; static bool bMouseClicked=false; static int xMPos=0,yMPos=0; while (SDL_PollEvent(&event)) { if(event.type == SDL_MOUSEBUTTONDOWN) { if(event.button.button == SDL_BUTTON_LEFT) { bMouseClicked=true; SDL_CaptureMouse(SDL_TRUE); SDL_GetMouseState(&xMPos,&yMPos); } } if(event.type == SDL_MOUSEBUTTONUP) { if(event.button.button == SDL_BUTTON_LEFT) { bMouseClicked=false; SDL_CaptureMouse(SDL_FALSE); } } if(event.type == SDL_MOUSEMOTION) { int xPos,yPos,xMPosN,yMPosN; if(bMouseClicked) { SDL_GetWindowPosition(window,&xPos,&yPos); SDL_GetMouseState(&xMPosN,&yMPosN); xPos+=xMPosN-xMPos; yPos+=yMPosN-yMPos; SDL_SetWindowPosition(window,xPos,yPos); //SDL_FlushEvent(SDL_WINDOWEVENT_MOVED); //SDL_FlushEvents(SDL_WINDOWEVENT,SDL_SYSWMEVENT); } } if (event.type == SDL_QUIT) bOpen = false; }
B#
|
|
|
En línea
|
|
|
|
srWhiteSkull
|
...depura en esa parte, quizás tengas el problema ahí, ... if(event.type == SDL_MOUSEMOTION) { int xPos,yPos,xMPosN,yMPosN; if(bMouseClicked) { SDL_GetWindowPosition(window,&xPos,&yPos); SDL_GetMouseState(&xMPosN,&yMPosN); xPos+=xMPosN-xMPos; // Puede que sea por esta operación yPos+=yMPosN-yMPos; // Puede que sea por esta operación SDL_SetWindowPosition(window,xPos,yPos); ...
Si te funciona en otra plataforma entonces deberías crear una macro función que actúe en función de que plataforma por medio de las instrucciones condicionales de preprocesador #if etc...
|
|
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 811
¡ Hiperfoco !
|
Si te funciona en otra plataforma entonces deberías crear una macro función que actúe en función de que plataforma por medio de las instrucciones condicionales de preprocesador #if etc... Hola, gracias por responder. He probado recién en Windows y funciona perfectamente sin realizar el temblor por lo que asumo el código está correcto. Por ahora probé unicamente en el escritorio de Deepin voy a probar en distintos, si ocurre el mismo problema en varios voy a reportar el error a los desarrolladores de Valve para que arreglen la librería (porque podré asumir que solamente ocurre en Linux). B#
|
|
|
En línea
|
|
|
|
srWhiteSkull
|
Pero depuraste para ver los valores que contienen esos variables? xMpos, xMposN, yMpos y yMposN, quizás simplemente haya que hacer un cambio en la operación porque trabaje de otra forma,
|
|
« Última modificación: 23 Febrero 2019, 23:14 pm por srWhiteSkull »
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 811
¡ Hiperfoco !
|
Pero depuraste para ver los valores que contienen esos valores? xMpos, xMposN, yMpos y yMposN, quizás simplemente haya que hacer un cambio en la operación porque trabaje de otra forma. En teoría no debería funcionar diferente, al menos con los resultados devuelto por la librería, dado a que es una librería multiplataforma que debería funcionar con los mismos parámetros de retorno en cualquier sistema. Por otro lado, me fijé los valores y son correctos: (la ventana es de 400x150) Probaré con KDE, ya probé con gnome y provoca el mismo resultado... B#
|
|
|
En línea
|
|
|
|
CalgaryCorpus
|
Que pasa si mueves la instruccion que toma la posicion de la ventana al momento donde se detecta el click del mouse? osea SDL_GetWindowPosition(window,&xPos,&yPos);
al interior del if(event.button.button == SDL_BUTTON_LEFT)
? (Eliminando donde ahora esta')
|
|
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 811
¡ Hiperfoco !
|
Que pasa si mueves la instruccion que toma la posicion de la ventana al momento donde se detecta el click del mouse? Al interior del if(event.button.button == SDL_BUTTON_LEFT)
Pasa lo mismo, supongo que el problema real reside en SDL_SetWindowPosition de Linux... B#
|
|
|
En línea
|
|
|
|
CalgaryCorpus
|
En ese caso, tal vez funciona mejor asi? // Main loop bool bOpen = true; while (bOpen) { SDL_Event event; static bool bMouseClicked=false; int xPos, yPos; static int xMPos=0,yMPos=0; while (SDL_PollEvent(&event)) { if(event.type == SDL_MOUSEBUTTONDOWN) { if(event.button.button == SDL_BUTTON_LEFT && !bMouseClicked) { bMouseClicked=true; SDL_GetWindowPosition(window,&xPos,&yPos); SDL_CaptureMouse(SDL_TRUE); SDL_GetMouseState(&xMPos,&yMPos); } } else if(event.type == SDL_MOUSEBUTTONUP) { if(event.button.button == SDL_BUTTON_LEFT) { bMouseClicked=false; SDL_CaptureMouse(SDL_FALSE); } } else if(event.type == SDL_MOUSEMOTION) { int xMPosN,yMPosN; if(bMouseClicked) { SDL_GetMouseState(&xMPosN,&yMPosN); xPos+=xMPosN-xMPos; yPos+=yMPosN-yMPos; SDL_SetWindowPosition(window,xPos,yPos); } } else if (event.type == SDL_QUIT) bOpen = false; }
|
|
« Última modificación: 23 Febrero 2019, 22:34 pm por CalgaryCorpus »
|
En línea
|
|
|
|
BloodSharp
Desconectado
Mensajes: 811
¡ Hiperfoco !
|
En ese caso, tal vez funciona mejor asi? B#
|
|
|
En línea
|
|
|
|
srWhiteSkull
|
Al final funcionó a la manera de CalgaryCorpus. Claro al no hacer un else seguía detectando el evento de pulsado e interfería al mover con el ratón pulsado. Entonces queda cerrado el tema. Gracias CalgaryCorpus por tú colaboración
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Consulta ScreenShot de una ventana web
Java
|
Pablo Videla
|
1
|
2,803
|
9 Noviembre 2011, 22:27 pm
por Pablo Videla
|
|
|
Cerrar ventana popup o float al hacer click en su contenido
Desarrollo Web
|
maximilion69
|
7
|
13,302
|
23 Junio 2012, 03:50 am
por ©rIsT0BÄl
|
|
|
Enviar click a ventana externa (de forma especial)
.NET (C#, VB.NET, ASP)
|
TomaSs
|
0
|
1,710
|
25 Enero 2014, 14:04 pm
por TomaSs
|
|
|
[Consulta]Sensor de movimiento a pc?
Juegos y Consolas
|
vojok
|
1
|
2,365
|
28 Diciembre 2015, 00:06 am
por robertofd1995
|
|
|
Hola mundo en SDL2
Programación C/C++
|
aguaenSDL
|
6
|
4,971
|
14 Enero 2016, 16:15 pm
por 0xFer
|
|