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)