integration #7
@ -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 {
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user