diff --git a/source/FreeplayState.hx b/source/FreeplayState.hx index e8ec9effe..b3bd97dd0 100644 --- a/source/FreeplayState.hx +++ b/source/FreeplayState.hx @@ -6,19 +6,25 @@ import flixel.FlxGame; import flixel.FlxSprite; import flixel.FlxState; import flixel.addons.display.FlxGridOverlay; +import flixel.addons.transition.FlxTransitionableState; import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.group.FlxGroup; import flixel.input.touch.FlxTouch; import flixel.math.FlxAngle; import flixel.math.FlxMath; import flixel.math.FlxPoint; import flixel.text.FlxText; +import flixel.tweens.FlxEase; import flixel.tweens.FlxTween; import flixel.util.FlxColor; +import flixel.util.FlxSpriteUtil; import flixel.util.FlxTimer; +import freeplayStuff.BGScrollingText; import freeplayStuff.DJBoyfriend; import freeplayStuff.SongMenuItem; import lime.app.Future; import lime.utils.Assets; +import shaderslmfao.AngleMask; using StringTools; @@ -55,6 +61,8 @@ class FreeplayState extends MusicBeatState override function create() { + FlxTransitionableState.skipNextTransIn = true; + #if discord_rpc // Updating Discord Rich Presence DiscordClient.changePresence("In the Menus", null); @@ -114,12 +122,95 @@ class FreeplayState extends MusicBeatState trace(FlxCamera.defaultZoom); trace(FlxG.initialZoom); + var pinkBack:FlxSprite = new FlxSprite().loadGraphic(Paths.image('freeplay/pinkBack')); + pinkBack.color = 0xFFffd4e9; // sets it to pink! + pinkBack.x -= pinkBack.width; + + FlxTween.tween(pinkBack, {x: 0}, 0.6, {ease: FlxEase.quartOut}); + add(pinkBack); + + var orangeBackShit:FlxSprite = new FlxSprite(84, FlxG.height * 0.68).makeGraphic(Std.int(pinkBack.width), 50, 0xFFffd400); + add(orangeBackShit); + + var alsoOrangeLOL:FlxSprite = new FlxSprite(0, orangeBackShit.y).makeGraphic(100, Std.int(orangeBackShit.height), 0xFFffd400); + add(alsoOrangeLOL); + + FlxSpriteUtil.alphaMaskFlxSprite(orangeBackShit, pinkBack, orangeBackShit); + orangeBackShit.visible = false; + alsoOrangeLOL.visible = false; + + var grpTxtScrolls:FlxGroup = new FlxGroup(); + add(grpTxtScrolls); + grpTxtScrolls.visible = false; + + var moreWays:BGScrollingText = new BGScrollingText(0, 200, "HOT BLOODED IN MORE WAYS THAN ONE", FlxG.width); + moreWays.funnyColor = 0xFFfff383; + moreWays.speed = 2; + grpTxtScrolls.add(moreWays); + + var funnyScroll:BGScrollingText = new BGScrollingText(0, 250, "BOYFRIEND", FlxG.width / 2); + funnyScroll.funnyColor = 0xFFff9963; + funnyScroll.speed = -0.5; + grpTxtScrolls.add(funnyScroll); + + var txtNuts:BGScrollingText = new BGScrollingText(0, 300, "PROTECT YO NUTS", FlxG.width / 2); + grpTxtScrolls.add(txtNuts); + + var funnyScroll2:BGScrollingText = new BGScrollingText(0, 340, "BOYFRIEND", FlxG.width / 2); + funnyScroll2.funnyColor = 0xFFff9963; + funnyScroll2.speed = -0.6; + grpTxtScrolls.add(funnyScroll2); + + var moreWays2:BGScrollingText = new BGScrollingText(0, 400, "HOT BLOODED IN MORE WAYS THAN ONE", FlxG.width); + moreWays2.funnyColor = 0xFFfff383; + moreWays2.speed = 2.2; + grpTxtScrolls.add(moreWays2); + + var funnyScroll3:BGScrollingText = new BGScrollingText(0, orangeBackShit.y, "BOYFRIEND", FlxG.width / 2); + funnyScroll3.funnyColor = 0xFFff9963; + funnyScroll3.speed = -0.4; + grpTxtScrolls.add(funnyScroll3); + + var dj:DJBoyfriend = new DJBoyfriend(0, -100); + add(dj); + + var bgDad:FlxSprite = new FlxSprite(FlxG.width, 0).loadGraphic(Paths.image('freeplay/freeplayBGdad')); + bgDad.setGraphicSize(0, FlxG.height); + bgDad.updateHitbox(); + bgDad.shader = new AngleMask(); + + var blackOverlayBullshitLOLXD:FlxSprite = new FlxSprite(pinkBack.width * 0.75).makeGraphic(Std.int(bgDad.width), Std.int(bgDad.height), + FlxColor.BLACK); + add(blackOverlayBullshitLOLXD); // used to mask the text lol! + add(bgDad); + + blackOverlayBullshitLOLXD.shader = bgDad.shader; + grpSongs = new FlxTypedGroup(); add(grpSongs); grpCapsules = new FlxTypedGroup(); add(grpCapsules); + var overhangStuff:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, 64, FlxColor.BLACK); + overhangStuff.y -= overhangStuff.height; + add(overhangStuff); + + var fnfFreeplay:FlxText = new FlxText(0, -64, 0, "Freeplay", 48); + fnfFreeplay.font = "VCR OSD Mono"; + add(fnfFreeplay); + + dj.animHITsignal.add(function() + { + pinkBack.color = 0xFFffd863; + FlxTween.tween(overhangStuff, {y: 0}, 0.3, {ease: FlxEase.quartOut}); + FlxTween.tween(fnfFreeplay, {y: 12}, 0.3, {ease: FlxEase.quartOut, startDelay: 0.5}); + FlxTween.tween(bgDad, {x: pinkBack.width * 0.75}, 1, {ease: FlxEase.quintOut}); + orangeBackShit.visible = true; + alsoOrangeLOL.visible = true; + grpTxtScrolls.visible = true; + }); + for (i in 0...songs.length) { var funnyMenu:SongMenuItem = new SongMenuItem(FlxG.width, (i * 150) + 160, songs[i].songName); @@ -170,9 +261,6 @@ class FreeplayState extends MusicBeatState changeSelection(); changeDiff(); - var dj:DJBoyfriend = new DJBoyfriend(0, -100); - add(dj); - // FlxG.sound.playMusic(Paths.music('title'), 0); // FlxG.sound.music.fadeIn(2, 0, 0.8); // selector = new FlxText(); diff --git a/source/freeplayStuff/BGScrollingText.hx b/source/freeplayStuff/BGScrollingText.hx new file mode 100644 index 000000000..2a4a354cb --- /dev/null +++ b/source/freeplayStuff/BGScrollingText.hx @@ -0,0 +1,93 @@ +package freeplayStuff; + +import flixel.FlxObject; +import flixel.group.FlxGroup.FlxTypedGroup; +import flixel.group.FlxSpriteGroup; +import flixel.math.FlxMath; +import flixel.text.FlxText; +import flixel.util.FlxColor; +import flixel.util.FlxSort; + +// its kinda like marqeee html lol! +class BGScrollingText extends FlxSpriteGroup +{ + var grpTexts:FlxTypedSpriteGroup; + + public var widthShit:Float = FlxG.width; + public var placementOffset:Float = 20; + public var speed:Float = 1; + + public var funnyColor(default, set):Int = 0xFFFFFFFF; + + public function new(x:Float, y:Float, text:String, widthShit:Float = 100) + { + super(x, y); + + this.widthShit = widthShit; + + grpTexts = new FlxTypedSpriteGroup(); + add(grpTexts); + + var testText:FlxText = new FlxText(0, 0, 0, text, 48); + testText.font = "5by7"; + testText.updateHitbox(); + grpTexts.add(testText); + + var needed:Int = Math.ceil(widthShit / testText.frameWidth); + + for (i in 0...needed) + { + var lmfao:Int = i + 1; + + var coolText:FlxText = new FlxText((lmfao * testText.frameWidth) + (lmfao * 20), 0, 0, text, 48); + coolText.font = "5by7"; + coolText.updateHitbox(); + grpTexts.add(coolText); + } + } + + function set_funnyColor(col:Int):Int + { + grpTexts.forEach(function(txt) + { + txt.color = col; + }); + + return col; + } + + override function update(elapsed:Float) + { + for (txt in grpTexts.group) + { + txt.x -= 1 * speed; + + 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 > widthShit) + { + txt.x = grpTexts.group.members[0].x - grpTexts.group.members[0].frameWidth - placementOffset; + sortTextShit(); + } + } + } + + super.update(elapsed); + } + + function sortTextShit():Void + { + grpTexts.sort(function(Order:Int, Obj1:FlxObject, Obj2:FlxObject) + { + return FlxSort.byValues(Order, Obj1.x, Obj2.x); + }); + } +} diff --git a/source/freeplayStuff/DJBoyfriend.hx b/source/freeplayStuff/DJBoyfriend.hx index c1e8428ee..25c725b11 100644 --- a/source/freeplayStuff/DJBoyfriend.hx +++ b/source/freeplayStuff/DJBoyfriend.hx @@ -1,13 +1,18 @@ package freeplayStuff; import flixel.FlxSprite; +import flixel.util.FlxSignal; class DJBoyfriend extends FlxSprite { + public var animHITsignal:FlxSignal; + public function new(x:Float, y:Float) { super(x, y); + animHITsignal = new FlxSignal(); + animOffsets = new Map>(); frames = Paths.getSparrowAtlas('freeplay/bfFreeplay'); @@ -24,6 +29,7 @@ class DJBoyfriend extends FlxSprite switch (anim) { case "intro": + animHITsignal.dispatch(); playAnim('idle'); // plays idle anim after playing intro } }; diff --git a/source/shaderslmfao/AngleMask.hx b/source/shaderslmfao/AngleMask.hx new file mode 100644 index 000000000..2b276de05 --- /dev/null +++ b/source/shaderslmfao/AngleMask.hx @@ -0,0 +1,43 @@ +package shaderslmfao; + +import flixel.system.FlxAssets.FlxShader; + +class AngleMask extends FlxShader +{ + @:glFragmentSource(' + #pragma header + uniform vec2 endPosition; + void main() + { + vec4 base = texture2D(bitmap, openfl_TextureCoordv); + + vec2 uv = openfl_TextureCoordv.xy; + + + + vec2 start = vec2(0.0, 0.0); + vec2 end = vec2(endPosition.x / openfl_TextureSize.x, 1.0); + + float dx = end.x - start.x; + float dy = end.y - start.y; + + float angle = atan(dy, dx); + + uv.x -= start.x; + uv.y -= start.y; + + float uvA = atan(uv.y, uv.x); + + if (uvA < angle) + gl_FragColor = base; + else + gl_FragColor = vec4(0.0); + + }') + public function new() + { + super(); + + endPosition.value = [90, 100]; // 100 AS DEFAULT WORKS NICELY FOR FREEPLAY? + } +}