Visual fixes for story menu

This commit is contained in:
EliteMasterEric 2023-06-27 15:21:09 -04:00
parent a4a4e705a1
commit 983466c0fe
2 changed files with 90 additions and 34 deletions

View file

@ -93,19 +93,40 @@ class Level implements IRegistryEntry<LevelData>
return true;
}
/**
* Build a sprite for the background of the level.
* Can be overriden by ScriptedLevel. Not used if `isBackgroundSimple` returns true.
*/
public function buildBackground():FlxSprite
{
if (_data.background.startsWith('#'))
{
// Color specified
var color:FlxColor = FlxColor.fromString(_data.background);
return new FlxSprite().makeGraphic(FlxG.width, 400, color);
}
else
if (!_data.background.startsWith('#'))
{
// Image specified
return new FlxSprite().loadGraphic(Paths.image(_data.background));
}
// Color specified
var result:FlxSprite = new FlxSprite().makeGraphic(FlxG.width, 400, FlxColor.WHITE);
result.color = getBackgroundColor();
return result;
}
/**
* Returns true if the background is a solid color.
* If you have a ScriptedLevel with a fancy background, you may want to override this to false.
*/
public function isBackgroundSimple():Bool
{
return _data.background.startsWith('#');
}
/**
* Returns true if the background is a solid color.
* If you have a ScriptedLevel with a fancy background, you may want to override this to false.
*/
public function getBackgroundColor():FlxColor
{
return FlxColor.fromString(_data.background);
}
public function getDifficulties():Array<String>

View file

@ -145,6 +145,10 @@ class StoryMenuState extends MusicBeatState
updateBackground();
var black:FlxSprite = new FlxSprite(levelBackground.x, 0).makeGraphic(FlxG.width, Std.int(400 + levelBackground.y), FlxColor.BLACK);
black.zIndex = levelBackground.zIndex - 1;
add(black);
levelProps = new FlxTypedGroup<LevelProp>();
levelProps.zIndex = 1000;
add(levelProps);
@ -378,6 +382,7 @@ class StoryMenuState extends MusicBeatState
if (currentIndex < 0) currentIndex = levelList.length - 1;
if (currentIndex >= levelList.length) currentIndex = 0;
var previousLevelId:String = currentLevelId;
currentLevelId = levelList[currentIndex];
updateData();
@ -393,18 +398,14 @@ class StoryMenuState extends MusicBeatState
currentLevelTitle = item;
item.alpha = 1.0;
}
else if (index > currentIndex)
{
item.alpha = 0.6;
}
else
{
item.alpha = 0.0;
item.alpha = 0.6;
}
}
updateText();
updateBackground();
updateBackground(previousLevelId);
updateProps();
refresh();
}
@ -517,32 +518,66 @@ class StoryMenuState extends MusicBeatState
});
}
function updateBackground():Void
function updateBackground(?previousLevelId:String = ''):Void
{
if (levelBackground != null)
if (levelBackground == null || previousLevelId == '')
{
var oldBackground:FlxSprite = levelBackground;
FlxTween.tween(oldBackground, {alpha: 0.0}, 0.6,
{
ease: FlxEase.linear,
onComplete: function(_) {
remove(oldBackground);
}
});
// Build a new background and display it immediately.
levelBackground = currentLevel.buildBackground();
levelBackground.x = 0;
levelBackground.y = 56;
levelBackground.zIndex = 100;
levelBackground.alpha = 1.0; // Not hidden.
add(levelBackground);
}
else
{
var previousLevel = LevelRegistry.instance.fetchEntry(previousLevelId);
levelBackground = currentLevel.buildBackground();
levelBackground.x = 0;
levelBackground.y = 56;
levelBackground.alpha = 0.0;
levelBackground.zIndex = 100;
add(levelBackground);
FlxTween.tween(levelBackground, {alpha: 1.0}, 0.6,
if (currentLevel.isBackgroundSimple() && previousLevel.isBackgroundSimple())
{
ease: FlxEase.linear
});
var previousColor:FlxColor = previousLevel.getBackgroundColor();
var currentColor:FlxColor = currentLevel.getBackgroundColor();
if (previousColor != currentColor)
{
// Both the previous and current level were simple backgrounds.
// Fade between colors directly, rather than fading one background out and another in.
FlxTween.color(levelBackground, 0.4, previousColor, currentColor);
}
else
{
// Do no fade at all if the colors aren't different.
}
}
else
{
// Either the previous or current level has a complex background.
// We need to fade the old background out and the new one in.
// Reference the old background and fade it out.
var oldBackground:FlxSprite = levelBackground;
FlxTween.tween(oldBackground, {alpha: 0.0}, 0.6,
{
ease: FlxEase.linear,
onComplete: function(_) {
remove(oldBackground);
}
});
// Build a new background and fade it in.
levelBackground = currentLevel.buildBackground();
levelBackground.x = 0;
levelBackground.y = 56;
levelBackground.alpha = 0.0; // Hidden to start.
levelBackground.zIndex = 100;
add(levelBackground);
FlxTween.tween(levelBackground, {alpha: 1.0}, 0.6,
{
ease: FlxEase.linear
});
}
}
}
function updateProps():Void