我正在运行一个非常简单的代码,我试图检测长按结束的时间,然后执行一个函数,但是我似乎不知道该怎么做。我在网上查看了很多资源,但无法弄清楚。我对使用Swift进行编码非常陌生,因此,如果答案很简单,我会提前道歉。这是所有代码:

import SpriteKit

class GameScene: SKScene {

    let char = SKSpriteNode(imageNamed: "flying character")

    override func didMove(to view: SKView) {
        setScene()
    }

    @objc func press() {
        physicsWorld.gravity = CGVector(dx: 0.1, dy: 1.5)
        if UILongPressGestureRecognizer.State.changed == .ended {
            print ("the gesture has ended")
        }
    }

    func setScene() {
        backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 221/255, alpha: 1.0)
        char.size = CGSize(width: frame.size.width/5, height: frame.size.width/5)
        char.run(SKAction.rotate(byAngle: .pi*11/6, duration: 0.00001))
        char.position = CGPoint(x: frame.midX - 100, y: frame.midY + 150)
        addChild(char)
        char.physicsBody = SKPhysicsBody(circleOfRadius: char.size.width/2)
        char.physicsBody?.categoryBitMask = PhysicsCategories.charCategory
        physicsWorld.gravity = CGVector(dx: 0.1, dy: -1.5)
        char.physicsBody?.affectedByGravity = true
        view?.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(press)))
    }
}


如您所见,长按结束后,我只是试图执行打印命令。

最佳答案

首先,您可能会注意到的一个非常重要的事情是您的问题与SpriteKit本身无关!您正在使用UIL的类UILongPressGestureRecognizer!
Apple Docs

另外,请注意,您正在将手势应用于整个视图。当我假设这是一款角色飞行的游戏时,我可以想象这种行为是预期的。

我认为您面临的问题是您没有使用分配给视图的UILongPressGestureRecognizer!相反,您正在访问UILongPressGestureRecognizer类的属性/方法。有关更多详细信息,您可以浏览this section of the Swift documentation



快速解决问题的方法是将印刷机功能从

@objc func press() {
    physicsWorld.gravity = CGVector(dx: 0.1, dy: 1.5)
    if UILongPressGestureRecognizer.State.changed == .ended {
        print ("the gesture has ended")
    }
}




@objc func press(_ gestureRecognizer: UILongPressGestureRecognizer) {
    physicsWorld.gravity = CGVector(dx: 0.1, dy: 1.5)
    if gestureRecognizer.state == .ended {
        print ("the gesture has ended")
    }
}


和您的setScene函数

view?.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(press)))




view?.addGestureRecognizer(UILongPressGestureRecognizer(target: self, action: #selector(press:)))


More information here



SpriteKit以非常原始的方式处理触摸事件,但是它可能使您对如何响应这些事件有更多的控制。正如KnightOfDragon所说,这就像重新发明轮子一样。

如果您想了解SpriteKit的工作方式,see this example.它很短,但希望对您有所帮助:)

09-19 15:35