@osbjs/osbjs
Version:
a minimalist osu! storyboarding framework
97 lines (96 loc) • 4.37 kB
JavaScript
"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;