触摸特定位置时不会发生手势 - SpriteKit

时间:2016-12-16 18:14:51

标签: ios swift sprite-kit

我使用touchesBegan为我的UIButtons提供功能,并使用轻敲手势为我的主播放器SKSpriteNode提供功能,使其在触发时跳转。

//关于UIButton touch的代码

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
  //touches began is only used for GUI buttons -> not to affect player

    for touch: AnyObject in touches {
        //We get location of the touch
        let locationOfTouch = touch.location(in: self)

        if muteButton.contains(locationOfTouch) {  //mute the game  
            timer.invalidate()
            audioPlayer.volume = 0
        }

//关于点击的代码

 let tap = UITapGestureRecognizer(target: self, action: #selector(GameScene.tapped(gesture:)))
    tap.cancelsTouchesInView = false

    self.view!.addGestureRecognizer(tap)

......

func tapped(gesture: UIGestureRecognizer) {  //used to make the player jump      
            player.physicsBody!.applyImpulse(CGVector(dx: 0, dy: 60))
            player.physicsBody!.affectedByGravity = true */

            }

我的问题是,当我按下restartButton时,轻触手势也会在触摸结束时激活。我有什么可以做的吗?

1 个答案:

答案 0 :(得分:2)

主要问题是用于检测触摸的两个独立系统(使用手势识别器和使用touchesBegan/Moved/Ended方法)存在冲突。

一种解决方案是,如果触摸位于其中一个按钮内,则启用和禁用手势识别器。

touchesBegan方法中,如果触摸位于按钮内,请禁用点击手势识别器:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    for touch: AnyObject in touches {
        let locationOfTouch = touch.location(in: self)
        if muteButton.contains(locationOfTouch) { 
            // mute action
            tap.isEnabled = false
        }
    }
}

然后在touchesEndedtouchesCancelled中,重新启用手势识别器:

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    tap.isEnabled = true
}

override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
    tap.isEnabled = true
}

这样,如果触摸在按钮内,则轻击手势识别器将不会触发。每当触摸完成时,我们总是重新启用手势识别器,以防下一次触摸是为了让玩家跳跃。

我在一个空项目中对此进行了测试,但它确实有效。

希望这有帮助!祝你的游戏好运。