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

任何帮助都将不胜感激

P.S. 我将更改时间到0.3之类的值,但现在是为测试目的将其设为2

点赞
用户2895078
用户2895078

Tap事件必须添加到显示对象而不是运行时环境。

如果您有一个名为jumper的显示对象,请使用以下代码:

jumper:addEventListener("tap", moveUp)

更多文档可以参考这里:http://docs.coronalabs.com/api/event/tap/index.html

2014-05-03 12:39:48
用户869951
用户869951

在您正在使用的策略中存在几个问题。首先,它不具备可扩展性(到超过两个触点)。但是好吧,也许您百分之百确定您永远不需要超过2个触点。下一个问题是,event.numTaps只能是1或2,但是您的监听器测试<1!这永远不会发生。下一个问题是,当您轻拍两次时,至少在模拟器中(未在设备上测试)会获得两个事件:一个为numTaps = 1的第一次轻拍,另一个为numTaps = 2的第二次轻拍。换句话说,Corona引擎在发出单击事件之前不会等待,以知道是否在某个时间范围内发生第二个轻拍事件。因此,对于一个两次轻拍事件,您将获得两个轻拍事件,处理程序中没有办法知道是否应该“等待”以查看是否可以在允许的延迟内发生另一个轻拍以构成“两次轻拍”事件。

您需要做的是创建自己的N次轻拍事件生成器。每当轻拍发生时,请检查您的计时器是否已启动。如果是,则增加轻拍计数并重置计时器。如果没有,则启动在短暂延迟后到期的计时器。如果在该延迟期间没有其他轻拍发生,则保存的计数是您的轻拍次数。如果计时器到期,则重置计数器。我已经创建了一些执行此操作的函数,并将它们都放入一个表格“对象”中:

local tapEvents = {
    measureInterTapTime = false,--设置为true以测量您可以轻点的速度!
    onTapHandler = nil,--将其设置为您的处理程序

    --实现细节

    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)

        --检查两次轻拍之间的时间,以了解兴趣:
        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事件”)
end

--由于tapEvents包含'tap'函数,因此将自动使用self进行调用:
Runtime:addEventListener('tap',tapEvents)

这样就可以无限制地捕获N次轻拍事件了!如果您想要打印出单击之间的毫秒延迟以确定最佳延迟时间(您不希望延迟太短,否则可能会无意中将N次轻拍分成两个较小的事件;您也不希望太长,因为用户必须明显等待以表示“我的多次轻拍已经结束”),则我已经包括了一个可以设置为true的标志。

2014-05-04 03:55:47