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