add friction
This commit is contained in:
parent
d284853f24
commit
981fb4cbb4
@ -32,20 +32,24 @@ local function drift(dt, pos_x, pos_y, speed, max_speed, angle, centrifugal)
|
|||||||
pos_y + (dy * speed_percent * sin * centrifugal)
|
pos_y + (dy * speed_percent * sin * centrifugal)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function gas(accel, drag)
|
local function gas(accel, drag, friction)
|
||||||
return accel - drag
|
friction = friction or 0
|
||||||
|
return accel - drag - friction
|
||||||
end
|
end
|
||||||
|
|
||||||
local function brake(decel, drag, grip)
|
local function brake(decel, drag, grip, friction)
|
||||||
return - decel - drag - grip
|
friction = friction or 0
|
||||||
|
return - decel - drag - grip - friction
|
||||||
end
|
end
|
||||||
|
|
||||||
local function roam(decel, drag)
|
local function roam(decel, drag, friction)
|
||||||
return - decel - drag
|
friction = friction or 0
|
||||||
|
return - decel - drag - friction
|
||||||
end
|
end
|
||||||
|
|
||||||
local function steer(_steer, grip, drag, velocity)
|
local function steer(_steer, grip, drag, velocity, friction)
|
||||||
return _steer + grip + drag - velocity
|
friction = friction or 0
|
||||||
|
return _steer + grip + drag - velocity + friction
|
||||||
end
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@ -92,30 +92,74 @@ function system:load()
|
|||||||
end
|
end
|
||||||
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_accel
|
||||||
local new_min_speed = 0
|
local new_min_speed = 0
|
||||||
if (up) then
|
if (up) then
|
||||||
new_accel = racing_phy.gas(accel, drag)
|
new_accel = racing_phy.gas(accel, drag, friction)
|
||||||
elseif(down) then
|
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
|
new_min_speed = -max_speed
|
||||||
else
|
else
|
||||||
new_accel = racing_phy.roam(decel, drag)
|
new_accel = racing_phy.roam(decel, drag, friction)
|
||||||
end
|
end
|
||||||
return racing_phy.accelerate(dt, 1, velocity, max_speed, new_accel, new_min_speed)
|
return racing_phy.accelerate(dt, 1, velocity, max_speed, new_accel, new_min_speed)
|
||||||
end
|
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
|
local new_angle = 0
|
||||||
if (left) then
|
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
|
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
|
end
|
||||||
return new_angle
|
return new_angle
|
||||||
end
|
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)
|
function system:update(dt)
|
||||||
for _, e in ipairs(self.pool) do
|
for _, e in ipairs(self.pool) do
|
||||||
local accel, brake, grip, max_speed, steer, velocity, drag, decel = get(e)
|
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 left = love.keyboard.isDown("left")
|
||||||
local right = love.keyboard.isDown("right")
|
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 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 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
|
e["race.angle"].data = angle + new_angle
|
||||||
|
|
||||||
velocity = e[race.dict.velocity].data
|
velocity = e[race.dict.velocity].data
|
||||||
@ -144,6 +191,13 @@ function system:update(dt)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function system:draw()
|
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
|
for _, e in ipairs(self.pool) do
|
||||||
local accel, brake, grip, max_speed, steer, velocity = get(e)
|
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
|
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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user