UNPKG

dotosb

Version:

Simple, dependency free osb file parser

80 lines (68 loc) 2.07 kB
const { newEvent, newParam } = require('./event.js'); const { IntervalMap } = require('./imap.js'); const { ease } = require('./easing.js'); class Sprite { events = []; path; origin; layer; x; y; constructor(path, options) { this.layer = options?.layer ?? "Background"; this.origin = options?.origin ?? "Centre"; this.path = path; this.x = options?.x ?? 320; this.y = options?.y ?? 240; this.imap = new IntervalMap(); } add(type, times, values, easing = 0) { const event = newEvent(type, times, values, easing); if(Array.isArray(times)) this.imap.add(event); this.events.push(event); } /** * Query sprite parameters at a given time */ getAt(type, time) { const events = this.imap.query(time); for(const event of events) { if(event.type != type) continue; const vcount = event.start_values.length; const differences = []; const p = Math.abs((time - event.start) / (event.start - event.end)); const easing = ease(event.easing, p); for(let i = 0; i < vcount; i++) { const diff = Math.abs(event.start_values[i] - event.end_values[i]); differences.push(event.start_values[i] + (diff * easing)); } return differences.length == 1 ? differences[0] : differences; } } param(start, end, type) { const param = newParam(start, end , type); this.events.push(param); } createLoop(start, loop_count, events) { let stringified = ` L,${start},${loop_count}`; for(let i = 0; i < events.length; i++) { stringified += `\n ${events[i].stringified}`; } const event = { type: 'L', start: start, loop_count: loop_count, events: events, stringified: stringified }; this.events.push(event); } toString() { let sprite = `Sprite,${this.layer},${this.origin},"${this.path}",${this.x},${this.y}\n`; for (let i = 0; i < this.events.length; i++) { sprite += `${this.events[i].stringified}\n`; } return sprite; } } module.exports = { Sprite };