快速游戏 - 点按并点按+保持手势?

时间:2015-12-16 14:27:28

标签: swift cocoa-touch sprite-kit uigesturerecognizer

我正在学习swift(和spritekit)并尝试制作一个简单的游戏。

在我的游戏中,英雄应该跳跃或躲避......

英雄需要在点击屏幕时跳转,或者如果屏幕点击+保持则跳跃(long gesture

基本的伪代码:

if tapped
    heroJump()
else if tappedAndHeld
    heroDuck()

我有一个func几乎在所有处理触摸事件的教程中都可以看到:

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

for touch in touches {
let location = touch.locationInNode(self) //need location of tap for something

    switch gameState {
        case .Play:
            //do in game stuff

            break
        case .GameOver:
            //opps game ended

            }
            break
    } 
 }
   super.touchesBegan(touches, withEvent: event)
}

是否有一种方法,包括在此触摸事件中,以决定是否被轻拍或举行?我似乎无法理解这个事实,程序总会在长时间的手势之前识别出一个水龙头?!

无论如何,为了解决我的问题,我找到了THIS问题,这个问题向我介绍了我尝试实施的识别器:

override func didMoveToView(view: SKView) {
    // other stuff

    //add long press gesture, set to start after 0.2 seconds
    let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "longPressed:")
    longPressRecognizer.minimumPressDuration = 0.2
    self.view!.addGestureRecognizer(longPressRecognizer)

    //add tap gesture
    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapped:")
    self.view!.addGestureRecognizer(tapGestureRecognizer)
}

这些是手势所称的功能:

func longPressed(sender: UILongPressGestureRecognizer)
{
    if (sender.state == UIGestureRecognizerState.Ended) {
        print("no longer pressing...")
    } else if (sender.state == UIGestureRecognizerState.Began) {
        print("started pressing")
        // heroDuck()
    }
}

func tapped(sender: UITapGestureRecognizer)
{
    print("tapped")
    // heroJump()
}

我如何结合这两件事? 我可以添加一种方法来确定是否在我的touchBegins事件中点击或保留它,还是可以废弃该方法并仅使用上述两个函数?

使用后者获取位置的许多问题之一?

或者我可能正在看这个完全错误,并且在swift / spritekit中有一个简单的和/或内置的方式?

感谢。

2 个答案:

答案 0 :(得分:3)

您只需要UITapGestureRecognizerUILongPressRecognizer。您无需对touchesBegantouchesEnded执行任何操作,因为手势识别器会分析触摸本身。

要获取触摸的位置,您可以在手势识别器上调用locationInView以获取手势的位置,或locationOfTouch如果您正在使用多点触控手势并需要每次触摸的位置。如果需要窗口基本坐标系中的坐标,请将nil作为参数。

这是一个有效的例子:

func setupRecognizers() {
     let tapRecognizer = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
     let longTapRecognizer = UILongPressGestureRecognizer(target: self, action: Selector("handleLongPress:"))
     view.addGestureRecognizer(tapRecognizer)
     view.addGestureRecognizer(longTapRecognizer)
}

func handleLongPress(recognizer: UIGestureRecognizer) {
    if recognizer.state == .Began {
        print("Duck! (location: \(recognizer.locationInView(nil))")
    }
}

func handleTap(recognizer: UIGestureRecognizer) {
    print("Jump! (location: \(recognizer.locationInView(nil))")
}

如果识别出长按handleTap:,则点击。只有当用户快速抬起手指时,才会调用handleTap:。否则将调用handleLongPresshandleLongPress只会在长按持续时间过后才会被调用。然后handleLongPress将被调用两次:当持续时间已经过去(“开始”)并且在用户抬起他的手指(“结束”)之后。

答案 1 :(得分:0)

你做同样的事情,你正在为longpress做同样的事情,等到.Ended事件

func tapped(sender: UITapGestureRecognizer)
{

    if sender.state == .Ended {
      print("tapped")
    }
}

点击事件总是会发生,这是无法阻止的,因为让我们面对它,你需要触摸屏幕。应该发生的事情是当你进入长按事件时,点击事件应该进入取消状态而不是结束状态