检测何时在 SKScene 中触摸按钮?

Detecting when a button is touched in SKScene?

我创建了一个故事板并添加了一个带有两个按钮的场景。我不知道如何知道 GameScene.swift class.

上的按钮何时被按下

如何做到这一点?

你可以touchesBegan

下面是适合您的示例代码:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {

    for touch: AnyObject in touches{
        let location = touch.locationInNode(self)
        if self.nodeAtPoint(location) == self.playButton{

              //your code
        }
    }
}

您应该以编程方式而不是在 IB 中将 UIButton 添加到 SKSceneSKView(例如在 didMoveToView 中)。然后,您可以使用 button.addTarget:action:forControlEvents: 设置按钮的目标。请记住在 willMoveFromView 中调用 button.removeFromSuperview() 否则您将在下一个场景中看到按钮。

您似乎在此处混合了 UIKit 和 SpriteKit。我个人建议不要将 UIButtons 与 Sprite Kit 结合使用。这样做有特定的原因吗?

有两种方法可以在 Sprite Kit 场景中实现按钮行为:

  1. 让 SKScene 对象处理触摸
  2. 让按钮本身处理触摸

Dharmesh 的回答使用方法 (1),他在其中实现了 -touchesBegan 方法。 在我当前的项目中,我使用 SKNode 子类作为按钮 (2)。我不熟悉 Swift 语法,所以我从我的项目中发布了 Objective-C 代码。方法调用虽然相似,应该有助于说明这一点。

如果你想让一个SKNode接收触摸,将userInteractionEnabled设置为YES否则,与userInteractionEnabled = YES最近的祖先(通常是包含 SKScene 的)将收到 -touchesBegan/-touchesMoved/-touchesEnded 消息。

@interface VTObject : SKNode

@end

...

@implementation VTObject

- (instancetype)init {     
  if (self = [super init]) {
    self.userInteractionEnabled = YES;
  }

  return self;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {    
  NSLog(@"button touched!");
}

@end