watchOS 3中的SpriteKit TouchEvents?

5

在watchOS 3中使用SpriteKit时,如何处理触摸事件?我正在将SpriteKit游戏从iOS移植过来,下面的代码不起作用。或者你必须以某种方式控制WKInterfaceController?

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)  {}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)  {}
3个回答

8

由于同样的问题困扰了我很长时间,最终我使用手势识别器并从那里计算位置。

@IBAction func handleSingleTap(tapGesture: WKTapGestureRecognizer) {
    let location = tapGesture.locationInObject()
    if yourSpriteNodeRect.contains(location) {
        //do stuff
    }
}

不过有一个小提示:在创建处理手势识别器的方法时,我发现一个奇怪的错误是默认情况下手势并没有被传递到方法中。我必须使用ctrl + 拖拽来创建方法,然后修改签名以包含手势。如果我在签名中创建了带有手势的方法,Xcode将不允许我将手势识别器附加到它上面。

看起来应该有更好的方法来检测触摸,但这是我目前找到的解决方法。


你可以通过修改签名来实现你所做的事情,或者你可以保留它并添加一个守卫语句:@IBAction func panRecognized(_ sender: AnyObject) { guard let panGesture = sender as? WKPanGestureRecognizer else { return } - Ben Morrow
真的,但是文档(https://developer.apple.com/reference/watchkit/wkgesturerecognizer)允许两种类型的签名。guard语句应该是必要的。IBAction func handleGesture() / IBAction func handleGesture(gestureRecognizer : WKGestureRecognizer) - LMVogel
识别器在触摸时添加延迟非常令人恼火。这取决于游戏类型。 - matthiaswitt

0
使用持续时间超短的WKLongPressGestureRecognizer(0.001)可以获得接近于touch down事件的内容。与此识别器连接的IBAction将立即获得touch down事件。定位信息在recognizer的locationInObject属性中找到。如果目标是获取移动触摸,则使用pan recognizer。

property settings in Interface Builder


它也适用于持续时间和运动为0的情况。 - Tamás Sengel

0
所以我首先在手表故事板中挂接了一个手势识别器。创建了一个IBAction,然后调用了一个方法来传递gesture.locationInObject()到SpriteKit场景中。然后在场景方法中进行转换,下面是一些代码。
let screenBounds = WKInterfaceDevice.current().screenBounds
let newX = ((location.x / screenBounds.width) * self.size.width) - (self.size.width / 2)
let newY = -(((location.y / screenBounds.height) * self.size.height) - (self.size.height / 2))

newX和newY是场景中的触摸坐标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接