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

时间:2013-10-26 00:06:32

标签: image lua rotation smooth love2d

我正在做一个小游戏。这是一款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.lua

来源:http://www.mediafire.com/download/3xto995yz638n0n/notitle.love

2 个答案:

答案 0 :(得分:1)

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

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

以下一行相当于将玩家轮换的度数乘以delta dt,原因是先前确定deg2始终为零。

    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 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

如果这可以解决您的问题并且您还有其他问题,请告诉我。

答案 1 :(得分:0)

我在pastebin Stackoverflow Love2d game 上更改了player.lua。 它以固定速率而不是固定时间旋转播放器。做后者只是让rottime不变。