Files
Portfolio/src/scene/world/travel-distance.ts

32 lines
905 B
TypeScript

export interface TravelDistance {
advance(deltaSeconds: number, speed: number, roadEnergy: number): number;
snapshot(): number;
}
const MAX_FRAME_SECONDS = 0.1;
const CRUISE_UNITS_PER_SECOND = 18;
const SPEED_UNITS_PER_SECOND = 54;
const ENERGY_UNITS_PER_SECOND = 48;
export function createTravelDistance(): TravelDistance {
let distance = 0;
return {
advance(deltaSeconds, speed, roadEnergy) {
if (!Number.isFinite(deltaSeconds) || deltaSeconds <= 0) return distance;
const dt = Math.min(MAX_FRAME_SECONDS, deltaSeconds);
distance += dt * (
CRUISE_UNITS_PER_SECOND
+ clamp01(speed) * SPEED_UNITS_PER_SECOND
+ clamp01(roadEnergy) * ENERGY_UNITS_PER_SECOND
);
return distance;
},
snapshot: () => distance,
};
}
function clamp01(value: number): number {
return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : 0;
}