@osbjs/components
Version:
osbjs pre-built components
56 lines (55 loc) • 3.68 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.HitObjectHighlight = void 0;
const math_1 = require("@osbjs/math");
const osbjs_1 = require("@osbjs/osbjs");
const osujs_1 = require("@osbjs/osujs");
class HitObjectHighlight extends osbjs_1.Component {
constructor(osbPath, startTime, endTime, beatmap, options) {
super();
this.name = 'HitObjectHighlight';
this.options = { startScale: 1, endScale: 1.2, fadeDuration: 200, beatDivisor: 8, followSliderPath: true };
this.osbPath = osbPath;
this.beatmap = beatmap;
this.startTime = typeof startTime == 'string' ? (0, osbjs_1.parseOsuTimestamp)(startTime) : Math.round(startTime);
this.endTime = typeof endTime == 'string' ? (0, osbjs_1.parseOsuTimestamp)(endTime) : Math.round(endTime);
let firstUninherited = this.beatmap.timingPoints
.filter((tPoint) => tPoint.uninherited && tPoint.time <= this.startTime)
.sort((t1, t2) => t2.time - t1.time)[0];
this.startTime = Math.max(firstUninherited.time, this.startTime);
this.options = { ...this.options, ...options };
this.circles = this.beatmap.hitObjects.circles.filter((c) => c.startTime >= this.startTime && c.startTime <= this.endTime);
this.sliders = this.beatmap.hitObjects.sliders.filter((s) => s.startTime >= this.startTime && s.startTime <= this.endTime);
this.beat = this.beatmap.timingPoints
.filter((tPoint) => tPoint.time <= this.startTime && tPoint.uninherited)
.sort((t1, t2) => t2.time - t1.time)[0].beatLength;
}
generate() {
this.circles.forEach((circle) => {
let sprite = new osbjs_1.Sprite(this.osbPath, osbjs_1.Layer.Background);
sprite.MoveAtTime(circle.startTime, osbjs_1.OsbVector2.fromVector2(math_1.Vector2.add(circle.position, osujs_1.PlayfieldToStoryboardOffset)));
sprite.Scale(circle.startTime, circle.startTime + this.options.fadeDuration, this.options.startScale, this.options.endScale, osbjs_1.Easing.In);
sprite.Fade(circle.startTime, circle.startTime + Math.round(this.beat / 2), 1, 0);
this.registerComponents(sprite);
});
let timestep = Math.round(this.beat / this.options.beatDivisor);
this.sliders.forEach((slider) => {
let sprite = new osbjs_1.Sprite(this.osbPath, osbjs_1.Layer.Background);
sprite.Scale(slider.startTime, slider.endTime + this.options.fadeDuration, this.options.startScale, this.options.endScale, osbjs_1.Easing.In);
sprite.Fade(slider.startTime, Math.round(slider.endTime + this.options.fadeDuration), 1, 0);
if (this.options.followSliderPath) {
let startTime = slider.startTime;
let totalStep = Math.round((slider.endTime - slider.startTime) / timestep);
for (let i = 0; i < totalStep; i++) {
let prevEndTime = startTime + timestep * i;
let endTime = startTime + timestep * (i + 1);
let startPosition = slider.getPositionAtTime(prevEndTime);
let endPosition = slider.getPositionAtTime(endTime);
sprite.Move(prevEndTime, endTime, osbjs_1.OsbVector2.fromVector2(math_1.Vector2.add(startPosition, osujs_1.PlayfieldToStoryboardOffset)), osbjs_1.OsbVector2.fromVector2(math_1.Vector2.add(endPosition, osujs_1.PlayfieldToStoryboardOffset)));
}
}
this.registerComponents(sprite);
});
}
}
exports.HitObjectHighlight = HitObjectHighlight;