Umgang mit OpenGL und Vollbild unter OS X.

9

Ich mache den größten Teil meiner Entwicklung unter OS X und für mein aktuelles Spielprojekt ist dies meine Zielumgebung. Wenn ich jedoch Spiele spiele, spiele ich unter Windows. Als Windows-Spieler bin ich es gewohnt, mit Alt + Tab vom Spiel zur letzten geöffneten Anwendung zu wechseln.

Unter OS XI kann ich derzeit weder ein Spiel finden, das dies unterstützt, noch einen Weg finden, dies zu ermöglichen. Mein aktuelles Projekt basiert auf SDL 1.3 und ich kann sehen, dass cmd + tab eine Sequenz ist, die direkt an meine Anwendung gesendet und vom Betriebssystem nicht abgefangen wird.

Jetzt war mein erster Versuch, das Rendering-Fenster auf cmd + tab auszublenden, was sicherlich funktioniert, aber den Nachteil hat, dass ein verstecktes OpenGL-Fenster in SDL nicht wiederhergestellt werden kann, wenn der Benutzer zur Anwendung zurückkehrt. Erstens wird dafür kein Ereignis ausgelöst oder ich kann es nicht finden. Zweitens besteht das Hauptproblem darin, dass mein Spiel, wenn dieses Anwendungsfenster ausgeblendet ist, immer noch die aktive Anwendung ist, nur dass das Fenster verschwunden ist.

Das ist unglaublich nervig.

Irgendwelche Ideen, wie man das Windows / Linux-Verhalten für Alt + Tab approximiert?

Armin Ronacher
quelle

Antworten:

2

Das Problem besteht darin, dass Sie die Anzeige erfassen, wie in der Apple-Dokumentation hier beschrieben: https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html

Dies bedeutet, dass ALLE Tastaturbefehle von Ihrer Anwendung abgefangen werden. Dieser Ansatz bietet je nach Anwendung Vorteile.

In den Apple-Dokumenten steht unten:

Hinweis: Es ist nicht erforderlich, eine Anzeige zu erfassen, um im Vollbildmodus zu zeichnen. Ein anderer Ansatz besteht darin, die Größe der Anzeige zu erstellen und in ein randloses Fenster zu zeichnen. Mit diesem Ansatz können Sie alle Funktionen des Fenstersystems nutzen. Es funktioniert auch gut mit dem Rest des Betriebssystems und reduziert die Komplexität der Anzeigehandhabung (Sie müssen sich beispielsweise nicht um gespiegelte Anzeigen kümmern). Mit diesem Ansatz können Sie Fehlerwarnungen erhalten, die bei einer erfassten Anzeige möglicherweise übersehen werden. Sie können auch die Befehlstaste verwenden, um Anwendungen mit diesem Ansatz zu ändern. Auf Systemen mit moderner Grafikhardware ist die Zeichenleistung in einem Vollbildfenster fast so schnell wie in einem Vollbild-Zeichnungskontext.

Was Sie tun müssen, ist, Ihre openGL-Ansicht im Vollbildmodus anzuzeigen, ohne die Anzeige zu erfassen. So verarbeitet cocos2d derzeit OS X-Vollbildanwendungen. Sie können den Code für cocos2d Mac hier durchsuchen: https://github.com/cocos2d/cocos2d-iphone/tree/master-v2/cocos2d/Platforms/Mac

Suchen Sie speziell in CCDirectorMac.m und CCGLView.m nach ihrer Implementierung.

Wenn Sie festlegen, dass Sie einige Funktionen, wie z. B. die Prozessumschaltung, selektiv einschränken möchten, ohne alle Funktionen des Fenstersystems einzuschränken, lesen Sie den technischen Hinweis zum Apple Kiosk-Modus: http://developer.apple.com /library/mac/#technotes/KioskMode/Introduction/Introduction.html

Lehm
quelle
1

Ich habe die Erfahrung gemacht, dass es auf dem Mac normalerweise eine Verknüpfung gibt, um den Vollbildmodus in den Fenstermodus zu verlassen (normalerweise CMD + M oder CMD + Return). Sobald Sie in den Fenstermodus gewechselt haben, können Sie wie gewohnt auf alle Ihre Anwendungen zugreifen. Der Fenstermodus ermöglicht es dem Benutzer auch, sein Spiel unter all seinen anderen Apps zu überwachen. Ich denke, Sie könnten diese Art von Funktionalität einfach in Ihr Spiel implementieren.

James Bedford
quelle