Comment gérer OpenGL et plein écran sous OS X

9

Je fais l'essentiel de mon développement sur OS X et pour mon projet de jeu actuel, c'est mon environnement cible. Cependant, lorsque je joue à des jeux, je joue sur Windows. En tant que joueur Windows, j'ai l'habitude de passer Alt + Tab du jeu à la dernière application ouverte.

Sur OS XI, je ne trouve actuellement aucun jeu qui le supporte et je ne peux pas non plus trouver un moyen de le rendre possible. Mon projet actuel est basé sur SDL 1.3 et je peux voir que cmd + tab est une séquence qui est envoyée directement à mon application et non interceptée par le système d'exploitation.

Maintenant, ma première tentative a été de masquer la fenêtre de rendu sur l'onglet cmd + qui fonctionne certainement, mais a l'inconvénient qu'une fenêtre OpenGL cachée dans SDL ne peut pas être restaurée lorsque l'utilisateur revient sur l'application. Tout d'abord, il n'y a pas d'événement déclenché pour cela ou je ne le trouve pas, ensuite le problème principal est que lorsque cette fenêtre d'application est masquée, mon jeu est toujours l'application active, juste que la fenêtre a disparu.

C'est incroyablement ennuyeux.

Toutes les idées comment approximer le comportement de windows / linux pour alt + tab?

Armin Ronacher
la source

Réponses:

2

Le problème est que vous capturez l'affichage, comme décrit dans la documentation Apple ici: https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html

Cela signifie que TOUTES les commandes du clavier sont interceptées par votre application. Cette approche présente des avantages, selon votre application.

Les documents Apple disent, en bas:

Remarque: il n'est pas nécessaire de capturer un affichage pour faire un dessin en plein écran. Une autre approche consiste à créer et à dessiner dans une fenêtre sans bordure la taille de l'affichage. Cette approche vous permet d'utiliser toutes les fonctionnalités du système de fenêtrage. Il fonctionne également bien avec le reste du système d'exploitation et réduit la complexité de la gestion de l'affichage (par exemple, vous n'avez pas à vous soucier des affichages en miroir). Avec cette approche, vous pouvez recevoir des alertes d'erreur qui pourraient être manquées avec un affichage capturé. Vous pouvez également utiliser Commande-Tab pour modifier les applications avec cette approche. Sur les systèmes dotés d'un matériel graphique moderne, les performances de dessin dans une fenêtre plein écran sont presque aussi rapides qu'un contexte de dessin plein écran.

Ce que vous devez faire est de rendre votre vue openGL en plein écran sans capturer l'affichage. C'est ainsi que cocos2d gère actuellement les applications OS X en plein écran. Vous pouvez parcourir le code pour cocos2d Mac ici: https://github.com/cocos2d/cocos2d-iphone/tree/master-v2/cocos2d/Platforms/Mac

Regardez spécifiquement dans CCDirectorMac.m et CCGLView.m pour leur implémentation.

Si vous déterminez que vous souhaitez limiter de manière sélective certaines des fonctions, telles que la commutation de processus, sans limiter toutes les fonctionnalités du système de fenêtrage, vous pouvez consulter la note technique du mode kiosque Apple: http://developer.apple.com /library/mac/#technotes/KioskMode/Introduction/Introduction.html

Argile
la source
1

D'après mon expérience sur le Mac, il existe normalement un raccourci pour quitter le mode plein écran en mode fenêtré (généralement CMD + M ou CMD + Return). Une fois que vous êtes passé en mode fenêtré, vous pouvez accéder à toutes vos applications comme d'habitude. Le mode fenêtré permet également à l'utilisateur de surveiller son jeu parmi toutes ses autres applications. Je suppose donc que vous pouvez simplement implémenter ce type de fonctionnalité dans votre jeu.

James Bedford
la source