From 4285307d70290315fbea46438aef5b368815823b Mon Sep 17 00:00:00 2001 From: SrtHero278 Date: Sun, 14 Apr 2024 15:39:14 -0700 Subject: [PATCH] some liveshare tomfoolery got scale points working with huge help from ne_eo Co-authored-by: Ne_Eo --- assets/data/stages/test.xml | 36 ++ assets/data/states/StageEditor.hx | 133 +++++++ source/funkin/backend/utils/CoolUtil.hx | 15 + source/funkin/editors/stage/StageEditor.hx | 340 ++++++++++-------- .../stage/elements/StageCharacterButton.hx | 4 +- .../stage/elements/StageElementButton.hx | 9 +- .../stage/elements/StageSpriteButton.hx | 4 +- source/funkin/editors/ui/UISliceSprite.hx | 18 + source/funkin/game/Stage.hx | 1 + 9 files changed, 414 insertions(+), 146 deletions(-) create mode 100644 assets/data/stages/test.xml create mode 100644 assets/data/states/StageEditor.hx diff --git a/assets/data/stages/test.xml b/assets/data/stages/test.xml new file mode 100644 index 00000000..f74dbd01 --- /dev/null +++ b/assets/data/stages/test.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/data/states/StageEditor.hx b/assets/data/states/StageEditor.hx new file mode 100644 index 00000000..e37acc0b --- /dev/null +++ b/assets/data/states/StageEditor.hx @@ -0,0 +1,133 @@ +/** + * THIS FILE IS TEMPORARY UNTIL TRANSFORMS ARE AT A USEABLE STATE. + * TODO: + * - !!!! MOVE BACK TO SOURCE !!!! + * - Rotation + * - Skewing + * - Angle + Scale (like already at a angle) + */ + +import funkin.editors.stage.StageEditor; +import funkin.backend.utils.WindowUtils; +import openfl.Lib; + +var exID = StageEditor.exID; + +function tryUpdateHitbox(sprite) { + var spriteNode = sprite.extra.get(exID("node")); + if (spriteNode.exists("updateHitbox") && spriteNode.get("updateHitbox") == "true") { + sprite.updateHitbox(); + return true; + } + + if (!FlxG.keys.pressed.ALT) { + sprite.x = storedPos.x - (sprite.frameWidth * (storedScale.x - sprite.scale.x) * 0.5); + sprite.y = storedPos.y - (sprite.frameHeight * (storedScale.y - sprite.scale.y) * 0.5); + } + return false; +} + +function create() { + WindowUtils.preventClosing = true; + WindowUtils.resetClosing(); + WindowUtils.onClosing = function() { + if(!FlxG.keys.pressed.ALT) { + Lib.application.window.onClose.cancel(); + FlxG.switchState(new StageEditor("test")); + trace("you dont need to close doofus goofus"); + } + } +} + +function update() { + if(FlxG.keys.justPressed.R) { + trace("reloading"); + FlxG.switchState(new StageEditor("test")); + } +} + +function genericScale(sprite, relative, doX, doY) { + if (FlxG.keys.pressed.ALT) { + relative.x *= 2; + relative.y *= 2; + } + + var width = sprite.frameWidth * storedScale.x; + var height = sprite.frameHeight * storedScale.y; + if(doX) width -= relative.x; + if(doY) height -= relative.y; + CoolUtil.setGraphicSizeFloat(sprite, width, height); + + if(FlxG.keys.pressed.SHIFT) { + var nscale = Math.max(sprite.scale.x, sprite.scale.y); + sprite.scale.set(nscale, nscale); + } + + var updatedHitbox = tryUpdateHitbox(sprite); + if (FlxG.keys.pressed.ALT) { + sprite.x = storedPos.x; + sprite.y = storedPos.y; + if(updatedHitbox) { + sprite.x += (sprite.frameWidth * (storedScale.x - sprite.scale.x) * 0.5); + sprite.y += (sprite.frameHeight * (storedScale.y - sprite.scale.y) * 0.5); + } + return true; + } + return !updatedHitbox; +} + +function genericOppositeScale(sprite, relative, scaleX, scaleY, repositionX, repositionY) { + if(repositionX) relative.x *= -1; + if(repositionY) relative.y *= -1; + var repositioned = genericScale(sprite, relative, scaleX, scaleY); + if (!repositioned) { + if(repositionX) sprite.x = storedPos.x + (sprite.frameWidth * (storedScale.x - sprite.scale.x)); + if(repositionY) sprite.y = storedPos.y + (sprite.frameHeight * (storedScale.y - sprite.scale.y)); + } else if (!FlxG.keys.pressed.ALT) { + if(repositionX) sprite.x += (sprite.frameWidth * (storedScale.x - sprite.scale.x)); + if(repositionY) sprite.y += (sprite.frameHeight * (storedScale.y - sprite.scale.y)); + } +} + +function SCALE_BOTTOM_RIGHT(sprite, relative) { + genericScale(sprite, relative, true, true); +} + +function SCALE_TOP_RIGHT(sprite, relative) { + genericOppositeScale(sprite, relative, true, true, false, true); +} + +function SCALE_TOP_LEFT(sprite, relative) { + genericOppositeScale(sprite, relative, true, true, true, true); +} + +function SCALE_BOTTOM_LEFT(sprite, relative) { + genericOppositeScale(sprite, relative, true, true, true, false); +} + +function SCALE_LEFT(sprite, relative) { + genericOppositeScale(sprite, relative, true, false, true, false); +} + +function SCALE_RIGHT(sprite, relative) { + genericScale(sprite, relative, true, false); +} + +function SCALE_TOP(sprite, relative) { + genericOppositeScale(sprite, relative, false, true, false, true); +} + +function SCALE_BOTTOM(sprite, relative) { + genericScale(sprite, relative, false, true); +} + +function SKEW_LEFT(sprite, relative) {} + +function SKEW_BOTTOM(sprite, relative) {} + +function SKEW_TOP(sprite, relative) {} + +function SKEW_RIGHT(sprite, relative) {} + +function ROTATE(sprite, relative) {} + diff --git a/source/funkin/backend/utils/CoolUtil.hx b/source/funkin/backend/utils/CoolUtil.hx index 36f817e8..240e2dde 100644 --- a/source/funkin/backend/utils/CoolUtil.hx +++ b/source/funkin/backend/utils/CoolUtil.hx @@ -416,6 +416,21 @@ class CoolUtil sprite.scale.set(nScale, nScale); } + public static function setGraphicSizeFloat(sprite:FlxSprite, Width:Float = 0, Height:Float = 0):Void + { + if (Width <= 0 && Height <= 0) + return; + + var newScaleX:Float = Width / sprite.frameWidth; + var newScaleY:Float = Height / sprite.frameHeight; + sprite.scale.set(newScaleX, newScaleY); + + if (Width <= 0) + sprite.scale.x = newScaleY; + else if (Height <= 0) + sprite.scale.y = newScaleX; + } + /** * Returns a simple string representation of a FlxKey. Used in Controls options. * @param key Key diff --git a/source/funkin/editors/stage/StageEditor.hx b/source/funkin/editors/stage/StageEditor.hx index d8b9cd31..fa737305 100644 --- a/source/funkin/editors/stage/StageEditor.hx +++ b/source/funkin/editors/stage/StageEditor.hx @@ -1,5 +1,6 @@ package funkin.editors.stage; +import lime.ui.MouseCursor; import flixel.math.FlxAngle; import flixel.math.FlxPoint; import flixel.math.FlxRect; @@ -13,6 +14,7 @@ import funkin.game.Character; import funkin.game.Stage; import haxe.xml.Access; import haxe.xml.Printer; +import openfl.ui.Mouse; using funkin.backend.utils.MatrixUtil; @@ -32,7 +34,6 @@ class StageEditor extends UIState { public var uiGroup:FlxTypedGroup = new FlxTypedGroup(); public var stageSpritesWindow:UIButtonList; - public var stageSprites:FlxTypedGroup = new FlxTypedGroup(); public var xmlMap:Map = new Map(); @@ -43,7 +44,12 @@ class StageEditor extends UIState { public var guideCamera:FlxCamera; public var uiCamera:FlxCamera; - public static var selection:Selection; + public var selection:Selection = new Selection(); + public var mouseMode:StageEditorMouseMode = NONE; + public var mousePoint:FlxPoint = new FlxPoint(); + public var clickPoint:FlxPoint = new FlxPoint(); + public var storedPos:FlxPoint = new FlxPoint(); + public var storedScale:FlxPoint = new FlxPoint(); public var showOutlines:Bool = true; public var showCharacters:Bool = true; @@ -182,6 +188,7 @@ class StageEditor extends UIState { if(sprite is FunkinSprite) { var sprite:FunkinSprite = cast sprite; name = sprite.name; + sprite.extra.set(exID("node"), node); sprite.extra.set(exID("type"), node.name); sprite.extra.set(exID("imageFile"), '${node.getAtt("sprite").getDefault(sprite.name)}'); //sprite.active = false; @@ -217,10 +224,6 @@ class StageEditor extends UIState { order.push(sprite); xmlMap.set(sprite, node); - //var t = new StageSprite(name, sprite); - //t.node = node; - //stageSprites.add(t); - return sprite; } stage.loadXml(stage.stageXML, true); @@ -234,12 +237,6 @@ class StageEditor extends UIState { charMap[charPos.name] = char; } - add(stageSprites); - - for(spr in order) { - - } - setZoom(stage.defaultZoom); topMenuSpr = new UITopMenu(topMenu); @@ -251,6 +248,8 @@ class StageEditor extends UIState { var buttonSize:FlxPoint = FlxPoint.get(width-margin*2, 32); stageSpritesWindow = new UIButtonList(Std.int(FlxG.width - width), TOP_MENU_HEIGHT, width, Std.int(FlxG.height - TOP_MENU_HEIGHT), "Stage Sprites", buttonSize); stageSpritesWindow.collapsable = true; + stageSpritesWindow.middleAlpha = 0.5; + stageSpritesWindow.bottomAlpha = 0.5; stageSpritesWindow.addButton.callback = () -> { // TODO: implement this } @@ -311,6 +310,8 @@ class StageEditor extends UIState { //if (character != null) // characterPropertiresWindow.characterInfo.text = '${character.getNameList().length} Animations\nFlipped: ${character.flipX}\nSprite: ${character.sprite}\nAnim: ${character.getAnimName()}\nOffset: (${character.frameOffset.x}, ${character.frameOffset.y})'; + currentCursor = ARROW; + if ((!stageSpritesWindow.hovered && !stageSpritesWindow.dragging) && !topMenuSpr.hovered) { if (FlxG.mouse.wheel != 0) { zoom += 0.25 * FlxG.mouse.wheel; @@ -370,17 +371,23 @@ class StageEditor extends UIState { } }*/ + for(sprite in selection) { + if(sprite is FunkinSprite) { + handleSelection(cast sprite); + } + } + //if (FlxG.mouse.justReleasedRight) { // closeCurrentContextMenu(); // openContextMenu(topMenu[2].childs); //} - if (FlxG.mouse.pressed) { + + if (FlxG.mouse.pressed && mouseMode == NONE) { nextScroll.set(nextScroll.x - FlxG.mouse.deltaScreenX, nextScroll.y - FlxG.mouse.deltaScreenY); currentCursor = HAND; - } else - currentCursor = ARROW; - } else if (!FlxG.mouse.pressed) - currentCursor = ARROW; + } + }/* else if (!FlxG.mouse.pressed) + currentCursor = ARROW;*/ stageCamera.scroll.set( lerp(stageCamera.scroll.x, nextScroll.x, 0.35), @@ -394,6 +401,7 @@ class StageEditor extends UIState { } public function selectSprite(_sprite:FunkinSprite) { + selection = new Selection([]); var sprites = stageSpritesWindow.buttons.members.map((o) -> o.getSprite()).filter((o) -> o != null);// && o.animateAtlas == null); for(sprite in sprites) { if(sprite is FunkinSprite) { @@ -406,6 +414,8 @@ class StageEditor extends UIState { var sprite:FunkinSprite = cast _sprite; sprite.extra.set(exID("selected"), true); sprite.extra.get(exID("button")).selected = true; + selection = new Selection([sprite]); + Logs.trace("Selected " + sprite.name); } } @@ -592,28 +602,23 @@ class StageEditor extends UIState { super.draw(); if(!showOutlines) return; - + mousePoint = FlxG.mouse.getWorldPosition(stageCamera, mousePoint); if(dot == null) { - dot = new FlxSprite().makeGraphic(10, 10, FlxColor.WHITE); + dot = new FlxSprite().makeGraphic(30, 30, FlxColor.WHITE); dot.camera = stageCamera; dot.forceIsOnScreen = true; } - for(sprite in stage.stageSprites) { - if(sprite.visible && sprite.isOnScreen(stageCamera)) { + for(sprite in selection) { + if(sprite is FunkinSprite) { @:privateAccess if(sprite._frame == null) continue; - drawGuides(sprite); - } - } - if(showCharacters) { - for(char in chars) { - if(char.visible && char.isOnScreen(stageCamera)) { - @:privateAccess if(char._frame == null) continue; - drawGuides(char); - } + drawGuides(cast sprite); } } } + var lineColor = 0xFFb794b6; + var circleColor = 0xFF99a8f2; + function drawGuides(sprite:FlxSprite) { var oldWidth = sprite.width; var oldHeight = sprite.height; @@ -652,30 +657,125 @@ class StageEditor extends UIState { } cast(sprite.extra.get(exID("bounds")), FlxRect).set(minX, minY, maxX - minX, maxY - minY); } + var funkinSprite = sprite is FunkinSprite ? cast(sprite, FunkinSprite) : null; - dot.color = FlxColor.RED; - if(sprite is FunkinSprite) { - var sprite:FunkinSprite = cast sprite; - if(sprite.extra.get(exID("selected")) == true) { - dot.color = FlxColor.GREEN; + if(funkinSprite != null) { + if(funkinSprite.extra.exists(exID("buttonBoxes"))) { + var oldButtonBoxes:Array = cast funkinSprite.extra.get(exID("buttonBoxes")); + if(oldButtonBoxes != null) { + for(point in oldButtonBoxes) { + point.put(); + } + } } } - - for(corner in corners) { - drawDot(corner.x, corner.y); - corner.put(); + var buttonBoxes = []; + if(funkinSprite != null) { + funkinSprite.extra.set(exID("buttonBoxes"), buttonBoxes); } + dot.color = lineColor; + drawLine(corners[0], corners[1]); // tl - tr drawLine(corners[0], corners[2]); // tl - bl drawLine(corners[1], corners[3]); // tr - br drawLine(corners[2], corners[3]); // bl - br + // cross + //drawLine(corners[0], corners[3]); // tl - br + //drawLine(corners[1], corners[2]); // tr - bl + + dot.color = circleColor; + + for(corner in corners) { + drawDot(corner.x, corner.y); + buttonBoxes.push(corner); + } + + if(funkinSprite == null) { + for(corner in buttonBoxes) { + corner.put(); + } + } // reset hitbox to old values sprite.width = oldWidth; sprite.height = oldHeight; } + var edges:Array = [ + //// corners + TOP_LEFT, //FlxPoint.get(0, 0), + TOP_RIGHT, //FlxPoint.get(1, 0), + BOTTOM_LEFT, //FlxPoint.get(0, 1), + BOTTOM_RIGHT, //FlxPoint.get(1, 1), + //// edges + MIDDLE_LEFT, //FlxPoint.get(0, 0.5), + MIDDLE_RIGHT, //FlxPoint.get(1, 0.5), + BOTTOM_MIDDLE, //FlxPoint.get(0.5, 1), + TOP_MIDDLE, //FlxPoint.get(0.5, 0), + ]; + + function tryUpdateHitbox(sprite:FunkinSprite) { + call("tryUpdateHitbox", [sprite]); + } + + function handleSelection(sprite:FunkinSprite) { + var buttonBoxes = sprite.extra.get(exID("buttonBoxes")); + + dotCheckSize = dot.frameWidth / 0.7/stageCamera.zoom; // basically adjust it to the zoom. + + if(FlxG.mouse.justPressed) { + for(i=>edge in edges) { + if(checkDot(buttonBoxes[i])) { + mouseMode = switch(edge) { + case TOP_LEFT: SCALE_TOP_LEFT; + case TOP_MIDDLE: SCALE_TOP; + case TOP_RIGHT: SCALE_TOP_RIGHT; + case MIDDLE_LEFT: SCALE_LEFT; + case MIDDLE_RIGHT: SCALE_RIGHT; + case BOTTOM_LEFT: SCALE_BOTTOM_LEFT; + case BOTTOM_MIDDLE: SCALE_BOTTOM; + case BOTTOM_RIGHT: SCALE_BOTTOM_RIGHT; + default: NONE; + } + Logs.trace("Clicked Dot: " + mouseMode.toString()); + mousePoint.copyTo(clickPoint); + storedPos.set(sprite.x, sprite.y); + storedScale.copyFrom(sprite.scale); + } + } + } + for(i=>edge in edges) { + if(checkDot(buttonBoxes[i])) { + currentCursor = switch(edge) { + // RESIZE_NESW; //RESIZE_NS; //RESIZE_NWSE; //RESIZE_WE; + case TOP_LEFT | BOTTOM_RIGHT: MouseCursor.RESIZE_NWSE; + case TOP_MIDDLE | BOTTOM_MIDDLE: MouseCursor.RESIZE_NS; + case TOP_RIGHT | BOTTOM_LEFT: MouseCursor.RESIZE_NESW; + case MIDDLE_LEFT | MIDDLE_RIGHT: MouseCursor.RESIZE_WE; + default: ARROW; + } + break; + } + } + + mouseMode = (FlxG.mouse.justReleased) ? NONE : mouseMode; + if(mouseMode == NONE) return; + var relative = clickPoint.subtractNew(mousePoint); + // todo: make this origin based + relative.rotateByDegrees(sprite.angle); + call(mouseMode.toString(), [sprite, relative]); + cast(sprite.extra.get(exID("button")), StageElementButton).updateInfo(sprite); + relative.put(); + } + + var dotCheckSize:Float = 50; + + function checkDot(point:FlxPoint):Bool { + var rect = new FlxRect(point.x - dotCheckSize/2, point.y - dotCheckSize/2, dotCheckSize, dotCheckSize); + return rect.containsPoint(mousePoint); + } + inline function drawDot(x:Float, y:Float) { dot.setPosition(x, y); dot.scale.set(0.7/stageCamera.zoom, 0.7/stageCamera.zoom); @@ -712,8 +812,8 @@ enum StageChange { CEditInfo(oldInfo:Xml, newInfo:Xml); } -@:forward abstract Selection(Array) from Array to Array { - public inline function new(?array:Array) +@:forward abstract Selection(Array) from Array to Array { + public inline function new(?array:Array) this = array == null ? [] : array; // too lazy to put this in every for loop so i made it a abstract @@ -727,112 +827,70 @@ enum StageChange { //} } -class StageSprite extends UISprite { - public var tracker:FlxObject; - public var funkinTracker:FunkinSprite; - public var node:Access; +enum abstract StageEditorMouseMode(Int) { + var NONE; - public var name:String; + var SCALE_LEFT; + var SCALE_BOTTOM; + var SCALE_TOP; + var SCALE_RIGHT; + var SCALE_TOP_LEFT; + var SCALE_TOP_RIGHT; + var SCALE_BOTTOM_LEFT; + var SCALE_BOTTOM_RIGHT; - public var extra:Map = new Map(); + var SKEW_LEFT; + var SKEW_BOTTOM; + var SKEW_TOP; + var SKEW_RIGHT; - public var scrollX:Float; - public var scrollY:Float; - public var scaleX:Float; - public var scaleY:Float; - public var zoomFactor:Float = 1; // TODO: implement this - public var skewX:Float; - public var skewY:Float; - public var spriteAnimType:XMLAnimType; + var ROTATE; - public var skipNegativeBeats:Bool = false; - public var beatInterval:Int = 0; - public var beatOffset:Int = 0; - - public var lowMemory:Bool; - public var highMemory:Bool; - - public var selected:Bool = false; - public var draggable:Bool = false; - - public function new(name:String, sprite:FlxObject) { - super(x, y); - this.name = name; - this.tracker = sprite; - - scrollX = tracker.scrollFactor.x; - scrollY = tracker.scrollFactor.y; - if(tracker is FunkinSprite) { - var tracker:FunkinSprite = cast tracker; - scaleX = tracker.scale.x; - scaleY = tracker.scale.y; - funkinTracker = tracker; - } - else if (tracker is StageCharPos) { - var tracker:StageCharPos = cast tracker; - var char:Character = tracker.extra.get(StageEditor.exID("char")); - scaleX = tracker.scale.x; - scaleY = tracker.scale.y; - funkinTracker = char; - } - - lowMemory = node.x.parent.nodeName == "low-memory"; - highMemory = node.x.parent.nodeName == "high-memory"; - - if(funkinTracker != null) { - skewX = funkinTracker.skew.x; - skewY = funkinTracker.skew.y; - alpha = funkinTracker.alpha; - spriteAnimType = funkinTracker.spriteAnimType; - antialiasing = funkinTracker.antialiasing; - width = funkinTracker.width; - height = funkinTracker.height; - color = funkinTracker.color; - - skipNegativeBeats = funkinTracker.skipNegativeBeats; - beatInterval = funkinTracker.beatInterval; - beatOffset = funkinTracker.beatOffset; - } - - } - - public override function update(elapsed:Float) { - super.update(elapsed); - if (tracker.exists) { - tracker.x = x; - tracker.y = y; - tracker.scrollFactor.set(scrollX, scrollY); - if(tracker is FlxSprite) { - var tracker:FlxSprite = cast tracker; - } - else if (tracker is StageCharPos) { - var tracker:StageCharPos = cast tracker; - tracker.skewX = skewX; - tracker.skewY = skewY; - } - - if(funkinTracker != null) { - funkinTracker.scale.set(scaleX, scaleY); - funkinTracker.skew.set(skewX, skewY); - funkinTracker.alpha = alpha; - funkinTracker.spriteAnimType = spriteAnimType; - funkinTracker.antialiasing = antialiasing; - funkinTracker.width = width; - funkinTracker.height = height; - - funkinTracker.skipNegativeBeats = skipNegativeBeats; - funkinTracker.beatInterval = beatInterval; - funkinTracker.beatOffset = beatOffset; - - funkinTracker.color = color; - } + public function toString():String { + return switch(cast this) { + case NONE: "NONE"; + case SCALE_LEFT: "SCALE_LEFT"; + case SCALE_BOTTOM: "SCALE_BOTTOM"; + case SCALE_TOP: "SCALE_TOP"; + case SCALE_RIGHT: "SCALE_RIGHT"; + case SCALE_TOP_LEFT: "SCALE_TOP_LEFT"; + case SCALE_TOP_RIGHT: "SCALE_TOP_RIGHT"; + case SCALE_BOTTOM_LEFT: "SCALE_BOTTOM_LEFT"; + case SCALE_BOTTOM_RIGHT: "SCALE_BOTTOM_RIGHT"; + case SKEW_LEFT: "SKEW_LEFT"; + case SKEW_BOTTOM: "SKEW_BOTTOM"; + case SKEW_TOP: "SKEW_TOP"; + case SKEW_RIGHT: "SKEW_RIGHT"; + case ROTATE: "ROTATE"; } } +} - public function handleSelection(selectionBox:UISliceSprite):Bool { - return false; - }; - public function handleDrag(change:FlxPoint):Void { +enum abstract StageEditorEdge(Int) { + var NONE; - }; + var TOP_LEFT; + var TOP_MIDDLE; + var TOP_RIGHT; + var MIDDLE_LEFT; + var MIDDLE_MIDDLE; + var MIDDLE_RIGHT; + var BOTTOM_LEFT; + var BOTTOM_MIDDLE; + var BOTTOM_RIGHT; + + function toString():String { + return switch(cast this) { + case NONE: "NONE"; + case TOP_LEFT: "TOP_LEFT"; + case TOP_MIDDLE: "TOP_MIDDLE"; + case TOP_RIGHT: "TOP_RIGHT"; + case MIDDLE_LEFT: "MIDDLE_LEFT"; + case MIDDLE_MIDDLE: "MIDDLE_MIDDLE"; + case MIDDLE_RIGHT: "MIDDLE_RIGHT"; + case BOTTOM_LEFT: "BOTTOM_LEFT"; + case BOTTOM_MIDDLE: "BOTTOM_MIDDLE"; + case BOTTOM_RIGHT: "BOTTOM_RIGHT"; + } + } } \ No newline at end of file diff --git a/source/funkin/editors/stage/elements/StageCharacterButton.hx b/source/funkin/editors/stage/elements/StageCharacterButton.hx index 538ae0eb..2ccf6051 100644 --- a/source/funkin/editors/stage/elements/StageCharacterButton.hx +++ b/source/funkin/editors/stage/elements/StageCharacterButton.hx @@ -53,8 +53,8 @@ class StageCharacterButton extends StageElementButton { return charPos.name; } - public override function getInfoText():String { - return '${getName()} (${charPos.x}, ${charPos.y})'; + public override function getPos():FlxPoint { + return FlxPoint.get(charPos.x, charPos.y); } public override function updatePos() { diff --git a/source/funkin/editors/stage/elements/StageElementButton.hx b/source/funkin/editors/stage/elements/StageElementButton.hx index c2df186a..ae88b66b 100644 --- a/source/funkin/editors/stage/elements/StageElementButton.hx +++ b/source/funkin/editors/stage/elements/StageElementButton.hx @@ -136,7 +136,14 @@ class StageElementButton extends UIButton { // TODO: implement } + public function getPos():FlxPoint { + return FlxPoint.get(-1, -1); + } + public function getInfoText():String { - return 'NOT IMPLEMENTED'; + var pos = getPos(); + var text = '${getName()} (${CoolUtil.quantize(pos.x, 100)}x${CoolUtil.quantize(pos.y, 100)})'; + pos.put(); + return text; } } \ No newline at end of file diff --git a/source/funkin/editors/stage/elements/StageSpriteButton.hx b/source/funkin/editors/stage/elements/StageSpriteButton.hx index 96a9981e..09cc061e 100644 --- a/source/funkin/editors/stage/elements/StageSpriteButton.hx +++ b/source/funkin/editors/stage/elements/StageSpriteButton.hx @@ -59,8 +59,8 @@ class StageSpriteButton extends StageElementButton { return xml.att.name; } - public override function getInfoText():String { - return '${getName()} (${sprite.x}, ${sprite.y})'; + public override function getPos():FlxPoint { + return FlxPoint.get(sprite.x, sprite.y); } public override function updatePos() { diff --git a/source/funkin/editors/ui/UISliceSprite.hx b/source/funkin/editors/ui/UISliceSprite.hx index 664ede98..a6a6afd5 100644 --- a/source/funkin/editors/ui/UISliceSprite.hx +++ b/source/funkin/editors/ui/UISliceSprite.hx @@ -31,6 +31,18 @@ class UISliceSprite extends UISprite { bHeight = h; } + override function set_alpha(value:Float) { + super.set_alpha(value); + topAlpha = alpha; + middleAlpha = alpha; + bottomAlpha = alpha; + return value; + } + + public var topAlpha:Float = 1; + public var middleAlpha:Float = 1; + public var bottomAlpha:Float = 1; + public var drawTop:Bool = true; public var drawMiddle:Bool = true; public var drawBottom:Bool = true; @@ -87,8 +99,10 @@ class UISliceSprite extends UISprite { var y:Float = this.y; if (visible && !(bWidth == 0 || bHeight == 0)) { + var oldAlpha = alpha; // TOP if (drawTop) { + super.set_alpha(topAlpha); // TOP LEFT frame = topleft; setPosition(x, y); @@ -118,6 +132,7 @@ class UISliceSprite extends UISprite { // MIDDLE if (drawMiddle && bHeight > top.frame.height + bottom.frame.height) { + super.set_alpha(middleAlpha); var middleHeight:Float = bHeight - (topleft.frame.height * Math.min(bHeight/(topleft.frame.height*2), 1)) - bottomleft.frame.height * Math.min(bHeight/(bottomleft.frame.height*2), 1); @@ -144,6 +159,7 @@ class UISliceSprite extends UISprite { // BOTTOM if (drawBottom) { + super.set_alpha(bottomAlpha); // BOTTOM LEFT frame = bottomleft; setPosition(x, y + bHeight - (bottomleft.frame.height * Math.min(bHeight/(bottomleft.frame.height*2), 1))); @@ -172,7 +188,9 @@ class UISliceSprite extends UISprite { bottomright.frame.height * Math.min(bHeight/(bottomright.frame.height*2), 1) ); super.drawSuper(); + } + super.set_alpha(oldAlpha); } setPosition(x, y); diff --git a/source/funkin/game/Stage.hx b/source/funkin/game/Stage.hx index b04c8c13..c890c82b 100644 --- a/source/funkin/game/Stage.hx +++ b/source/funkin/game/Stage.hx @@ -288,6 +288,7 @@ class Stage extends FlxBasic implements IBeatReceiver { for (path in Paths.getFolderContent("data/stages/", false, mods ? MODS : BOTH)) { var extension = Path.extension(path); if (extensions.contains(extension)) { + list.pushOnce("test"); list.pushOnce(Path.withoutExtension(path)); } }