我正在学习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中有一个简单的和/或内置的方式?
感谢。
答案 0 :(得分:3)
您只需要UITapGestureRecognizer
和UILongPressRecognizer
。您无需对touchesBegan
和touchesEnded
执行任何操作,因为手势识别器会分析触摸本身。
要获取触摸的位置,您可以在手势识别器上调用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:
。否则将调用handleLongPress
。 handleLongPress
只会在长按持续时间过后才会被调用。然后handleLongPress
将被调用两次:当持续时间已经过去(“开始”)并且在用户抬起他的手指(“结束”)之后。
答案 1 :(得分:0)
你做同样的事情,你正在为longpress做同样的事情,等到.Ended
事件
func tapped(sender: UITapGestureRecognizer)
{
if sender.state == .Ended {
print("tapped")
}
}
点击事件总是会发生,这是无法阻止的,因为让我们面对它,你需要触摸屏幕。应该发生的事情是当你进入长按事件时,点击事件应该进入取消状态而不是结束状态