SpriteKit MouseMoved 不工作

02f*_*tym 2 macos objective-c mouseevent sprite-kit

我知道以前有人问过这个问题,但我认为答案可能需要更新,因为它目前不适用于使用 Mac OS 的 Xcode 8.3.3 的 SpriteKit。读完这篇文章后,我意识到曾经可以在 AppDelegate 中完成的事情现在应该在 ViewController 中完成,但它不起作用。任何人都对为什么这不起作用有任何建议?这是我的各种课程的样子:

视图控制器.m

#import "ViewController.h"
#import "GameScene.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Load the SKScene from 'GameScene.sks'
    GameScene *scene = (GameScene *)[SKScene nodeWithFileNamed:@"GameScene"];

    // Set the scale mode to scale to fit the window
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene
    [self.skView presentScene:scene];

    self.skView.showsFPS = YES;
    self.skView.showsNodeCount = YES;

    //added in hopes that mouse moved events would be captured
    [self.skView.window setAcceptsMouseMovedEvents:YES];
    [self.skView.window setInitialFirstResponder:self.skView];
}

@end
Run Code Online (Sandbox Code Playgroud)

GameScene.m

#import "GameScene.h"

@implementation GameScene

- (void)didMoveToView:(SKView *)view {

}

-(void) mouseMoved:(NSEvent *)event {
    NSLog(@"blah");
}

-(void)update:(CFTimeInterval)currentTime {
    // Called before each frame is rendered
}

@end
Run Code Online (Sandbox Code Playgroud)

Kni*_*gon 6

您将第一响应者设置为skView,您需要将其设置为,skView.scene以便鼠标响应您的场景实例,而不是您的视图实例。

第 1 步:将您的窗口代码移动到 viewDidAppear

第 2 步:使用将您的第一响应者更改为场景 [self.skView.window makeFirstResponder:self.skView.scene];

之所以需要在viewDidAppear活动中进行,是因为windowforSKViewnilviewDidLoad活动期间。如果您在 Swift 中完成此操作,您self.skView.window!.setsAcceptedMouseMovements = true将失败(Swift 是一种高级语言,我建议您使用它)

#import "ViewController.h"
#import "GameScene.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // Load the SKScene from 'GameScene.sks'
    GameScene *scene = (GameScene *)[SKScene nodeWithFileNamed:@"GameScene"];

    // Set the scale mode to scale to fit the window
    scene.scaleMode = SKSceneScaleModeAspectFill;

    // Present the scene
    [self.skView presentScene:scene];

    self.skView.showsFPS = YES;
    self.skView.showsNodeCount = YES;


}
- (void) viewDidAppear {
    //added in hopes that mouse moved events would be captured
    [self.skView.window setAcceptsMouseMovedEvents:YES];
    [self.skView.window setInitialFirstResponder:self.skView];
    [self.skView.window makeFirstResponder:self.skView.scene];
}
@end
Run Code Online (Sandbox Code Playgroud)