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

点赞
用户2279620
用户2279620

我已经将对 player.lua 的更改发布到 pastebin Stackoverflow Love2d 游戏。 现在它会以固定速率旋转玩家,而不是固定时间。如果要以固定时间旋转,可以将 rottime 设为常量。

2013-10-26 18:49:09
用户828255
用户828255

我注意到你的代码有几个问题。

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

请告诉我这是否解决了您的问题,如果您有更多问题,请随时提出。

2013-10-26 21:09:09