【问题标题】:SpriteKit MouseMoved Not WorkingSpriteKit 鼠标移动不工作
【发布时间】:2017-07-15 11:10:00
【问题描述】:

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

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

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

【问题讨论】:

  • 几周前你不是问过同样的问题吗?
  • 是的。我完全忘记了这一点。无论哪种方式,没有人发布答案。我将删除旧问题。
  • 如果您有兴趣,我可以向您展示如何在 Swift 中进行操作。我记得你的老话题,因为我在 Swift 中发布了代码,然后在意识到你想要它在 Objective-C 中之后删除了它。我认为,无论你是用 Objective-C 还是 Swift 编写,这个概念都是一样的。
  • 是的,那太好了。我可以将 Swift 翻译成 Objective-C。

标签: objective-c macos sprite-kit mouseevent


【解决方案1】:

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

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

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

之所以需要在viewDidAppear 事件中这样做是因为window for SKViewviewDidLoad 事件期间是nil。如果您在 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

【讨论】:

  • 这样的? [self.skView.window makeFirstResponder:self.skView.scene]; 不行。顺便说一句,我是在 ViewController.m 中写的。
  • 不要在加载事件中做你的窗口代码,在viewDidAppear事件中做
  • 你的SKView窗口在加载时不是根视图控制器的窗口,视图出现后,你就知道你的窗口在根视图控制器上,因为你可以看到它跨度>
  • 好的。我明白。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多