如何防止在touchesBegan方法中出现双击时调用一次单击

Its*_*ain 5 ios sprite-kit swift swift3

我已经实现了单点和双击。但是,每当我双击屏幕时,也会运行一次点击代码。请参见下面的代码:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first as UITouch!
    let touchLocation = touch?.location(in: self) 
    let touchedNode = self.atPoint(touchLocation!)

if touch?.tapCount == 1 {
        print("single tap")
        if let name = touchedNode.name        {
            if name == "enemySprite"
            {
                //handle single Tap
             }
         }
    }

if touch?.tapCount == 2 {
        print("double tap")
        if let name = touchedNode.name        {
            if name == "enemySprite"
            {
                //handle double Tap
             }
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何使每个水龙头计数互斥?

更新

根据Apurv的回答和Whirlwind的评论,我认为以下代码可以正常工作。

 override func didMove(to view: SKView) {

    var tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.view.sampleTapGestureTapped(recognizerMethod:)))
    self.view.addGestureRecognizer(tapGesture!)
    tapGesture.numberOfTapsRequired = 1;

    var tapGestureDouble = UITapGestureRecognizer(target: self, action: #selector(self.view.sampleTapGestureTapped(recognizerMethod2:)))
    self.view.addGestureRecognizer(tapGestureDouble!)
    tapGestureDouble.numberOfTapsRequired = 2;

    [tapGesture requireGestureRecognizerToFail : tapGestureDouble];

}
Run Code Online (Sandbox Code Playgroud)

它不起作用,并且我收到错误消息,

Value of type ’SKView?’ has no member ‘sampleTapGestureTapped(recognizerMethod:)’ and 
Value of type ’SKView?’ has no member ‘sampleTapGestureTapped(recognizerMethod2:)’
Run Code Online (Sandbox Code Playgroud)

指向轻击手势变量的声明

另外,我得到了错误

Expected expression in the container literal 
Run Code Online (Sandbox Code Playgroud)

指向上述方法的最后一行。

我想我现在这里缺少一些东西,对此我将不胜感激。

Whi*_*ind 4

您不必访问 ViewController ...您可以处理场景内的点击,如下所示:

import SpriteKit

class GameScene: SKScene {

    var recognizers:[UIGestureRecognizer] = []

    override func didMove(to view: SKView) {

        // Get label node from scene and store it for use later


        let single = UITapGestureRecognizer(target: self, action: #selector(GameScene.singleTapHandler(recognizer:)))
        view.addGestureRecognizer(single)
        single.numberOfTapsRequired = 1
        recognizers.append(single)

        let double = UITapGestureRecognizer(target: self, action: #selector(GameScene.doubleTapHandler(recognizer:)))
        view.addGestureRecognizer(double)
        double.numberOfTapsRequired = 2
        recognizers.append(double)

        single.require(toFail: double)

    }

    override func willMove(from view: SKView) {
        super.willMove(from: view)

        for recognizer in recognizers {
            self.view?.removeGestureRecognizer(recognizer)
        }
        recognizers.removeAll()
    }

    func singleTapHandler(recognizer:UITapGestureRecognizer){

        print("Single tap detected")
    }

    func doubleTapHandler(recognizer:UITapGestureRecognizer){
        print("Double tap detected")
    }

}
Run Code Online (Sandbox Code Playgroud)

当然,ViewController可以通过几种方式来调用某些方法(例如委托)...不过,根据您的评论,我认为处理当前场景内的点击是您想要实现的目标。

编辑:

要回答您评论中的问题...您可以通过查找视图中的触摸位置,将其转​​换为场景中的位置,然后抓取该位置的节点来抓取触摸的节点

func singleTapHandler(recognizer:UITapGestureRecognizer){

        print("Single tap detected")

        let locationInView = recognizer.location(in: self.view)

        let locationInScene = self.convertPoint(fromView: locationInView)

        print(locationInScene)

       let node = atPoint(locationInScene)

        if let nodeName = node.name {
            //do stuff
        }

        //or

        if let sprite = node as? SKSpriteNode {
            // node is an SKSpriteNode
        }
    }
Run Code Online (Sandbox Code Playgroud)