From f1ea88ec02f35ffdf42acc72750747d43b880746 Mon Sep 17 00:00:00 2001 From: lunarcleint <88809950+lunarcleint@users.noreply.github.com> Date: Sat, 30 Sep 2023 12:41:50 -0700 Subject: [PATCH] playback speed WIP --- source/funkin/editors/charter/Charter.hx | 7 ++- source/funkin/editors/ui/UISlider.hx | 72 +++++++++++++++++++----- 2 files changed, 63 insertions(+), 16 deletions(-) diff --git a/source/funkin/editors/charter/Charter.hx b/source/funkin/editors/charter/Charter.hx index 3d125f6a..00156e8e 100644 --- a/source/funkin/editors/charter/Charter.hx +++ b/source/funkin/editors/charter/Charter.hx @@ -376,8 +376,11 @@ class Charter extends UIState { songPosInfo.alignment = RIGHT; uiGroup.add(songPosInfo); - //playBackSlider = new UISlider(FlxG.width - 180 - 26 - 12, (23/2) - (4/2), 180, [{start: 0.25, end: 1, size: 0.5}, {start: 1, end: 3, size: 0.5}]); - //uiGroup.add(playBackSlider); + playBackSlider = new UISlider(FlxG.width - 180 - 26 - 12, (23/2) - (4/2), 180, [{start: 0.5, end: 1, size: 0.5}, {start: 1, end: 3, size: 0.5}], 0.5); + playBackSlider.onChange = function (v) { + FlxG.sound.music.pitch = vocals.pitch = v; + }; + uiGroup.add(playBackSlider); strumlineInfoBG = new UISprite(); strumlineInfoBG.loadGraphic(Paths.image('editors/charter/strumline-info-bg')); diff --git a/source/funkin/editors/ui/UISlider.hx b/source/funkin/editors/ui/UISlider.hx index f8faeefc..29e3990f 100644 --- a/source/funkin/editors/ui/UISlider.hx +++ b/source/funkin/editors/ui/UISlider.hx @@ -18,19 +18,28 @@ class UISlider extends UISprite { public var endText:UIText; public var barSegements:Map<{segment:Float, size:Float}, UISprite> = []; + public var selectableBar:UISprite; + public var selectableHitbox:UISprite; - public function new(x:Float, y:Float, width:Int = 120, segments:Array) { + public var value:Float = 0; + public var onChange:Float->Void; + + public function new(x:Float, y:Float, width:Int = 120, segments:Array, defaultStart:Float = 0) { this.segments = segments; this.barWidth = width; + x -= 6; super(x, y); - makeSolid(barWidth, 4, -1); + makeSolid((barWidth+6), 4, -1); + cursor = BUTTON; + + __barProgress = defaultStart; members.push(barStartSpr = new FlxSprite(x-4,y+((4/2))).makeSolid(4, 12, -1)); - members.push(barEndSpr = new FlxSprite(x+barWidth,y+((4/2))).makeSolid(4, 12, -1)); + members.push(barEndSpr = new FlxSprite(x+barWidth+6,y+((4/2))).makeSolid(4, 12, -1)); members.push(startText = new UIText(x, y, 0, Std.string(segments[0].start).replace("0.", "."))); - members.push(endText = new UIText(x + barWidth + 8, y, 0, Std.string(segments[segments.length-1].end))); + members.push(endText = new UIText(x + (barWidth+6) + 8, y, 0, Std.string(segments[segments.length-1].end))); var midSegments:Map = []; for (segment in segments) { @@ -44,26 +53,61 @@ class UISlider extends UISprite { for (segment => size in midSegments) { var segmentSpr:UISprite = new UISprite(x,y); segmentSpr.makeSolid(4, 8, -1); - segmentSpr.members = [new UIText(x, y, 0, Std.string(segment/1000).replace("0.", "."), 10)]; members.push(segmentSpr); barSegements.set({segment: segment/1000, size: size}, segmentSpr); } + + selectableBar = new UISprite(x,y); + selectableBar.makeSolid(6, 12, 0xFFA0A0A0); + selectableBar.cursor = BUTTON; + members.push(selectableBar); + + selectableHitbox = new UISprite(x,y); + selectableHitbox.makeSolid(barWidth+6, 16, -1); + selectableHitbox.cursor = BUTTON; + selectableHitbox.alpha = 0; + members.push(selectableHitbox); } - + + var __barProgress:Float = 0; + public override function update(elapsed:Float) { - barStartSpr.follow(this, -4, (4-12)/2); - barEndSpr.follow(this, barWidth, (4-12)/2); + barStartSpr.follow(this, -4, (height-barStartSpr.height)/2); + barEndSpr.follow(this, barWidth+6, (height-barEndSpr.height)/2); + + selectableHitbox.follow(this, 0, (height-selectableHitbox.height)/2); + var lastBarProgress:Float = __barProgress; + + if (selectableHitbox.hovered && FlxG.mouse.pressed) { + var mousePos = FlxG.mouse.getScreenPosition(__lastDrawCameras[0], FlxPoint.get()); + __barProgress = FlxMath.bound(mousePos.x-x, 0, barWidth)/barWidth; + mousePos.put(); + } + + if (__barProgress != lastBarProgress) + onChange(value = calcValue(__barProgress)); + + selectableBar.follow(this, __barProgress * barWidth, (4-12)/2); startText.follow(this, -startText.width-10, (4/2) - (startText.height/2)); - endText.follow(this, barWidth + 10, (4/2) - (endText.height/2)); + endText.follow(this, barWidth+6 + 10, (4/2) - (endText.height/2)); - for (segmentData => sprite in barSegements) { - sprite.follow(this, (barWidth * segmentData.size) - (sprite.width/2), ((4-8)/2) -2); - if (sprite.members[0] != null && sprite.members[0] is UIText) - cast(sprite.members[0], UIText).follow(sprite,0,sprite.height); - } + for (segmentData => sprite in barSegements) + sprite.follow(this, (barWidth * segmentData.size) + ((selectableBar.width-sprite.width)/2), ((4-8)/2)); super.update(elapsed); } + + function calcValue(progress:Float):Float { + var totalProgress:Float = 0; + for (segment in segments) { + if (progress < totalProgress + segment.size) { + var relativeProgress = (progress - totalProgress) / segment.size; + return FlxMath.remapToRange(relativeProgress, 0, 1, segment.start, segment.end); + } + totalProgress += segment.size; + } + return segments[segments.length-1].end; + } } \ No newline at end of file