Como lidar com OpenGL e Fullscreen no OS X

9

Eu faço a maior parte do meu desenvolvimento no OS X e, para o meu projeto de jogo atual, esse é o meu ambiente de destino. No entanto, quando jogo, jogo no Windows. Como jogador do Windows, estou acostumado a alternar Alt + Tab de dentro do jogo para o último aplicativo aberto.

No OS XI, atualmente não consigo encontrar um jogo que suporte isso, nem encontro uma maneira de torná-lo possível. Meu projeto atual é baseado no SDL 1.3 e posso ver que a guia cmd + é uma sequência que é enviada diretamente para o meu aplicativo e não é interceptada pelo sistema operacional.

Agora, minha primeira tentativa foi ocultar a janela de renderização na guia cmd +, o que certamente funciona, mas tem a desvantagem de que uma janela oculta do OpenGL no SDL não pode ser restaurada quando o usuário retorna ao aplicativo. Primeiro de tudo, não há nenhum evento disparado para isso ou não consigo encontrá-lo. Em segundo lugar, o principal problema é que, quando a janela do aplicativo está oculta, meu jogo ainda é o aplicativo ativo, apenas que a janela desapareceu.

Isso é incrivelmente irritante.

Alguma idéia de como aproximar o comportamento do Windows / Linux para alt + tab?

Armin Ronacher
fonte

Respostas:

2

O problema é que você está capturando a tela, conforme descrito na documentação da Apple aqui: https://developer.apple.com/library/mac/#documentation/graphicsimaging/Conceptual/QuartzDisplayServicesConceptual/Articles/DisplayCapture.html

Isso significa que TODOS os comandos do teclado são interceptados pelo seu aplicativo. Existem vantagens nessa abordagem, dependendo da sua aplicação.

Os documentos da Apple dizem, na parte inferior:

Nota: Não é necessário capturar uma exibição para fazer desenhos em tela cheia. Outra abordagem é criar e desenhar em uma janela sem borda o tamanho da exibição. Essa abordagem permite que você use todos os recursos do sistema de janelas. Ele também funciona bem com o restante do sistema operacional e reduz a complexidade do manuseio da tela (por exemplo, você não precisa se preocupar com telas espelhadas). Com essa abordagem, você pode receber alertas de erro que podem ser perdidos com uma exibição capturada. Você também pode usar a guia Comando para alterar os aplicativos com essa abordagem. Em sistemas com hardware gráfico moderno, o desempenho do desenho em uma janela de tela cheia é quase tão rápido quanto um contexto de desenho em tela cheia.

O que você precisa fazer é tornar sua visualização openGL em tela cheia sem capturar a tela. É assim que o cocos2d atualmente lida com aplicativos OS X em tela cheia. Você pode procurar o código do cocos2d Mac aqui: https://github.com/cocos2d/cocos2d-iphone/tree/master-v2/cocos2d/Platforms/Mac

Procure especificamente em CCDirectorMac.m e CCGLView.m sua implementação.

Se você determinar que deseja limitar seletivamente algumas das funções, como alternância de processos, sem limitar todos os recursos do sistema de janelas, consulte a Nota técnica do Apple Kiosk Mode: http://developer.apple.com /library/mac/#technotes/KioskMode/Introduction/Introduction.html

Argila
fonte
1

Minha experiência com isso no Mac é que normalmente existe um atalho para sair do modo de tela cheia no modo de janela (normalmente CMD + M ou CMD + Return). Depois de mudar para o modo de janela, você poderá acessar todos os seus aplicativos normalmente. O modo de janela também permite que o usuário monitore seu jogo entre todos os outros aplicativos. Então eu acho que você poderia implementar esse tipo de funcionalidade no seu jogo.

James Bedford
fonte