FC2ブログ

頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


macOSのSpriteKitでマウスカーソルの位置を得る

macOSアプリでSpriteKitを使う場合にマウスのカーソル(ポインター)の位置を得る方法について。

macOSでSpriteKitを使う場合のファイル構成

↑Xcodeでプロジェクト作成時にSpriteKitを使うと指定するとこのようなファイル構成になる。

NSViewオブジェクトに対してマウスカーソルの位置を得る場合には
- (void)addTrackingArea:(NSTrackingArea *)trackingArea;
↑これで設定すればよかったが、SpriteKitを使うプロジェクトの場合、NSViewのサブクラスのSKViewを継承するファイルはデフォではない。

デフォで作成されているGameSceneというファイルがあり、このクラスはSKSceneを継承している。そのコードの最初の方に、
- (void)didMoveToView:(SKView *)view
{
    // Setup your scene here

}
↑このdidMoveToView:メソッドがあり、ここで初期設定ができる。
ここでSKViewオブジェクトのviewをもらうことになるのでこのviewに対してトラッキングの設定をする。

- (void)didMoveToView:(SKView *)view
{
    NSTrackingAreaOptions options = (NSTrackingActiveAlways | NSTrackingMouseMoved);
    NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[view bounds]
                                                        options:options
                                                          owner:self
                                                       userInfo:nil];
    [view addTrackingArea:trackingArea];
}

- (void)mouseMoved:(NSEvent *)event
{
    CGPoint p = [event locationInNode:self];
    p =  [self convertPointToView:p];
}
↑得た座標はSKSceneの
- (CGPoint)convertPointToView:(CGPoint)point;
メソッドで座標変換すればウインドウでの座標を得ることができる(左下原点)。

マウスカーソル位置表示の実行結果

↑得た値を表示させているところ(マウスカーソルは撮影されていないが)。


ただし、この方法だとうまく取得できないエリアが出る場合がある。
- (void)didMoveToView:(SKView *)view;
でもらうSKViewオブジェクトはまだViewControllerの
-(void)viewDidLayout;
メソッドより前なので、実際に表示されるウインドウのサイズになっていない(storyboardで指定した値になっている)。上記のコードではこの時点でのviewのプロパティを使ってトラッキングエリアを設定しているので合わなくなる。
よって、
-(void)viewDidLayout;
↑これ以降で設定するなどの対応が必要。


参考サイト
cocoa - Using acceptsMouseMovedEvents for SpriteKit mouse actions with Storyboards and Swift - Stack Overflow


macOS Mojave 10.14


関連記事
macOSのNSScrollView上のマウスカーソルの位置を得る

<< macOSのNSScrollView上のマウスカーソルの位置を得る  TopPage  NSImageからCGImageを得る >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
http://ringsbell.blog117.fc2.com/tb.php/1240-19f58238




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad