我使用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时,轻触手势也会在触摸结束时激活。我有什么可以做的吗?
答案 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
}
}
}
然后在touchesEnded
和touchesCancelled
中,重新启用手势识别器:
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
tap.isEnabled = true
}
override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
tap.isEnabled = true
}
这样,如果触摸在按钮内,则轻击手势识别器将不会触发。每当触摸完成时,我们总是重新启用手势识别器,以防下一次触摸是为了让玩家跳跃。
我在一个空项目中对此进行了测试,但它确实有效。
希望这有帮助!祝你的游戏好运。