Love2D旋转图像,在特定时间内旋转到达一个角度。
我正在制作一个小游戏。这是一个2D游戏,主要的特点是可以改变重力方向。我已经成功地改变了方向,所以现在玩家“掉落”到重力方向。但现在我想让玩家在2秒内“稳定下来”。我实现了基本的旋转,但那会立即改变玩家的角度,而我想要将步骤“切片”成更小的部分,以便旋转会“更加平滑”。比如,我想在从180°变为0°时进行小的步骤计算,与我输入的一个数字相比,这将是“持续时间”。
我不太熟悉弧度,所以无法使用它。
重力方向可以使用world.gravitydir变量进行设置,它可以是1,2,3,4。1是正常的重力“向下”,2,4是“左”和“右”,3是“上” 我还有一些“开发命令”可以使用箭头键手动更改重力方向
这是我的一次尝试,平滑地将玩家从倒置旋转到正常。
function rotatePlayer(dt)
deg1 = player.rot -- player's current rotation
step = 0
deg2 = math.rad(0) -- desired rotation
step = (math.deg(deg1) - math.deg(deg2))*dt
for i = deg1, deg2 do
player.rot = player.rot - math.rad(step)
step = step - dt
end
end
playerrotation函数在gravity.lua中,dev控制器和玩家绘图函数在player.lua中。
来源:http://www.mediafire.com/download/3xto995yz638n0n/notitle.love
我注意到你的代码有几个问题。
deg2 = math.rad(0) -- desired rotation
0 弧度相当于 0 度,因此 deg2 似乎始终为零,因此
for i = deg1, deg2 do
只有当 deg1 等于或小于零时才会运行,这很可能意味着它不是按照你的意图运行的。
其次,任何不需要离开其作用域的变量都应该是局部化的。这是 Lua 最佳实践。例如,您的函数可以使用局部变量重写:
function rotatePlayer(dt)
local deg1 = player.rot -- player's current rotation
local step = 0 -- ! Any reference to a "step" variable within the scope of this function will always refer to this particular variable.
local deg2 = 0 -- desired rotation
step = (math.deg(deg1) - math.deg(deg2))*dt
for i = deg1, deg2 do
player.rot = player.rot - math.rad(step)
step = step - dt
end
end
由于先前已经确定 deg2 始终为零,因此以下行等同于将玩家的旋转角度乘以 delta dt。
step = (math.deg(deg1) - math.deg(deg2))*dt
下面的行等同于将玩家的原始旋转角度乘以 delta (step) 并从当前旋转中减去该值的弧度版本,然后从 delta dt 中减去 step 值,在单个游戏帧内执行循环。我不确定您是否知道该循环在一个帧内运行。
player.rot = player.rot - math.rad(step)
step = step - dt
我不确定您的操作意图是什么,但也许您可以告诉我更多。
为了实现更平滑的动画,您需要缩小速率并调整旋转的执行方式。我已经重写了您的函数,希望它作为示例,可以清楚地说明如何编写更好的代码:
function rotatePlayer(dt) -- dt 为上次更新以来的秒数
local current = player.rot -- 玩家当前的旋转角度,以弧度表示
local target = 0 -- 期望角度,以弧度表示
local difference = target - current
if difference == 0 then -- 这里没有什么可做的
return
end
local rate = math.pi / 4 -- 每秒转动的弧度(根据需要进行调整)
local change = rate * dt -- r/s * delta(change in time)
if difference < 0 then
-- 变成负的,因为差异也是负的
change = change * -1
-- 如果(current + change > target),则接受较小的差异。
-- 这可以避免我们“超过”所需旋转的玩家的旋转
-- 向特定目标。
change = math.max(change, difference)
else
change = math.min(change, difference)
end
player.rot = current + change
end
请告诉我这是否解决了您的问题,如果您有更多问题,请随时提出。
- 如何将两个不同的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中获取用户配置主目录的跨平台方法
我已经将对 player.lua 的更改发布到 pastebin Stackoverflow Love2d 游戏。 现在它会以固定速率旋转玩家,而不是固定时间。如果要以固定时间旋转,可以将 rottime 设为常量。