Ratón bloqueado al minimizar

Started by Arcontus, November 17, 2013, 08:42:11 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

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!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Yawin

Sí, a mi también me suele pasar. Aunque nunca se me había ocurrido preguntar si tenía arreglo. ¿Lo tiene?
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Yawin

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).
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Arcontus

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.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

JaViS

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
Working on Anarkade. A couch multiplayer 2D shooter.

Arcontus

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"
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

JaViS

pero no seas cabezon, es un ejemplo, tenes que declarar la variable y ponerlo dentro de un loop
Working on Anarkade. A couch multiplayer 2D shooter.

Arcontus

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
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Drumpi

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.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Arcontus

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! :'( :'(
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Arcontus

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!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Drumpi

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 :)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)