Lua 语法下的 knife.timer - 行为不符预期
2020-8-25 6:11:59
收藏:0
阅读:149
评论:2
如果你熟悉 Lua 中的 knife.timer,请查看我的代码并告诉我我有哪些地方错了吧。
我希望做到以下两点:
- 拥有一个每秒倒计时的倒计时器,以及
- 在六秒后开始闪烁我的角色三秒钟,然后改变他们的状态。
使用下面的代码,我的倒计时器从 9 开始,但一直到负数十几。我的角色在经过约 4 秒后开始闪烁,改变状态后还会继续闪烁几秒钟。
我在主函数中使用了 Timer:update(dt),所以不确定时间是否有误。而且我认为完成时并不会在角色的 16 次闪烁完成之前调用 change state 函数。
function PlayerPilotState:update(dt)
self.player.currentAnimation:update(dt)
Timer.every(1, function()
self.timer = self.timer - 1
end)
Timer.after(6, function()
Timer.every(0.2, function()
self.player.blinking = not self.player.blinking
self.player.otherPlayer.blinking = not self.player.otherPlayer.blinking
end):finish(function()
self.player:changeState('falling')
self.player.otherPlayer:changeState('falling')
end):limit(16)
end)
end
谢谢!
点赞
用户13850885
上述两个评论都非常有用。原来在更新下放置定时器是个坏主意,因为它们要么调用新的定时器,要么刷新得奇怪。我最终得到的并且完美工作的代码是:
function PlayerPilotState:enter(params)
Timer.every(1, function()
self.timer = self.timer - 1
end)
Timer.after(6, function()
Timer.every(0.2, function()
self.player.blinking = not self.player.blinking
self.player.otherPlayer.blinking = not self.player.otherPlayer.blinking
end)
:limit(15)
:finish(function()
self.player.blinking = false
self.player.otherPlayer.blinking = false
self.player:changeState('falling')
self.player.otherPlayer:changeState('falling')
end)
end)
end
接下来的一个问题是,如何在不使用“进入”函数的情况下执行此操作?我猜任何只调用一次的函数调用(也许带一个布尔标志来调用它)都可以。谢谢!
2020-08-25 22:06:14
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的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 代码?

在基础倒计时器中,你从未指定它何时停止。尝试使用
:limit(9)或者self.timer = math.max(0,self.timer - 1)你是否正确计时了(感受时间流逝很困难),因为你使用了
Timer.after。finish()函数在after()和every()后发生,这可能会导致奇怪的事情发生。建议在finish()之前添加limit。Timer.after(6, function() Timer.every(0.2, function() self.player.blinking = not self.player.blinking self.player.otherPlayer.blinking = not self.player.otherPlayer.blinking end):limit(16):finish(function() self.player:changeState('falling') self.player.otherPlayer:changeState('falling') end) end)