2016年4月9日土曜日

【osx/cocoa/obj-c】フルスクリーンにする

OSXアプリをフルスクリーンにする方法についてのメモです。

まず、OSX/Cocoaアプリケーションのプロジェクト(storyboardあり)を作成した状態で、Window Controller → Window の Attribute を設定
・「Full Screen」に「Primary Window」を設定
・他は適当です
ウィンド⇔フルスクリーンの切り替えが必要な場合はもう少し色々と設定する必要があるが、とりあえずフルスクリーンのみで動くアプリ=ゲームを作る前提ならこんな感じではなかろうかと。

次に、ViewController.m に以下を追加。

- (void)viewWillAppear
{
    [self.view.window.contentView enterFullScreenMode:self.view.window.screen withOptions:nil];
    [self.view.window makeFirstResponder:self.vram];
    [NSCursor hide];
}

【やっていること】
・コンテントView(self.view.window.contentView)に対して enterFullScreenMode を発行
・何故かフルスクリーンにすると first responder が外れ、キー入力が受け付けられなくなった(キーを押すと「ポン」という警告音が鳴る)ので makeFirstResponder を発行しておく
・self.vram = self.viewの子View(ゲームのメインView)
・なお、Viewの構造としては以下のような感じです
 - self.view : 画面一杯の真っ黒なNSView
 - self.vram : ゲーム映像を表示するNSView
・マウスカーソルを消しておく

これでフルスクリーンになれました。

なお、NSViewのenterFullScreenMode以外にも、NSWindowのtoggleFullScreenでもフルスクリーンになれたのですが、そっちの方のやり方だと失われた first responder を復活させる方法がよく分からなかった(恐らく、フルスクリーン化が完了したことを検知するデリゲートとかで makeFirstResponder するのではないかと思うのですが、そのやり方が分からなかった)ので、NSViewの方法を採りました。

画面描画については、iOSと同じ方法(CALayerを使う方法)でできるので割愛。
UIKitを使っている場合は簡単にはできませんが、CALayerはOSXもiOSもだいたい同じ仕組みなので、自前の描画エンジンで画面描画をするなら、CALayerだけで描画する(or OpenGLで描画する)のが良いんじゃないかと思います。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...