我正在运行一个非常简单的代码,我试图检测长按结束的时间,然后执行一个函数,但是我似乎不知道该怎么做。我在网上查看了很多资源,但无法弄清楚。我对使用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.它很短,但希望对您有所帮助:)