Image Love2D在给定时间内旋转图像,直到其达到某个角度

Image Love2D在给定时间内旋转图像,直到其达到某个角度,image,lua,rotation,smooth,love2d,Image,Lua,Rotation,Smooth,Love2d,我在做一个小游戏。这是一款2D游戏,主要功能是改变重力方向。我设法改变了方向,所以现在玩家“落”到重力方向。但现在我希望玩家在2秒内“稳定下来”。我实现了基本的旋转,但这会立即改变播放器的角度,我希望它将步骤“切片”为更小的片段,以便旋转“更平滑”。例如,我想用增量时间计算出的小步数从180°变为0°,与数字i输入相关,即“持续时间” 我不太熟悉弧度,这就是为什么我不能使用它 可以使用world.gravitydir变量设置重力方向,它可以是1,2,3,4。1为正常重力“向下”2,4为“向左”和

我在做一个小游戏。这是一款2D游戏,主要功能是改变重力方向。我设法改变了方向,所以现在玩家“落”到重力方向。但现在我希望玩家在2秒内“稳定下来”。我实现了基本的旋转,但这会立即改变播放器的角度,我希望它将步骤“切片”为更小的片段,以便旋转“更平滑”。例如,我想用增量时间计算出的小步数从180°变为0°,与数字i输入相关,即“持续时间”

我不太熟悉弧度,这就是为什么我不能使用它

可以使用world.gravitydir变量设置重力方向,它可以是1,2,3,4。1为正常重力“向下”2,4为“向左”和“向右”,3为“向上” 我还有一些“dev命令”,可以使用箭头键手动更改重力方向

这是我试图将播放器从上下颠倒平稳地旋转到正常状态的尝试

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绘图函数位于player.lua中


来源:

我在pastebin上对player.lua进行了更改。
它以固定的速率而不是固定的时间旋转玩家。要实现后者,只需将rottime设置为常量。

我注意到您的代码存在一些问题

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
)并减去玩家当前旋转角度的弧度,然后从
step
值中减去delta
dt
,在我可能添加的单个游戏框架内执行的循环内部。我不确定您是否知道循环在一帧内运行

        player.rot = player.rot - math.rad(step)
        step = step - dt
我不确定你对那些手术的意图,但也许你可以告诉我更多


至于实现更平滑的动画,您需要降低速率并调整旋转的执行方式。我已将您的函数重写如下,并希望它作为一个示例,澄清如何更好地编写此函数:

function rotatePlayer(dt) -- dt is seconds since last update
    local current = player.rot -- player's current rotation in radians
    local target = 0 -- desired angle in radians
    local difference = target - current

    if difference == 0 then -- nothing to be done here
        return
    end

    local rate = math.pi / 4 -- radians turned per second (adjust as necessary)
    local change = rate * dt -- r/s * delta(change in time)

    if difference < 0 then
        -- make change negative, since difference is as well
        change = change * -1

        -- If (current + change > target), settle for the lesser difference.
        -- This keeps us from "overshooting" the player's rotation
        -- towards a particular target.
        change = math.max(change, difference)
    else
        change = math.min(change, difference)
    end

    player.rot = current + change
end
函数旋转层(dt)——dt是自上次更新后的秒数
本地当前=player.rot——以弧度为单位的玩家当前旋转
局部目标=0--以弧度为单位的所需角度
局部差异=目标-电流
如果差值==0,则--此处无需执行任何操作
返回
结束
本地速率=math.pi/4——每秒旋转的弧度(根据需要调整)
局部变化=速率*dt--r/s*delta(时间变化)
如果差值小于0,则
--使变化为负值,因为差异也是如此
更改=更改*-1
--如果(当前+更改>目标),则以较小的差异结算。
--这可以防止我们“超调”球员的旋转
--朝向特定目标。
更改=数学最大值(更改,差异)
其他的
更改=数学最小值(更改,差异)
结束
player.rot=当前+更改
结束

请告诉我这是否解决了您的问题,以及您是否还有其他问题。

您的问题是什么?问题是:如何解决?><因为我的方法不起作用,所以我很清楚,你的播放器在瞬间旋转,你希望它在特定的时间范围内发生?是的,没错,让播放器平稳旋转。是的,这给了我一个基本的想法,它比我以前的方法(不是我在这里发布的方法)更干净利落,但是,它的超调,除非我将重力设置为正常,我只更改了“target”变量,它现在不是局部变量,它得到的值是这样的:
如果world.gravitydir==1,那么target=0结束——如果world.gravitydir==3,那么target=180结束——如果world.gravitydir==2,那么target=90结束——如果world.gravitydir==4,那么target=270结束——右边
哦,事实上,我忘了我应该把值设置为弧度,现在它没有超调,但现在我注意到,从0°到270°它是以一种积极的方式进行的,而不是减去它,但我认为,我可以自己解决这个问题:D