当屏幕被点击不同次数(只有一次和两次)时,我试图对物体施加不同的力。
我不确定我做错了什么。下面是代码:
local function moveUp(event)
if event.numTaps > 1 then
jumper:applyForce( 0, 250, jumper.x, jumper.y )
elseif event.numTaps < 1 then
jumper:applyForce( 0, 0, jumper.x, jumper.y )
else
jumper:applyForce( 0, 200, jumper.x, jumper.y )
end
end
-- start game
createPlayScreen( )
system.setTapDelay( 2 )
Runtime:addEventListener("tap", moveUp)
我试过将Runtime:addEventListener
移动到函数中。我也试过有event.numTaps == 2
和event.numTaps == 1
,但无济于事。
问题是TapDelay拒绝等待第二次点击。
任何帮助都非常感谢
注:我将秒设置为2用于测试目的,但一旦我发现这有效,我会将时间降低到0.3或
您使用的策略有几个问题。首先,它是不可扩展的(超过两个点击)。但是,好吧,也许你100%确定你永远不需要超过2个水龙头。下一个问题是event.numTaps
只能是1或2,但您的侦听器测试了<1! 这绝不可能发生。下一个问题是,当你点击两次时,至少在模拟器中(没有在设备上测试),你会得到两个事件:一个用于numTaps = 1
的第一次点击,另一个用于numTaps = 2
的第二次点击。换句话说,Corona引擎在发出一次点击事件之前不会等待,以了解在某个时间范围内是否发生了第二次点击事件。因此,对于一个两次轻击事件,您将获得两个轻击事件,因此在处理程序中无法知道是否应该"等待",以查看另一个轻击是否可能在允许的延迟内发生,从而构成"两次轻击"事件。
你需要做的是创建你自己的N-tap事件生成器。每当出现轻击时,检查计时器是否已启动。如果是,增加抽头计数并重置计时器。如果没有,则启动计时器,该计时器稍后会在短时间内过期。如果在该延迟期间没有发生其他轻击,则保存的计数就是您的轻击数。如果计时器到期,则重置计数器。我已经创建了一些函数来做这件事,我把它们都放在一个表"object":
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次点击分成两个较小的事件;您也不希望它太长,否则用户将不得不明显地等待指示"我的多点点击结束")。
点击事件必须添加到显示对象中,而不是添加到运行时中。
如果你有一个显示对象跳线,例如,使用:
jumper:addEventListener("tap", moveUp)
更多文档在这里:http://docs.coronalabs.com/api/event/tap/index.html