1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2025-09-04 04:38:09 +00:00
Funkin/source/funkin/ui/freeplay/BGScrollingText.hx

126 lines
2.9 KiB
Haxe
Raw Permalink Normal View History

package funkin.ui.freeplay;
2021-10-22 03:08:48 +00:00
import flixel.FlxObject;
import flixel.group.FlxSpriteGroup;
import flixel.text.FlxText;
import flixel.util.FlxSort;
2025-08-12 14:13:54 +00:00
import flixel.FlxSprite;
import flixel.util.FlxDestroyUtil;
import flixel.util.FlxColor;
2021-10-22 03:08:48 +00:00
// its kinda like marqeee html lol!
2025-05-20 08:13:08 +00:00
@:nullSafety
2021-10-22 03:08:48 +00:00
class BGScrollingText extends FlxSpriteGroup
{
2025-08-12 14:13:54 +00:00
var grpTexts:FlxTypedSpriteGroup<FlxSprite>;
var sourceText:FlxText;
public var widthShit:Float = FlxG.width;
public var placementOffset:Float = 20;
public var speed:Float = 1;
public var size(default, set):Int = 48;
2025-08-12 14:13:54 +00:00
public var funnyColor(default, set):FlxColor = 0xFFFFFFFF;
public function new(x:Float, y:Float, text:String, widthShit:Float = 100, ?bold:Bool = false, ?size:Int = 48)
{
super(x, y);
2025-08-12 14:13:54 +00:00
grpTexts = new FlxTypedSpriteGroup<FlxSprite>();
2025-05-20 08:13:08 +00:00
this.widthShit = widthShit;
2025-08-12 14:13:54 +00:00
// Only keep one FlxText graphic at a time for batching
sourceText = new FlxText(0, 0, 0, text, size ?? this.size);
sourceText.font = "5by7";
sourceText.bold = bold ?? false;
@:privateAccess
sourceText.regenGraphic();
2025-08-12 14:13:54 +00:00
var needed:Int = Math.ceil(widthShit / sourceText.frameWidth) + 1;
for (i in 0...needed)
{
2025-08-12 14:13:54 +00:00
var coolText = new FlxSprite((i * sourceText.frameWidth) + (i * 20), 0);
grpTexts.add(coolText);
}
2025-08-12 14:13:54 +00:00
if (size != null) this.size = size;
add(grpTexts);
}
2025-08-12 14:13:54 +00:00
function reloadGraphics()
{
if (grpTexts != null)
{
2025-08-12 14:13:54 +00:00
@:privateAccess
sourceText.regenGraphic();
grpTexts.forEach(function(txt:FlxSprite) {
txt.loadGraphic(sourceText.graphic);
txt.updateHitbox();
});
}
2025-08-12 14:13:54 +00:00
}
function set_size(value:Int):Int
{
sourceText.size = value;
reloadGraphics();
this.size = value;
return value;
}
2025-08-12 14:13:54 +00:00
function set_funnyColor(value:FlxColor):FlxColor
{
2025-08-12 14:13:54 +00:00
sourceText.color = value;
reloadGraphics();
this.funnyColor = value;
return value;
}
override public function update(elapsed:Float)
{
for (txt in grpTexts.group)
{
2025-05-20 08:13:08 +00:00
if (txt == null) continue;
txt.x -= 1 * (speed * (elapsed / (1 / 60)));
if (speed > 0)
{
if (txt.x < -txt.frameWidth)
{
txt.x = grpTexts.group.members[grpTexts.length - 1].x + grpTexts.group.members[grpTexts.length - 1].frameWidth + placementOffset;
sortTextShit();
}
}
else
{
if (txt.x > txt.frameWidth * 2)
{
txt.x = grpTexts.group.members[0].x - grpTexts.group.members[0].frameWidth - placementOffset;
sortTextShit();
}
}
}
super.update(elapsed);
}
function sortTextShit():Void
{
2023-06-08 20:30:45 +00:00
grpTexts.sort(function(Order:Int, Obj1:FlxObject, Obj2:FlxObject) {
return FlxSort.byValues(Order, Obj1.x, Obj2.x);
});
}
2025-08-12 14:13:54 +00:00
override function destroy():Void
{
super.destroy();
sourceText = FlxDestroyUtil.destroy(sourceText);
}
2021-10-22 03:08:48 +00:00
}