WatchOS 3 SpriteKit中的TouchEvents?

时间:2016-07-01 04:39:28

标签: sprite-kit watchkit watch-os-3

在watchOS 3中使用SpriteKit时,如何处理触摸事件?我正在从iOS移植SpriteKit游戏,下面的代码不会起作用。或者你必须以某种方式控制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 个答案:

答案 0 :(得分:4)

在对同样的问题感到非常沮丧之后,我结束了使用手势识别器,并从那里计算位置。

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

虽然有一个提示:我在创建处理手势识别器的方法时发现的一个奇怪的错误是手势默认不会传递给方法。我必须按住Ctrl +拖动来创建方法,然后修改签名以包含手势。如果我使用签名中的手势创建方法,Xcode将不允许我将手势识别器附加到其中。

似乎有更好的方法来检测触摸,但这是我现在找到的解决方法。

答案 1 :(得分:0)

要接近触地事件,请使用超短持续时间(0.001)的WKLongPressGestureRecognizer。连接到此识别器的IBAction将立即触发事件。该位置位于识别器的locationInObject属性中。如果目标是获得移动触摸,那么使用平移识别器。

property settings in Interface Builder

答案 2 :(得分: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是场景中的触摸坐标。