您使用的策略存在几个问题。一方面,它是不可扩展的(超过两个水龙头)。但是好吧,也许你 100% 确定你永远不需要超过 2 个水龙头。下一个问题是 event.numTaps 只能是 1 或 2,但您的侦听器测试 numTaps = 1,另一个是第二次点击numTaps = 2。换句话说,Corona 引擎在发出一次点击事件之前不会等待,以了解在某个时间范围内是否发生了第二次点击事件。因此,对于两次点击事件,您会获得两次点击事件,在处理程序中无法知道您是否应该“等待”以查看是否可能在允许的延迟内发生另一次点击以构成“两次点击”事件。
您需要做的是创建自己的 N-tap 事件生成器。每当点击时,检查您的计时器是否已启动。如果是这样,请增加点击次数并重置计时器。如果没有,则启动计时器,该计时器稍后会经过一些短暂的延迟。如果在该延迟中没有发生其他点击,则您保存的计数就是您的点击数。如果您的计时器到期,请重置计数器。我创建了一些执行此操作的函数,并将它们全部放在一个表“对象”中:
local tapEvents = {
measureInterTapTime = false, -- set to true to measure how fast you can tap!
onTapHandler = nil, -- set this to your handler
-- implementation details
tapTimer = nil,
tapCounter = 0,
tapEventTime = 0,
doneTap = function(self, event)
self.tapTimer = nil
if self.onTapHandler then
self.onTapHandler(self.tapCounter)
end
self.tapCounter = 0
self.tapEventTime = 0
end,
-- end implementation details
tap = function(self, event)
self.tapCounter = self.tapCounter + 1
if self.tapTimer ~= nil then
timer.cancel(self.tapTimer)
self.tapTimer = nil
end
local delayMS = 250
self.tapTimer = timer.performWithDelay(delayMS, function(e) self:doneTap(e) end, 1)
-- check how much time between taps, for interest:
if self.measureInterTapTime then
if self.tapEventTime ~= 0 then
local interTapTime = system.getTimer() - self.tapEventTime
print("Time (ms) between taps:", interTapTime)
end
self.tapEventTime = system.getTimer()
end
end,
}
tapEvents.onTapHandler = function(tapCounter)
print(tapCounter .. "-tap event")
end
-- because tapEvents contains a 'tap' function, will get called automatically with self:
Runtime:addEventListener('tap', tapEvents)
这可以无限制地捕获 N-tap 事件!!我已经包含了一个标志,如果您想打印出单击之间的毫秒延迟,您可以设置为 true,这样您就可以确定最佳延迟应该是多少(您不希望延迟太短,否则您可能会无意中破坏 N点击两个较小的事件;您也不希望它太长,否则用户将不得不明显地等待指示“我的多次点击结束”)。