Corona SDK:在一个对象上具有单击和双击事件

时间:2014-05-03 02:02:43

标签: lua corona

当屏幕被轻敲不同的次数(仅一次和两次)时,我试图对物体施加不同的力量。

我不确定我做错了什么。这是代码:

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 == 2event.numTaps == 1,但无济于事。

问题是 TapDelay 拒绝等待第二次点击。

非常感谢任何和所有帮助

P.S。为了测试的目的,我将秒设置为2,但是一旦我发现这有效,我将把时间缩短到0.3或者其他什么

2 个答案:

答案 0 :(得分:0)

您使用的策略存在几个问题。首先,它不可扩展(超过两次点击)。但是好吧,也许你100%肯定你永远不需要超过2个水龙头。下一个问题是event.numTaps只能是1或2,但你的监听器测试&lt; 1!这永远不会发生。下一个问题是,当您点击两次时,至少在模拟器中(未在设备上测试),您会收到两个事件:一个用于第一次点击numTaps = 1,另一个用于第二次点按numTaps = 2 。换句话说,电晕引擎在发出单击事件之前不会等待,以了解在某个时间范围内是否发生第二次敲击事件。因此,您可以获得两次点击事件以进行两次点击事件,无法在处理程序中了解您是否应该等待&#34;等待&#34;查看是否可能在允许的延迟范围内发生另一次点击以构成&#34;双击&#34;事件而不是。

您需要做的是创建自己的N-tap事件生成器。无论何时发生敲击,请检查您的计时器是否已启动。如果是这样,请增加分接头数并重置定时器。如果没有,请启动稍后会暂停一段时间的计时器。如果在该延迟中没有其他点击,则您保存的计数是您的点击编号。如果计时器到期,请重置计数器。我创建了一些执行此操作的函数,并将它们全部放在一个表格中#34; object&#34;:

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的标志,如果你想打印单个分接头之间的ms延迟,那么你可以确定最佳延迟应该是什么(你不希望延迟太短或者你可能无意中断N点击两个较小的事件;你也不希望它太长,或者用户必须明显等待表示我的多重事件结束&#34;)。

答案 1 :(得分:-1)

点击事件必须添加到显示对象,而不是添加到运行时。

例如,如果您有显示对象跳线,请使用:

jumper:addEventListener("tap", moveUp)

此处有更多文档:http://docs.coronalabs.com/api/event/tap/index.html