Funkin/source/funkin/ui/freeplay/CapsuleText.hx
2024-08-30 00:58:19 +01:00

216 lines
5.6 KiB
Haxe

package funkin.ui.freeplay;
import openfl.filters.BitmapFilterQuality;
import flixel.text.FlxText;
import flixel.group.FlxSpriteGroup;
import funkin.graphics.shaders.GaussianBlurShader;
import funkin.graphics.shaders.LeftMaskShader;
import flixel.math.FlxRect;
import flixel.tweens.FlxEase;
import flixel.util.FlxTimer;
import flixel.tweens.FlxTween;
import openfl.display.BlendMode;
import flixel.util.FlxColor;
class CapsuleText extends FlxSpriteGroup
{
public var blurredText:FlxText;
var whiteText:FlxText;
public var text(default, set):String;
var maskShaderSongName:LeftMaskShader = new LeftMaskShader();
public var clipWidth(default, set):Int = 255;
public var tooLong:Bool = false;
var glowColor:FlxColor = 0xFF00ccff;
// 255, 27 normal
// 220, 27 favourited
public function new(x:Float, y:Float, songTitle:String, size:Float)
{
super(x, y);
blurredText = initText(songTitle, size);
blurredText.shader = new GaussianBlurShader(1);
whiteText = initText(songTitle, size);
// whiteText.shader = new GaussianBlurShader(0.3);
text = songTitle;
blurredText.color = glowColor;
whiteText.color = 0xFFFFFFFF;
add(blurredText);
add(whiteText);
}
function initText(songTitle, size:Float):FlxText
{
var text:FlxText = new FlxText(0, 0, 0, songTitle, Std.int(size));
text.font = "5by7";
return text;
}
public function applyStyle(styleData:FreeplayStyle):Void
{
glowColor = styleData.getCapsuleSelCol();
blurredText.color = glowColor;
whiteText.textField.filters = [
new openfl.filters.GlowFilter(glowColor, 1, 5, 5, 210, BitmapFilterQuality.MEDIUM),
// new openfl.filters.BlurFilter(5, 5, BitmapFilterQuality.LOW)
];
}
// ???? none
// 255, 27 normal
// 220, 27 favourited
function set_clipWidth(value:Int):Int
{
resetText();
checkClipWidth(value);
return clipWidth = value;
}
/**
* Checks if the text if it's too long, and clips if it is
* @param wid
*/
function checkClipWidth(?wid:Int):Void
{
if (wid == null) wid = clipWidth;
if (whiteText.width > wid)
{
tooLong = true;
blurredText.clipRect = new FlxRect(0, 0, wid, blurredText.height);
whiteText.clipRect = new FlxRect(0, 0, wid, whiteText.height);
}
else
{
tooLong = false;
blurredText.clipRect = null;
whiteText.clipRect = null;
}
}
function set_text(value:String):String
{
if (value == null) return value;
if (blurredText == null || whiteText == null)
{
trace('WARN: Capsule not initialized properly');
return text = value;
}
blurredText.text = value;
whiteText.text = value;
checkClipWidth();
whiteText.textField.filters = [
new openfl.filters.GlowFilter(glowColor, 1, 5, 5, 210, BitmapFilterQuality.MEDIUM),
// new openfl.filters.BlurFilter(5, 5, BitmapFilterQuality.LOW)
];
return text = value;
}
var moveTimer:FlxTimer = new FlxTimer();
var moveTween:FlxTween;
public function initMove():Void
{
moveTimer.start(0.6, (timer) -> {
moveTextRight();
});
}
function moveTextRight():Void
{
var distToMove:Float = whiteText.width - clipWidth;
moveTween = FlxTween.tween(whiteText.offset, {x: distToMove}, 2,
{
onUpdate: function(_) {
whiteText.clipRect = new FlxRect(whiteText.offset.x, 0, clipWidth, whiteText.height);
blurredText.offset = whiteText.offset;
blurredText.clipRect = new FlxRect(whiteText.offset.x, 0, clipWidth, blurredText.height);
},
onComplete: function(_) {
moveTimer.start(0.3, (timer) -> {
moveTextLeft();
});
},
ease: FlxEase.sineInOut
});
}
function moveTextLeft():Void
{
moveTween = FlxTween.tween(whiteText.offset, {x: 0}, 2,
{
onUpdate: function(_) {
whiteText.clipRect = new FlxRect(whiteText.offset.x, 0, clipWidth, whiteText.height);
blurredText.offset = whiteText.offset;
blurredText.clipRect = new FlxRect(whiteText.offset.x, 0, clipWidth, blurredText.height);
},
onComplete: function(_) {
moveTimer.start(0.3, (timer) -> {
moveTextRight();
});
},
ease: FlxEase.sineInOut
});
}
public function resetText():Void
{
if (moveTween != null) moveTween.cancel();
if (moveTimer != null) moveTimer.cancel();
whiteText.offset.x = 0;
whiteText.clipRect = new FlxRect(whiteText.offset.x, 0, clipWidth, whiteText.height);
blurredText.clipRect = new FlxRect(whiteText.offset.x, 0, clipWidth, whiteText.height);
}
var flickerState:Bool = false;
var flickerTimer:FlxTimer;
public function flickerText():Void
{
resetText();
flickerTimer = new FlxTimer().start(1 / 24, flickerProgress, 19);
}
function flickerProgress(timer:FlxTimer):Void
{
if (flickerState == true)
{
whiteText.blend = BlendMode.ADD;
blurredText.blend = BlendMode.ADD;
blurredText.color = 0xFFFFFFFF;
whiteText.color = 0xFFFFFFFF;
whiteText.textField.filters = [
new openfl.filters.GlowFilter(0xFFFFFF, 1, 5, 5, 210, BitmapFilterQuality.MEDIUM),
// new openfl.filters.BlurFilter(5, 5, BitmapFilterQuality.LOW)
];
}
else
{
blurredText.color = glowColor;
whiteText.color = 0xFFDDDDDD;
whiteText.textField.filters = [
new openfl.filters.GlowFilter(0xDDDDDD, 1, 5, 5, 210, BitmapFilterQuality.MEDIUM),
// new openfl.filters.BlurFilter(5, 5, BitmapFilterQuality.LOW)
];
}
flickerState = !flickerState;
}
override function update(elapsed:Float):Void
{
super.update(elapsed);
}
}