Lua Corona SDK:在一个对象上具有单点击和双点击事件
当屏幕被敲击不同的次数(只有一次和两次)时,我试图对物体施加不同的力 我不确定我做错了什么。代码如下:Lua Corona SDK:在一个对象上具有单点击和双点击事件,lua,coronasdk,Lua,Coronasdk,当屏幕被敲击不同的次数(只有一次和两次)时,我试图对物体施加不同的力 我不确定我做错了什么。代码如下: 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,
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)
本地函数上移(事件)
如果event.numTaps>1,则
跳线:applyForce(0,250,跳线.x,跳线.y)
elseif event.numTaps<1然后
跳线:应用力(0,0,跳线.x,跳线.y)
其他的
跳线:applyForce(0,200,跳线.x,跳线.y)
终止
终止
--开始比赛
createPlayScreen()
系统设置延迟(2)
运行时:addEventListener(“点击”,向上移动)
我已经尝试将运行时:addEventListener
移动到函数中。我还尝试了使用event.numTaps==2
和event.numTaps==1
,但没有效果
问题是TapDelay拒绝等待第二次点击
非常感谢您的任何帮助
另外,出于测试目的,我将秒数设置为2,但一旦我发现这是可行的,我将把时间降低到0.3,或者一些点击事件必须添加到显示对象,而不是运行时 例如,如果有显示对象跳线,请使用:
jumper:addEventListener("tap", moveUp)
此处有更多文档:您使用的策略存在几个问题。首先,它是不可伸缩的(超过两个水龙头)。但好吧,也许你100%确定你永远不会需要超过2个水龙头。下一个问题是
event.numTaps
只能是1或2,但是您的侦听器测试<1!这永远不会发生。下一个问题是,当您轻触两次时,至少在模拟器(未在设备上测试)中会收到两个事件:第一次轻触时使用numTaps=1
,第二次轻触时使用numTaps=2
。换句话说,电晕引擎不会在发出一次抽头事件之前等待,以了解在某个时间范围内是否发生第二次抽头事件。因此,对于两次点击事件,您将获得两次点击事件,在处理程序中无法知道您是否应该“等待”以查看是否在允许的延迟内发生另一次点击,从而构成“两次点击”事件
您需要做的是创建自己的N-tap事件生成器。每次点击时,检查计时器是否已启动。如果是,增加抽头计数并重置计时器。如果没有,则启动计时器,该计时器将在短时间延迟后过期。如果在该延迟期间没有发生其他抽头,则保存的计数为抽头编号。如果计时器过期,请重置计数器。我已经创建了一些这样做的函数,并将它们全部放在一个表“object”中:
这可以无限制地捕获N-tap事件!!我已经包括了一个标志,如果你想打印单次点击之间的毫秒延迟,你可以设置为真,这样你就可以确定什么是最佳延迟(您不希望延迟太短,或者您可能会无意中将N分接分为两个较小的事件;您也不希望延迟太长,否则用户将不得不明显等待以指示“我的多任务处理结束”).单次事件在运行时有效,而双击在单独运行时有效……如果我有单次点击和定时触摸怎么办?这不是必需的。点击事件可以通过运行时在屏幕上的任何位置。
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)