new alphabet in progress!

This commit is contained in:
SrtHero278
2024-06-19 16:41:23 -07:00
parent 3683a54298
commit 144aed7c81
6 changed files with 264 additions and 0 deletions
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE codename-engine-alphabet-font>
<alphabetFont fps="24" advance="50" lineGap="75" forceCasing="upper">
<spritesheet>menus/alphabet-bold</spritesheet>
<defaultAnim>LETTER bold</defaultAnim>
</alphabetFont>
+23
View File
@@ -0,0 +1,23 @@
<!DOCTYPE codename-engine-alphabet-font>
<alphabetFont fps="24" advance="30" lineGap="70">
<spritesheet>menus/alphabet</spritesheet>
<defaultAnim casing="upper">LETTER capital</defaultAnim>
<defaultAnim casing="lower">LETTER lowercase</defaultAnim>
<defaultAnim>LETTER</defaultAnim>
<anim char="$">dollarsign</anim>
<anim char="#">hashtag</anim>
<anim char="&amp;">amp</anim>
<anim char="→" y="9">right arrow</anim>
<anim char="←" y="9">left arrow</anim>
<anim char="↓" y="5">down arrow</anim>
<anim char="↑" y="4">up arrow</anim>
<anim char="," y="-9">comma</anim>
<anim char=".">period</anim>
<anim char="?">question mark</anim>
<anim char="&#34;" y="22">start parentheses</anim>
<anim char="^" y="28">^</anim>
<anim char="~" y="17">~</anim>
<anim char="=" y="13">=</anim>
</alphabetFont>
+3
View File
@@ -153,6 +153,9 @@
<!-- Comment this out to disable dark mode windows -->
<define name="DARK_MODE_WINDOW"/>
<!-- Temporary define. Remove all instances of alphabet testing when finished. -->
<define name="ALPHABET_TESTING"/>
<haxedef name="VIDEO_CUTSCENES" if="VIDEO_CUTSCENES" />
<haxedef name="UPDATE_CHECKING" if="UPDATE_CHECKING" />
<haxedef name="DISCORD_RPC" if="DISCORD_RPC" />
@@ -61,12 +61,16 @@ class MainState extends FlxState {
EventsData.reloadEvents();
TitleState.initialized = false;
#if (ALPHABET_TESTING)
FlxG.switchState(new funkin.menus.ui.NewAlphabetTest());
#else
if (betaWarningShown)
FlxG.switchState(new TitleState());
else {
FlxG.switchState(new BetaWarningState());
betaWarningShown = true;
}
#end
CoolUtil.safeSetAttribute('./.temp/', HIDDEN);
}
+190
View File
@@ -0,0 +1,190 @@
package funkin.menus.ui;
import haxe.xml.Access;
using StringTools;
enum abstract AlphabetAlignment(String) from String to String {
var LEFT = "left";
var CENTER = "center";
var RIGHT = "right";
public function getMultiplier():Float {
return switch(this) {
case CENTER: 0.5;
case RIGHT: 1.0;
default: 0.0;
}
}
}
class NewAlphabet extends FlxSprite {
public var text(default, set):String = "";
@:isVar public var textWidth(get, set):Float;
public var textHeight(get, null):Float;
public var alignment:AlphabetAlignment = LEFT;
var __laneWidths:Array<Float> = []; // TODO: add alignment.
var __forceWidth:Float = 0; // TODO: implement functionality for this.
var __queueResize:Bool = false;
var __animTime:Float = 0;
public var font(default, set):String;
var defaultAdvance:Float = 40;
var forceCase:String = "none";
var lineGap:Float = 75;
var fps:Int = 24;
var defaults:Map<String, String> = [];
var anims:Map<String, String> = [];
var failedLetters:Array<String> = [];
var yOffset:Map<String, Float> = [];
public function new(?x:Float, ?y:Float, ?font:String = "bold") {
super(x, y);
this.font = font;
}
override function draw() {
__animTime += FlxG.elapsed;
var curLine = 0;
var daText = switch (forceCase) {
case "upper": text.toUpperCase();
case "lower": text.toLowerCase();
default: text;
}
var ogOffX = frameOffset.x;
var ogOffY = frameOffset.y;
frameOffset.addPoint(origin);
frameOffset.x -= (textWidth - __laneWidths[0]) * alignment.getMultiplier();
offset.subtractPoint(origin);
for (i in 0...daText.length) {
var letter = daText.charAt(i);
if (letter == "\n") {
curLine++;
frameOffset.x = textWidth * 0.5 - (textWidth - __laneWidths[curLine]) * alignment.getMultiplier();
frameOffset.y -= lineGap;
continue;
}
var anim = getLetterAnim(letter);
if (anim == null) {
frameOffset.x -= defaultAdvance;
} else {
var frameToGet = Math.floor(__animTime * fps) % anim.numFrames;
frame = frames.frames[anim.frames[frameToGet]];
var offsetY = frame.sourceSize.y - lineGap;
frameOffset.y += offsetY + (yOffset.exists(letter) ? yOffset.get(letter) : 0);
super.draw();
frameOffset.y -= offsetY + (yOffset.exists(letter) ? yOffset.get(letter) : 0);
frameOffset.x -= frame.sourceSize.x;
}
}
frameOffset.set(ogOffX, ogOffY);
offset.addPoint(origin);
}
override function updateHitbox() {
width = Math.abs(scale.x) * textWidth;
height = Math.abs(scale.y) * textHeight;
offset.set(-0.5 * (width - textWidth), -0.5 * (height - textHeight));
origin.set(textWidth * 0.5, textHeight * 0.5);
}
function recalcSizes():Void {
__queueResize = false;
var curLine = 0;
var daText = switch (forceCase) {
case "upper": text.toUpperCase();
case "lower": text.toLowerCase();
default: text;
}
@:bypassAccessor textWidth = 0;
textHeight = lineGap;
__laneWidths = [0];
for (i in 0...daText.length) {
var letter = daText.charAt(i);
if (letter == "\n") {
textHeight += lineGap;
__laneWidths.push(0);
curLine++;
continue;
}
var anim = getLetterAnim(letter);
__laneWidths[curLine] += (anim != null) ? frames.frames[anim.frames[0]].sourceSize.x : defaultAdvance;
@:bypassAccessor textWidth = Math.max(textWidth, __laneWidths[curLine]);
}
origin.set(textWidth * 0.5, textHeight * 0.5);
}
function getLetterAnim(char:String) {
if (failedLetters.contains(char)) return null;
else if (animation.exists(char)) return animation.getByName(char);
var charCode:Int = char.charCodeAt(0);
var anim:String = defaults.get("<NORMAL>").replace("LETTER", char);
if (charCode >= 65 && charCode <= 90 && defaults.exists("UPPER"))
anim = defaults.get("UPPER").replace("LETTER", char);
else if (charCode >= 97 && charCode <= 122 && defaults.exists("LOWER"))
anim = defaults.get("LOWER").replace("LETTER", char);
if (anims.exists(char))
anim = anims.get(char);
animation.addByPrefix(char, anim, fps);
if (!animation.exists(char)) {
failedLetters.push(char);
return null;
}
return animation.getByName(char);
}
function get_textWidth():Float {
if (__queueResize)
recalcSizes();
return textWidth;
}
function set_textWidth(value:Float):Float {
__queueResize = __queueResize || (__forceWidth != value);
return __forceWidth = value;
}
function get_textHeight():Float {
if (__queueResize)
recalcSizes();
return textHeight;
}
function set_text(value:String):String {
__queueResize = __queueResize || (text != value);
return text = value;
}
function set_font(value:String):String {
if (font != value) {
__queueResize = true;
trace(Paths.xml("alphabet/" + value));
var xml:Xml = Xml.parse(openfl.Assets.getText(Paths.xml("alphabet/" + value))).firstElement();
defaultAdvance = Std.parseFloat(xml.get("advance")).getDefault(40);
lineGap = Std.parseFloat(xml.get("lineGap")).getDefault(75);
fps = Std.parseInt(xml.get("fps")).getDefault(24);
forceCase = xml.get("forceCasing").getDefault("none").toLowerCase();
for (node in xml.elements()) {
switch (node.nodeName) {
case "spritesheet":
frames = Paths.getFrames(node.firstChild().nodeValue);
case "defaultAnim":
defaults.set(node.get("casing").getDefault("<NORMAL>").toUpperCase(), node.firstChild().nodeValue);
case "anim":
anims.set(node.get("char"), node.firstChild().nodeValue);
if (node.exists("y"))
yOffset.set(node.get("char"), Std.parseFloat(node.get("y")).getDefault(0));
}
}
}
return font = value;
}
}
+38
View File
@@ -0,0 +1,38 @@
package funkin.menus.ui;
#if (ALPHABET_TESTING)
/**
* TEMPORARY CLASS.
*/
class NewAlphabetTest extends MusicBeatState {
var alphabet:NewAlphabet;
override function create() {
super.create();
bgColor = 0xFF808080;
alphabet = new NewAlphabet(100, 360, "bold");
alphabet.text = "hi tarr\ninsert smiley face";
alphabet.alignment = CENTER;
add(alphabet);
}
override function update(elapsed:Float) {
super.update(elapsed);
if (controls.ACCEPT) {
switch (alphabet.alignment) {
case LEFT:
alphabet.text = "hey dont put me\non center.";
alphabet.alignment = CENTER;
case CENTER:
alphabet.text = "hey put me\nback! >:(";
alphabet.alignment = RIGHT;
case RIGHT:
alphabet.text = "Thank you.\nJeez some people.";
alphabet.alignment = LEFT;
}
}
}
}
#end