【问题标题】:Corona SDK: Having Single and Double Tap Events on One ObjectCorona SDK:在一个对象上具有单击和双击事件
【发布时间】:2014-05-04 12:35:18
【问题描述】:

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

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

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 或其他值

【问题讨论】:

    标签: lua coronasdk


    【解决方案1】:

    您使用的策略存在几个问题。一方面,它是不可扩展的(超过两个水龙头)。但是好吧,也许你 100% 确定你永远不需要超过 2 个水龙头。下一个问题是 event.numTaps 只能是 1 或 2,但您的侦听器测试 numTaps = 1,另一个是第二次点击numTaps = 2。换句话说,Corona 引擎在发出一次点击事件之前不会等待,以了解在某个时间范围内是否发生了第二次点击事件。因此,对于两次点击事件,您会获得两次点击事件,在处理程序中无法知道您是否应该“等待”以查看是否可能在允许的延迟内发生另一次点击以构成“两次点击”事件。

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

    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点击两个较小的事件;您也不希望它太长,否则用户将不得不明显地等待指示“我的多次点击结束”)。

    【讨论】:

      【解决方案2】:

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

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

      jumper:addEventListener("tap", moveUp)
      

      更多文档在这里:http://docs.coronalabs.com/api/event/tap/index.html

      【讨论】:

      • 嗯,单个事件在运行时有效,而双击则在单独运行时有效……如果我有一个点击和定时触摸呢?
      • 这不是必需的。点击事件可以通过运行时出现在屏幕上的任何位置。
      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 2019-07-06
      • 2012-10-28
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 2020-12-09
      相关资源
      最近更新 更多