如何正确使用lerp函数,确保其达到目标值

我正在尝试在love2D中创建一个玩家,并且我有一个lerp函数,可以将玩家速度降至0,但我知道我没有正确使用lerp函数,因为它永远不会达到最终值并开始变得奇怪和疯狂,请问我该如何正确使用lerp函数。

function love.load()
    moon = require "Library/moon_light"
    position = {x = 0, y = 0}
    H = 0
    V = 0
    new_H = 0
    new_V = 0
    position["x"] = moon.Mid_point(0,0,1280,720)[1]
    position["y"] = moon.Mid_point(0,0,1280,720)[2]
    accel = 8
    max_speed = 80
    fps = 60
    friction = 6
end

function love.update(dt)
    if love.keyboard.isDown('escape') then
        love.event.push('quit')
    end

    if love.keyboard.isDown("d") then
        H = 1
    elseif love.keyboard.isDown("a") then
        H = -1
    else
        H = 0
    end

    if love.keyboard.isDown("w") then
        V = -1
    elseif love.keyboard.isDown("s") then
        V = 1
    else
        V = 0
    end
    if H ~= 0 then -- 使用新值并给它加速度
        new_H = H * accel * dt * fps
    end
    if H == 0 then -- 检查玩家是否没有移动,将其lerp到0,以停止运动
        new_H = moon.Lerp(new_H,0,friction * dt)
    end
    if V ~= 0 then
        new_V = V * accel * dt * fps
    end
    if V == 0 then
        new_V = moon.Lerp(new_V,0,friction * dt)
    end

    position["x"] = position["x"] + new_H -- 将运动设置为位置
    position["y"] = position["y"] + new_V

end

function love.draw()
    love.graphics.rectangle("fill",position["x"] - 25,position["y"] - 25,50,50)
    love.graphics.print("水平值 : " .. H .. "\n垂直值 : " .. V,100,400)
    love.graphics.print("新水平值 : " .. new_H .. "\n新垂直值 : " .. new_V,100,440)

end

我认为lerp函数没有任何问题,但以防万一。

function moon_light.Lerp(start_v,end_v,percent)
    return start_v + (end_v - start_v) * percent
end

EDIT 我将lerp更改为基于时间的,从建议中得到,我还创建了一个名为motion的新变量,似乎将lerp设置为自身会导致奇怪的问题,使它永远无法达到0:

if H ~= 0 then -- 使用新值并给它加速度
    H_counter = 0
    new_H = H * accel * dt * fps
    motion_H = new_H
end
if H == 0 then -- 检查玩家是否没有移动,将其lerp到0,以停止运动
    if H_counter < slow_down_duration then
        motion_H = moon.Lerp(new_H,0,H_counter/slow_down_duration)
        H_counter = H_counter + dt
    else
        new_H = 0
        motion_H = 0
    end
end

if V ~= 0 then
    V_counter = 0
    new_V = V * accel * dt * fps
    motion_V = new_V
end
if V == 0 then
    if V_counter < slow_down_duration then
        motion_V = moon.Lerp(new_V,0,V_counter/slow_down_duration)
        V_counter = V_counter + dt
    else
        new_V = 0
        motion_V = 0
    end
end

position["x"] = position["x"] + motion_H -- 将运动设置为位置
position["y"] = position["y"] + motion_V

原文链接 https://stackoverflow.com/questions/70761533

点赞