下面,我已经实现了测试以了解可触摸精灵的触摸计数行为(sprite.isUserInteractionEnabled = true
)
当我办理登机手续时:
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
for touch: AnyObject in touches {
print("touched sprite = name:'WalkBoyTouchSprite'", "tapCount=", touch.tapCount, NSDate())
}
}
以下是我的一些触摸结果:
当我经常触摸时,它只会增加触摸次数:
触及sprite = name:'WalkBoyTouchSprite'tampCount = 1 2016-09-12 13:11:50 +0000
performSingleTapActions
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 2 2016-09-12 13:11:51 +0000
performDoubleTapActions
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 3 2016-09-12 13:11:51 +0000
performTrippleTapActions
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 4 2016-09-12 13:11:51 +0000
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 5 2016-09-12 13:11:51 +0000
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 6 2016-09-12 13:11:52 +0000
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 7 2016-09-12 13:11:52 +0000
然后,当我暂停一段时间后,它再次从1开始计数,检查休息时间。
触及sprite = name:'WalkBoyTouchSprite'tampCount = 1 2016-09-12 13:11:53 +0000
performSingleTapActions
触及sprite = name:'WalkBoyTouchSprite'tampCount = 1 2016-09-12 13:12:16 +0000
performSingleTapActions
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 2 2016-09-12 13:12:17 +0000
performDoubleTapActions
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 3 2016-09-12 13:12:17 +0000
performTrippleTapActions
触及sprite = name:'WalkBoyTouchSprite'tampCount = 1 2016-09-12 13:12:18 +0000
performSingleTapActions
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 1 2016-09-12 13:12:20 +0000
performSingleTapActions
触及sprite = name:'WalkBoyTouchSprite'tampCount = 1 2016-09-12 13:12:21 +0000
performSingleTapActions
触摸sprite = name:'WalkBoyTouchSprite'tampCount = 2 2016-09-12 13:12:21 +0000
performDoubleTapActions
我需要实现一个动作一旦它被点击一次,另一个在2点击的情况下(如你在测试日志中看到的那样)。但问题是它按顺序调用。这意味着如果我在相应的触摸计数上应用Action1,Action2和Action3,则所有3将被激活。
区分单点触控和多点触控的智能方法是什么?就像我可以得到确切的所需暂停时间(之后它从1开始计数),或其他更好的东西。
答案 0 :(得分:1)
UITouch
包含tapCount
以及timestamp
。为了做你想做的事,你需要为挖掘定义一套清晰的规则。这定义了您支持的分接头数量以及分接头的可接受持续时间和截止频率。其中一些需要玩游戏来调整最佳时间值。
根据您的规则,您可以制作状态机来管理触发游戏事件的内容(例如,这是一次点击事件)。关键部分是能够&#34;冲洗&#34;一旦您确定事件已经发生,任何来自其他触摸的噪音。
让我们从1触摸事件开始。为此,您需要在分接头之间定义一些dt(增量时间),这构成了dt超越而没有另一个分接头,它将被视为仅1次分接。因此,即使您根据点击获得更多触摸事件,一旦dt阈值通过,您将忽略它们。
为了做到这一点,你需要定期运行额外的逻辑(通常是帧速率)跟踪过去的输入(即你正在跟踪输入的历史记录)。例如,逻辑可能类似于:
if (now - lastGoodTap.timestamp) > THRESHOLD) {
// Do my one tap goodness
}
您真的希望在两个位置运行:跟踪输入历史记录的周期性输入逻辑和处理touchesEnded
事件的输入逻辑(检查是否lastGoodTap
和当前时间戳已超过阈值,以便分类,如果它是1点击或现在2)。在touchesEnded
中,如果您收到下一个tapCount
(即tapCount == 2
)并且尚未达到阈值,则现在将此事件归类为2抽头方案。
执行2和3次点击是1点击案例的扩展。对于有特殊动作或多次击打的游戏,您实际上需要跟踪输入状态。我通常支持特殊动作以及调试之类的秘密输入。通常我会创建另一个类来跟踪此历史状态。它引用UITouch
,但复制timestamp
以及跟踪它认为当前的点按数是多少。
请记住,您将使用UITouch
实例作为输入流的键/引用,因为这会让您知道您正在查看相同的触摸。如果你是多点触控,这很重要。
此外,您需要处理不间断多次敲击的情况,以确保您做正确的事情(例如,您可以随时丢弃带有tapCount&gt; 3的UITouch。)
对此进行建模的一种简单方法是使用空项目并使用NSLog
来帮助观看事件和状态。
答案 1 :(得分:1)
我找到了解决方案或者说Hack。我给它一些时间来点击。这一次从用户的第一次点击开始,到 X 秒后结束。在这段时间内注册的所有水龙头都将是我将要娱乐的水龙头数量。
这样的事情:
var touchCount = 0
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
//to implement multiple touch
if self.touchCount == 0 {
self.delay(1.0, closure: {
//self.delegate?.touched(self, touches: touches, with : event)
self.touchingFinished()
})
}
//increment touch count
self.touchCount += 1
}
func touchingFinished() {
print("tapping finished, count = ", touchCount)
switch self.touchCount {
case 1://do one thing
case 2://do other thing
default://do somethign
break;
}
//touch task done now re initialize touchCount
self.touchCount = 0
}
在您启动任务序列后,不要忘记禁用userInteraction
。