add friction

This commit is contained in:
fnicon 2026-03-21 00:59:46 +09:00
parent d284853f24
commit 981fb4cbb4
2 changed files with 76 additions and 18 deletions

View File

@ -32,20 +32,24 @@ local function drift(dt, pos_x, pos_y, speed, max_speed, angle, centrifugal)
pos_y + (dy * speed_percent * sin * centrifugal)
end
local function gas(accel, drag)
return accel - drag
local function gas(accel, drag, friction)
friction = friction or 0
return accel - drag - friction
end
local function brake(decel, drag, grip)
return - decel - drag - grip
local function brake(decel, drag, grip, friction)
friction = friction or 0
return - decel - drag - grip - friction
end
local function roam(decel, drag)
return - decel - drag
local function roam(decel, drag, friction)
friction = friction or 0
return - decel - drag - friction
end
local function steer(_steer, grip, drag, velocity)
return _steer + grip + drag - velocity
local function steer(_steer, grip, drag, velocity, friction)
friction = friction or 0
return _steer + grip + drag - velocity + friction
end
return {

View File

@ -92,30 +92,74 @@ function system:load()
end
end
local function get_velocity(dt, up, down, accel, drag, decel, grip, velocity, max_speed)
local lw, lh = love.graphics.getDimensions()
local frictions = {
{
name = "grass",
colliders = {
-- x, y, w, h
0, 0, lw/2, lh
},
color = {0, 255/255, 0},
friction = 5
},
{
name = "pavement",
colliders = {
-- x, y, w, h
lw/2, 0, lw/2, lh
},
color = {0, 255/255, 255/255},
friction = 0
}
}
local function get_velocity(dt, up, down, accel, drag, decel, grip, velocity, max_speed, friction)
local new_accel
local new_min_speed = 0
if (up) then
new_accel = racing_phy.gas(accel, drag)
new_accel = racing_phy.gas(accel, drag, friction)
elseif(down) then
new_accel = racing_phy.brake(decel, drag, grip)
new_accel = racing_phy.brake(decel, drag, grip, friction)
new_min_speed = -max_speed
else
new_accel = racing_phy.roam(decel, drag)
new_accel = racing_phy.roam(decel, drag, friction)
end
return racing_phy.accelerate(dt, 1, velocity, max_speed, new_accel, new_min_speed)
end
local function get_angle(dt, left, right, steer, grip, drag, velocity, max_speed)
local function get_angle(dt, left, right, steer, grip, drag, velocity, max_speed, friction)
local new_angle = 0
if (left) then
new_angle = - 1 * racing_phy.steer(steer, grip, drag, velocity / max_speed) * dt
new_angle = - 1 * racing_phy.steer(steer, grip, drag, velocity / max_speed, friction) * dt
elseif (right) then
new_angle = 1 * racing_phy.steer(steer, grip, drag, velocity / max_speed) * dt
new_angle = 1 * racing_phy.steer(steer, grip, drag, velocity / max_speed, friction) * dt
end
return new_angle
end
-- x1 y1 -- (x1 + w1) y1
-- x2 y2
-- x1 (y1 + h1) -- (x1 + w1) (y1 + h1)
local function is_inside(x1,y1,w1,h1, x2,y2)
return x1 < x2 and
x2 < x1+w1 and
y1 < y2 and
y2 < y1+h1
end
local function get_friction(pos_x, pos_y, floors)
local friction = 0
for _,f in ipairs(floors) do
local fx, fy, fw, fh = f.colliders[1], f.colliders[2], f.colliders[3], f.colliders[4]
if (is_inside(fx, fy, fw, fh, pos_x, pos_y)) then
friction = f.friction
break
end
end
return friction
end
function system:update(dt)
for _, e in ipairs(self.pool) do
local accel, brake, grip, max_speed, steer, velocity, drag, decel = get(e)
@ -125,11 +169,14 @@ function system:update(dt)
local left = love.keyboard.isDown("left")
local right = love.keyboard.isDown("right")
e[race.dict.velocity].data = get_velocity(dt, up, down, accel, drag, decel, grip, velocity, max_speed)
local pos_x, pos_y = e["race.pos"].data[1], e["race.pos"].data[2]
local friction = get_friction(pos_x, pos_y, frictions)
e[race.dict.velocity].data = get_velocity(dt, up, down, accel, drag, decel, grip, velocity, max_speed, friction)
local angle = e["race.angle"].data
local new_angle = get_angle(dt, left, right, steer, grip, drag,velocity, max_speed)
local new_angle = get_angle(dt, left, right, steer, grip, drag,velocity, max_speed, friction)
e["race.angle"].data = angle + new_angle
velocity = e[race.dict.velocity].data
@ -144,6 +191,13 @@ function system:update(dt)
end
function system:draw()
for _, f in ipairs(frictions) do
love.graphics.push()
love.graphics.setColor(f.color)
love.graphics.rectangle("fill", f.colliders[1], f.colliders[2], f.colliders[3], f.colliders[4])
love.graphics.setColor(1, 1, 1)
love.graphics.pop()
end
for _, e in ipairs(self.pool) do
local accel, brake, grip, max_speed, steer, velocity = get(e)
local x, y, sx, sy, angle = e["race.pos"].data[1], e["race.pos"].data[2], e["race.scale"].data[1], e["race.scale"].data[2], e["race.angle"].data