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 == 2 和 event.numTaps == 1,但是都没有用。
问题在于 TapDelay 拒绝等待第二次点击。
任何帮助都将不胜感激
P.S. 我将更改时间到0.3之类的值,但现在是为测试目的将其设为2
在您正在使用的策略中存在几个问题。首先,它不具备可扩展性(到超过两个触点)。但是好吧,也许您百分之百确定您永远不需要超过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的标志。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
Tap事件必须添加到显示对象而不是运行时环境。
如果您有一个名为
jumper的显示对象,请使用以下代码:jumper:addEventListener("tap", moveUp)更多文档可以参考这里:http://docs.coronalabs.com/api/event/tap/index.html