2

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

4

2 回答 2

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

dt由于先前确定deg2的始终为零的事实,以下行等效于将玩家旋转的度数乘以 delta 。

    step = (math.deg(deg1) - math.deg(deg2))*dt

以下几行相当于将玩家的原始旋转度数乘以 delta ( step) 并减去玩家当前旋转的弧度版本,然后dtstep值中减去 delta,在循环内执行我可能会添加单个游戏框架。我不确定您是否知道循环在一帧内运行。

        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

请让我知道这是否能解决您的问题,如果您还有其他问题。

于 2013-10-26T21:09:09.477 回答
0

我在 pastebin Stackoverflow Love2d game上对 player.lua 进行了更改。它以固定速率而不是固定时间旋转播放器。做后者只需使 rottime 常数。

于 2013-10-26T18:49:09.470 回答