@inglorious/engine
Version:
A JavaScript game engine written with global state, immutability, and pure functions in mind. Have fun(ctional programming) with it!
52 lines (39 loc) • 1.31 kB
JavaScript
import {
angle,
clamp,
divide,
magnitude,
multiply,
zero,
} from "@inglorious/utils/math/vector.js"
import { subtract, sum } from "@inglorious/utils/math/vectors.js"
export const DEFAULT_TIME_TO_TARGET = 0.1
const DEFAULT_MAX_ACCELERATION = 0
const DEFAULT_MAX_SPEED = 0
const DEFAULT_ORIENTATION = 0
const MIN_ACCELERATION = 0
const MIN_SPEED = 0
const HALF_ACCELERATION = 0.5
export function matchVelocity(
entity,
target,
dt,
{ timeToTarget = DEFAULT_TIME_TO_TARGET } = {},
) {
const maxAcceleration = entity.maxAcceleration ?? DEFAULT_MAX_ACCELERATION
const maxSpeed = entity.maxSpeed ?? DEFAULT_MAX_SPEED
let orientation = entity.orientation ?? DEFAULT_ORIENTATION
let velocity = entity.velocity ?? zero()
const velocityDelta = subtract(target.velocity, velocity)
let acceleration = divide(velocityDelta, timeToTarget)
acceleration = clamp(acceleration, MIN_ACCELERATION, maxAcceleration)
velocity = sum(velocity, multiply(acceleration, dt))
velocity = clamp(velocity, MIN_SPEED, maxSpeed)
const position = sum(
entity.position,
multiply(velocity, dt),
multiply(acceleration, HALF_ACCELERATION * dt * dt),
)
orientation = magnitude(velocity) ? angle(velocity) : orientation
return { acceleration, velocity, position, orientation }
}