Resulta que si tengo a pantalla completa el juego, si se minimiza por cualquier causa el ratón queda como cogido a la esquina superior izquierda y no se puede operar con el.
¿Alguna idea de como solucionarlo?
Gracias!
Sí, a mi también me suele pasar. Aunque nunca se me había ocurrido preguntar si tenía arreglo. ¿Lo tiene?
Es raro.
Cuando me suele pasar eso con cualquier juego o programa, pulsando ALT+TAB se me debería cambiar de nuevo al juego o al escritorio (en este segundo caso, una nueva pulsación me devuelve al juego). Aunque se me ha dado el caso de algún juego a pantalla completa que no consigue restaurarse y se debe cerrar con el gestor de tareas.
Se puede hacer sin usar el ratón. No sé cómo será en 7 y en 8, pero en w2k y anteriores (creo que es válido en XP), la combinación CTRL+ALT+SUPR (¿os suena?) os debe abrir una ventana con varias opciones, entre ellas, el gestor de tareas o apagar el equipo. Si sabeis moveros por las ventanas con los cursores, el tabulador, el espacio y el intro, no debería ser difícil.
De todas maneras, si estais debugeando, no dejeis de meter la mod_debug y compilar con -g. Alt+x debería funcionar para hacer un hard-close al juego.
el caso es que a mi por ejemplo, me apetece minimizar un juego para ajustar un parámetro del fichero de configuración y posteriormente refrescar ingame. Y el ratón se queda arriba. Aún haciendo alt+tab. Aun haciendo ctrl+alt+supr (que en win vista en adelante es más cómodo hacer ctrl+mayus+esc).
Lo de alt+tab funciona perfectamente, pero sin duda si no se conoce como le sucedió a un amigo que estaba probando mi proyecto, al final tuvo que reiniciar el pc y me dijo: "Solo por esto, ya no viciaría más a tu juego!" Sin duda la experiencia de usuario es importante y este "bug" es muy molesto.
yo lo soluciono asi:
if (!focus_status)
// en pc si sacamos el foco debemos restaurar la ventana para devolver el mouse al OS
if (full_screen)
restore_full_scren = true;
set_mode(map_info(0,0,G_WIDTH),map_info(0,0,G_HEIGHT),16);
end
//mientras no se recupere el foco
while(!focus_status)
frame;
end
if (restore_full_scren)
full_screen = true;
set_mode(map_info(0,0,G_WIDTH),map_info(0,0,G_HEIGHT),16);
end
end
Quote from: JaViS on November 18, 2013, 06:56:30 PM
yo lo soluciono asi:
if (!focus_status)
// en pc si sacamos el foco debemos restaurar la ventana para devolver el mouse al OS
if (full_screen)
restore_full_scren = true;
set_mode(map_info(0,0,G_WIDTH),map_info(0,0,G_HEIGHT),16);
end
//mientras no se recupere el foco
while(!focus_status)
frame;
end
if (restore_full_scren)
full_screen = true;
set_mode(map_info(0,0,G_WIDTH),map_info(0,0,G_HEIGHT),16);
end
end
Me da un error, no reconoce "restore_full_scren"
pero no seas cabezon, es un ejemplo, tenes que declarar la variable y ponerlo dentro de un loop
Quote from: JaViS on November 18, 2013, 11:36:59 PM
pero no seas cabezon, es un ejemplo, tenes que declarar la variable y ponerlo dentro de un loop
:O
Pues es verdad, no me di cuenta de alto tan simple... de todas maneras parece que sigue sucediendo lo mismo con el mouse. ¿Alguna idea?
PROCESS foco()
PRIVATE
int restore_full_scren;
END
BEGIN
LOOP
if (!focus_status)
// en pc si sacamos el foco debemos restaurar la ventana para devolver el mouse al OS
if (full_screen)
restore_full_scren = true;
set_mode(map_info(0,0,G_WIDTH),map_info(0,0,G_HEIGHT),32);
end
//mientras no se recupere el foco
while(!focus_status)
frame;
end
if (restore_full_scren)
full_screen = true;
set_mode(map_info(0,0,G_WIDTH),map_info(0,0,G_HEIGHT),32);
end
end
FRAME;
END
END
Hombre, obviamente, al usuario final, eso es un problema gordo, porque cualquier molestia, por pequeña que sea, cualquier cosa más allá del doble clic y jugar, le hace perder el poco interés que pudiera tener en el juego (partimos de la premisa de que hacemos juegos indies, que no son famosos, y que el que lo juega lo hace por curiosidad). Muy bueno tiene que ser como para que lo pase por alto.
Pero no sé si eso es problema de Bennu, del SO o de las propias SDL.
Quote from: Drumpi on November 30, 2013, 06:24:48 PM
Hombre, obviamente, al usuario final, eso es un problema gordo, porque cualquier molestia, por pequeña que sea, cualquier cosa más allá del doble clic y jugar, le hace perder el poco interés que pudiera tener en el juego (partimos de la premisa de que hacemos juegos indies, que no son famosos, y que el que lo juega lo hace por curiosidad). Muy bueno tiene que ser como para que lo pase por alto.
Pero no sé si eso es problema de Bennu, del SO o de las propias SDL.
Continuo con el problema... ¡ayuda! :'( :'(
Solventé el problema hace tiempo, pero se me olvido postear mi solución:
PROCESS EstadoFocus()
PRIVATE
estado;
END
BEGIN
estado = 1;
LOOP
if ((focus_status) && (estado == 0))
set_mode(Resolucion_x,Resolucion_y,Resolucion_modo, mode_fullscreen);
estado = 1;
else
if (estado == 1)
if (!(focus_status))
set_mode(Resolucion_x,Resolucion_y,Resolucion_modo, mode_window);
estado = 0;
END
END
END
FRAME;
END
END
Por si a alguien le sucede lo mismo, esta función que corre en segundo plano se encargará de no bloquear al mouse cambiando entre los modos ventana y pantalla completa de manera transparente.
Un saludo!
Me alegra ver que al final has podido resolverlo :D
Hay que tomar nota para que no se olvide esto, porque puede ser importante para otros desarrollos. Muchas gracias por tu solución :)