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



当屏幕被点击不同次数(只有一次和两次)时,我试图对物体施加不同的力。

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

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拒绝等待第二次点击。

任何帮助都非常感谢

注:我将秒设置为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

最新更新