From 4d73ec34774fc305fb566851819372f98662e3d2 Mon Sep 17 00:00:00 2001 From: Ralty <78720179+Raltyro@users.noreply.github.com> Date: Sun, 2 Nov 2025 10:51:23 +0700 Subject: [PATCH] Add FlxSound.scrollFactor, getPosition --- source/flixel/sound/FlxSound.hx | 60 ++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 12 deletions(-) diff --git a/source/flixel/sound/FlxSound.hx b/source/flixel/sound/FlxSound.hx index 9d3c4463..180744e1 100644 --- a/source/flixel/sound/FlxSound.hx +++ b/source/flixel/sound/FlxSound.hx @@ -21,6 +21,7 @@ import flixel.math.FlxMath; import flixel.math.FlxPoint; import flixel.system.FlxAssets.FlxSoundAsset; import flixel.tweens.FlxTween; +import flixel.util.FlxDestroyUtil; import flixel.util.FlxSignal; import flixel.util.FlxStringUtil; import flixel.FlxBasic; @@ -136,11 +137,18 @@ class FlxSound extends FlxBasic { public var radius:Float; /** - * Whether the proximity alters the pan or not + * Whether the proximity alters the pan or not. * @since raltyMod */ public var proximityPan:Bool; + /** + * Controls how much this object is affected by camera scrolling. `0` = no movement (e.g. a static sound), + * This is only useful if used with proximity (Initialized once proximity is used). + * @since raltyMod + */ + public var scrollFactor(default, null):FlxPoint; + /** * Stores for how much channels are in the loaded sound. * @since raltyMod @@ -302,6 +310,8 @@ class FlxSound extends FlxBasic { _lastTime = null; if (destroySound) { + scrollFactor = FlxDestroyUtil.put(scrollFactor); + if (group != null) group.remove(this); if (_channel != null) { @@ -348,15 +358,24 @@ class FlxSound extends FlxBasic { _amplitudeUpdate = true; - // Distance-based volume control (TODO for Ralty: REDO THIS) + // Distance-based volume control if (target != null) { - var targetPosition = target.getPosition(); - var radialMultiplier = targetPosition.distanceTo(FlxPoint.weak(x, y)) / radius; - targetPosition.put(); - radialMultiplier = 1 - FlxMath.bound(radialMultiplier, 0, 1); + var targetPosition = target.getPosition(), position = getPosition(); + var camera = camera; + if (camera != null) { + targetPosition.subtract(camera.scroll.x * target.scrollFactor.x, camera.scroll.y * target.scrollFactor.y); + if (scrollFactor != null) position.subtract(camera.scroll.x * scrollFactor.x, camera.scroll.y * scrollFactor.y); + else position.subtract(camera.scroll.x, camera.scroll.y); + } - _volumeAdjust = radialMultiplier; - if (proximityPan) _panAdjust = (x - target.x) / radius; + var radialMultiplier = targetPosition.distanceTo(position) / radius; + + // Make it so it affects the 3d position of the source and not just the panning? + _volumeAdjust = 1 - FlxMath.bound(radialMultiplier, 0, 1); + if (proximityPan) _panAdjust = (position.x - targetPosition.x) / radius; + + targetPosition.put(); + position.put(); } else _volumeAdjust = 1.0; @@ -536,12 +555,15 @@ class FlxSound extends FlxBasic { * @param Pan Whether panning should be used in addition to the volume changes. * @return This FlxSound instance (nice for chaining stuff together, if you're into that). */ - public function proximity(x = 0.0, y = 0.0, ?targetObject:FlxObject, ?radius:Float, pan = true):FlxSound { + public function proximity(x = 0.0, y = 0.0, ?targetObject:FlxObject, ?radius:Float, pan = true, ?scrollFactor:FlxPoint):FlxSound { setPosition(x, y); if (targetObject != null) this.target = targetObject; if (radius != null) this.radius = radius; proximityPan = pan; + if (this.scrollFactor == null) this.scrollFactor = FlxPoint.get(1, 1); + if (scrollFactor != null) this.scrollFactor.copyFrom(scrollFactor); + return this; } @@ -549,14 +571,28 @@ class FlxSound extends FlxBasic { * Helper function to set the coordinates of this object. * Sound positioning is used in conjunction with proximity/panning. * - * @param x The new x position - * @param y The new y position + * @param x The new x position + * @param y The new y position */ - public inline function setPosition(x = 0.0, y = 0.0):Void { + public function setPosition(x = 0.0, y = 0.0):Void { this.x = x; this.y = y; } + /** + * Returns the world position of this object. + * + * @param result Optional arg for the returning point. + * @return The world position of this object. + * @since raltyMod + */ + public function getPosition(?result:FlxPoint):FlxPoint { + if (result == null) + result = FlxPoint.get(); + + return result.set(x, y); + } + /** * Call this function to play the sound - also works on paused sounds. *