UNPKG

@osbjs/osbjs

Version:

a minimalist osu! storyboarding framework

97 lines (96 loc) 4.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Slider = void 0; const Math_1 = require("../../Math"); const Curves_1 = require("../Curves"); const Enums_1 = require("../Enums"); const HitObject_1 = require("./HitObject"); class Slider extends HitObject_1.HitObject { constructor(x, y, startTime, hitsound, hitSample, params, sliderMultiplier, timingPoint, currentMultiplier) { super(x, y, startTime, hitsound, hitSample); this.params = params; this.startPoint = new Math_1.Vector2(x, y); this.endPoint = params.curvePoints[params.curvePoints.length - 1]; switch (params.curveType) { case Enums_1.CurveType.Bezier: this._curve = this._createBezierCurveGroup(params); break; case Enums_1.CurveType.Catmull: this._curve = this._createCatmullCurve(params); break; case Enums_1.CurveType.Perfect: if (params.curvePoints.length > 2) { this._curve = this._createBezierCurveGroup(params); } else if (params.curvePoints.length < 2 || !Curves_1.CircleCurve.isValid(this.startPoint, params.curvePoints[0], this.endPoint)) { this._curve = this._createLinearCurve(params); } else { this._curve = new Curves_1.CircleCurve(this.startPoint, params.curvePoints[0], this.endPoint); } break; default: this._curve = this._createLinearCurve(params); break; } this.travelDuration = this._calcDuration(timingPoint, sliderMultiplier, currentMultiplier, this.params.length); this.endTime = this.startTime + this.travelDuration * params.slides; } _calcDuration(timingPoint, beatmapMultiplier, currentMultiplier, length) { let sliderMultiplierLessLength = length / beatmapMultiplier; let travelDurationBeats = (sliderMultiplierLessLength / 100) * currentMultiplier; return Math.round(timingPoint.beatLength * travelDurationBeats); } _createBezierCurveGroup(params) { let curves = []; let cPoints = [this.startPoint]; let precision = Math.ceil(params.length); let previousPosition = this.startPoint; params.curvePoints.forEach((cPoint) => { if (cPoint.x == previousPosition.x && cPoint.y == previousPosition.y) { if (cPoints.length > 1) curves.push(new Curves_1.BezierCurve(cPoints, precision)); cPoints = []; } cPoints.push(cPoint); previousPosition = cPoint; }); if (cPoints.length > 1) curves.push(new Curves_1.BezierCurve(cPoints, precision)); return new Curves_1.BezierCurveGroup(curves); } _createCatmullCurve(params) { let cPoints = [this.startPoint, ...params.curvePoints]; let precision = Math.ceil(params.length); return new Curves_1.CatmullCurve(cPoints, precision); } _createLinearCurve(params) { let curves = []; let previousPoint = this.startPoint; let cPoints = params.curvePoints; cPoints.forEach((cPoint) => { curves.push(new Curves_1.BezierCurve([previousPoint, cPoint], 0)); previousPoint = cPoint; }); return new Curves_1.BezierCurveGroup(curves); } getPositionAtTime(time) { if (time <= this.startTime) return this.startPoint; if (this.endTime <= time) this.params.slides % 2 == 0 ? this.startPoint : this.endPoint; let elapsedSinceStart = time - this.startTime; let repeatAtTime = 1; var progressDuration = elapsedSinceStart; while (progressDuration > this.travelDuration) { progressDuration -= this.travelDuration; repeatAtTime++; } var progress = progressDuration / this.travelDuration; var reversed = repeatAtTime % 2 == 0; if (reversed) progress = 1.0 - progress; return this._curve.getPositionAtDistance(this.params.length * progress); } } exports.Slider = Slider;