diff --git a/game/love_src/src/system/racing_phy.lua b/game/love_src/src/system/racing_phy.lua index 465fdde..56b75fc 100644 --- a/game/love_src/src/system/racing_phy.lua +++ b/game/love_src/src/system/racing_phy.lua @@ -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 { diff --git a/game/love_src/src/world/top_down_race/system/velocity.lua b/game/love_src/src/world/top_down_race/system/velocity.lua index 0da69fa..ed26db2 100644 --- a/game/love_src/src/world/top_down_race/system/velocity.lua +++ b/game/love_src/src/world/top_down_race/system/velocity.lua @@ -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