some liveshare tomfoolery

got scale points working with huge help from ne_eo

Co-authored-by: Ne_Eo <NeeEoo@users.noreply.github.com>
This commit is contained in:
SrtHero278
2024-04-14 15:39:14 -07:00
co-authored by Ne_Eo
parent 8eea36b297
commit 4285307d70
9 changed files with 414 additions and 146 deletions
+36
View File
@@ -0,0 +1,36 @@
<!-- praying to god we remove this file later on -->
<stage zoom="0.9" name="stage" folder="stages/default/" startCamPosY="600" startCamPosX="1000">
<sprite name="normBG" sprite="stagefront" x="-500" y="100" scale="0.75" updateHitbox="true" />
<sprite name="noUpdateHitbox" sprite="stagefront" x="-500" y="300" scale="0.75" />
<sprite name="ro-tat-ay" sprite="stagefront" x="-500" y="700" scale="0.75" updateHitbox="true" angle="37" />
<!-- oh yeah those exist
where the first one go
you saw the video?
the wha
https://www.youtube.com/watch?v=d6iQrh2TK98
well that explains a bit
whats weird is that i typically think of the number *twenty* seven
guess my favortie number
37
-23.47
interesting
oops
you will be surprised how it looks after me wizard and yosh used it lol, 268kb
also i love how most of nthis files size comes from the convo
37 is a wacky number so im using that for testing
// maybe box? so its colors
wrong format lol (im on stepmania xml)
also just realized i cant scale boxes, you can, just not <solid>
we may need a different func for boxes/solids.
storedScale should still work
and when we save we just have to save either width and scale.x, or calculate the width from the scale
i think we can do sprite.frameWidth * sprite.scale.x when saving boxes luckfully
oh yeah -->
<!-- <box == makeGraphic -->
<!-- <solid == makeSolid -->
</stage>
+133
View File
@@ -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) {}
+15
View File
@@ -416,6 +416,21 @@ class CoolUtil
sprite.scale.set(nScale, nScale); 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. * Returns a simple string representation of a FlxKey. Used in Controls options.
* @param key Key * @param key Key
+199 -141
View File
@@ -1,5 +1,6 @@
package funkin.editors.stage; package funkin.editors.stage;
import lime.ui.MouseCursor;
import flixel.math.FlxAngle; import flixel.math.FlxAngle;
import flixel.math.FlxPoint; import flixel.math.FlxPoint;
import flixel.math.FlxRect; import flixel.math.FlxRect;
@@ -13,6 +14,7 @@ import funkin.game.Character;
import funkin.game.Stage; import funkin.game.Stage;
import haxe.xml.Access; import haxe.xml.Access;
import haxe.xml.Printer; import haxe.xml.Printer;
import openfl.ui.Mouse;
using funkin.backend.utils.MatrixUtil; using funkin.backend.utils.MatrixUtil;
@@ -32,7 +34,6 @@ class StageEditor extends UIState {
public var uiGroup:FlxTypedGroup<FlxSprite> = new FlxTypedGroup<FlxSprite>(); public var uiGroup:FlxTypedGroup<FlxSprite> = new FlxTypedGroup<FlxSprite>();
public var stageSpritesWindow:UIButtonList<StageElementButton>; public var stageSpritesWindow:UIButtonList<StageElementButton>;
public var stageSprites:FlxTypedGroup<StageSprite> = new FlxTypedGroup<StageSprite>();
public var xmlMap:Map<FlxObject, Access> = new Map<FlxObject, Access>(); public var xmlMap:Map<FlxObject, Access> = new Map<FlxObject, Access>();
@@ -43,7 +44,12 @@ class StageEditor extends UIState {
public var guideCamera:FlxCamera; public var guideCamera:FlxCamera;
public var uiCamera: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 showOutlines:Bool = true;
public var showCharacters:Bool = true; public var showCharacters:Bool = true;
@@ -182,6 +188,7 @@ class StageEditor extends UIState {
if(sprite is FunkinSprite) { if(sprite is FunkinSprite) {
var sprite:FunkinSprite = cast sprite; var sprite:FunkinSprite = cast sprite;
name = sprite.name; name = sprite.name;
sprite.extra.set(exID("node"), node);
sprite.extra.set(exID("type"), node.name); sprite.extra.set(exID("type"), node.name);
sprite.extra.set(exID("imageFile"), '${node.getAtt("sprite").getDefault(sprite.name)}'); sprite.extra.set(exID("imageFile"), '${node.getAtt("sprite").getDefault(sprite.name)}');
//sprite.active = false; //sprite.active = false;
@@ -217,10 +224,6 @@ class StageEditor extends UIState {
order.push(sprite); order.push(sprite);
xmlMap.set(sprite, node); xmlMap.set(sprite, node);
//var t = new StageSprite(name, sprite);
//t.node = node;
//stageSprites.add(t);
return sprite; return sprite;
} }
stage.loadXml(stage.stageXML, true); stage.loadXml(stage.stageXML, true);
@@ -234,12 +237,6 @@ class StageEditor extends UIState {
charMap[charPos.name] = char; charMap[charPos.name] = char;
} }
add(stageSprites);
for(spr in order) {
}
setZoom(stage.defaultZoom); setZoom(stage.defaultZoom);
topMenuSpr = new UITopMenu(topMenu); topMenuSpr = new UITopMenu(topMenu);
@@ -251,6 +248,8 @@ class StageEditor extends UIState {
var buttonSize:FlxPoint = FlxPoint.get(width-margin*2, 32); var buttonSize:FlxPoint = FlxPoint.get(width-margin*2, 32);
stageSpritesWindow = new UIButtonList<StageElementButton>(Std.int(FlxG.width - width), TOP_MENU_HEIGHT, width, Std.int(FlxG.height - TOP_MENU_HEIGHT), "Stage Sprites", buttonSize); stageSpritesWindow = new UIButtonList<StageElementButton>(Std.int(FlxG.width - width), TOP_MENU_HEIGHT, width, Std.int(FlxG.height - TOP_MENU_HEIGHT), "Stage Sprites", buttonSize);
stageSpritesWindow.collapsable = true; stageSpritesWindow.collapsable = true;
stageSpritesWindow.middleAlpha = 0.5;
stageSpritesWindow.bottomAlpha = 0.5;
stageSpritesWindow.addButton.callback = () -> { stageSpritesWindow.addButton.callback = () -> {
// TODO: implement this // TODO: implement this
} }
@@ -311,6 +310,8 @@ class StageEditor extends UIState {
//if (character != null) //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})'; // 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 ((!stageSpritesWindow.hovered && !stageSpritesWindow.dragging) && !topMenuSpr.hovered) {
if (FlxG.mouse.wheel != 0) { if (FlxG.mouse.wheel != 0) {
zoom += 0.25 * FlxG.mouse.wheel; 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) { //if (FlxG.mouse.justReleasedRight) {
// closeCurrentContextMenu(); // closeCurrentContextMenu();
// openContextMenu(topMenu[2].childs); // 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); nextScroll.set(nextScroll.x - FlxG.mouse.deltaScreenX, nextScroll.y - FlxG.mouse.deltaScreenY);
currentCursor = HAND; currentCursor = HAND;
} else }
currentCursor = ARROW; }/* else if (!FlxG.mouse.pressed)
} else if (!FlxG.mouse.pressed) currentCursor = ARROW;*/
currentCursor = ARROW;
stageCamera.scroll.set( stageCamera.scroll.set(
lerp(stageCamera.scroll.x, nextScroll.x, 0.35), lerp(stageCamera.scroll.x, nextScroll.x, 0.35),
@@ -394,6 +401,7 @@ class StageEditor extends UIState {
} }
public function selectSprite(_sprite:FunkinSprite) { public function selectSprite(_sprite:FunkinSprite) {
selection = new Selection([]);
var sprites = stageSpritesWindow.buttons.members.map((o) -> o.getSprite()).filter((o) -> o != null);// && o.animateAtlas == null); var sprites = stageSpritesWindow.buttons.members.map((o) -> o.getSprite()).filter((o) -> o != null);// && o.animateAtlas == null);
for(sprite in sprites) { for(sprite in sprites) {
if(sprite is FunkinSprite) { if(sprite is FunkinSprite) {
@@ -406,6 +414,8 @@ class StageEditor extends UIState {
var sprite:FunkinSprite = cast _sprite; var sprite:FunkinSprite = cast _sprite;
sprite.extra.set(exID("selected"), true); sprite.extra.set(exID("selected"), true);
sprite.extra.get(exID("button")).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(); super.draw();
if(!showOutlines) return; if(!showOutlines) return;
mousePoint = FlxG.mouse.getWorldPosition(stageCamera, mousePoint);
if(dot == null) { if(dot == null) {
dot = new FlxSprite().makeGraphic(10, 10, FlxColor.WHITE); dot = new FlxSprite().makeGraphic(30, 30, FlxColor.WHITE);
dot.camera = stageCamera; dot.camera = stageCamera;
dot.forceIsOnScreen = true; dot.forceIsOnScreen = true;
} }
for(sprite in stage.stageSprites) { for(sprite in selection) {
if(sprite.visible && sprite.isOnScreen(stageCamera)) { if(sprite is FunkinSprite) {
@:privateAccess if(sprite._frame == null) continue; @:privateAccess if(sprite._frame == null) continue;
drawGuides(sprite); drawGuides(cast sprite);
}
}
if(showCharacters) {
for(char in chars) {
if(char.visible && char.isOnScreen(stageCamera)) {
@:privateAccess if(char._frame == null) continue;
drawGuides(char);
}
} }
} }
} }
var lineColor = 0xFFb794b6;
var circleColor = 0xFF99a8f2;
function drawGuides(sprite:FlxSprite) { function drawGuides(sprite:FlxSprite) {
var oldWidth = sprite.width; var oldWidth = sprite.width;
var oldHeight = sprite.height; 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); 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(funkinSprite != null) {
if(sprite is FunkinSprite) { if(funkinSprite.extra.exists(exID("buttonBoxes"))) {
var sprite:FunkinSprite = cast sprite; var oldButtonBoxes:Array<FlxPoint> = cast funkinSprite.extra.get(exID("buttonBoxes"));
if(sprite.extra.get(exID("selected")) == true) { if(oldButtonBoxes != null) {
dot.color = FlxColor.GREEN; for(point in oldButtonBoxes) {
point.put();
}
}
} }
} }
var buttonBoxes = [];
for(corner in corners) { if(funkinSprite != null) {
drawDot(corner.x, corner.y); funkinSprite.extra.set(exID("buttonBoxes"), buttonBoxes);
corner.put();
} }
dot.color = lineColor;
drawLine(corners[0], corners[1]); // tl - tr drawLine(corners[0], corners[1]); // tl - tr
drawLine(corners[0], corners[2]); // tl - bl drawLine(corners[0], corners[2]); // tl - bl
drawLine(corners[1], corners[3]); // tr - br drawLine(corners[1], corners[3]); // tr - br
drawLine(corners[2], corners[3]); // bl - 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 // reset hitbox to old values
sprite.width = oldWidth; sprite.width = oldWidth;
sprite.height = oldHeight; sprite.height = oldHeight;
} }
var edges:Array<StageEditorEdge> = [
//// 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) { inline function drawDot(x:Float, y:Float) {
dot.setPosition(x, y); dot.setPosition(x, y);
dot.scale.set(0.7/stageCamera.zoom, 0.7/stageCamera.zoom); dot.scale.set(0.7/stageCamera.zoom, 0.7/stageCamera.zoom);
@@ -712,8 +812,8 @@ enum StageChange {
CEditInfo(oldInfo:Xml, newInfo:Xml); CEditInfo(oldInfo:Xml, newInfo:Xml);
} }
@:forward abstract Selection(Array<StageSprite>) from Array<StageSprite> to Array<StageSprite> { @:forward abstract Selection(Array<FunkinSprite>) from Array<FunkinSprite> to Array<FunkinSprite> {
public inline function new(?array:Array<StageSprite>) public inline function new(?array:Array<FunkinSprite>)
this = array == null ? [] : array; this = array == null ? [] : array;
// too lazy to put this in every for loop so i made it a abstract // 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 { enum abstract StageEditorMouseMode(Int) {
public var tracker:FlxObject; var NONE;
public var funkinTracker:FunkinSprite;
public var node:Access;
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<String, Dynamic> = new Map<String, Dynamic>(); var SKEW_LEFT;
var SKEW_BOTTOM;
var SKEW_TOP;
var SKEW_RIGHT;
public var scrollX:Float; var ROTATE;
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;
public var skipNegativeBeats:Bool = false; public function toString():String {
public var beatInterval:Int = 0; return switch(cast this) {
public var beatOffset:Int = 0; case NONE: "NONE";
case SCALE_LEFT: "SCALE_LEFT";
public var lowMemory:Bool; case SCALE_BOTTOM: "SCALE_BOTTOM";
public var highMemory:Bool; case SCALE_TOP: "SCALE_TOP";
case SCALE_RIGHT: "SCALE_RIGHT";
public var selected:Bool = false; case SCALE_TOP_LEFT: "SCALE_TOP_LEFT";
public var draggable:Bool = false; case SCALE_TOP_RIGHT: "SCALE_TOP_RIGHT";
case SCALE_BOTTOM_LEFT: "SCALE_BOTTOM_LEFT";
public function new(name:String, sprite:FlxObject) { case SCALE_BOTTOM_RIGHT: "SCALE_BOTTOM_RIGHT";
super(x, y); case SKEW_LEFT: "SKEW_LEFT";
this.name = name; case SKEW_BOTTOM: "SKEW_BOTTOM";
this.tracker = sprite; case SKEW_TOP: "SKEW_TOP";
case SKEW_RIGHT: "SKEW_RIGHT";
scrollX = tracker.scrollFactor.x; case ROTATE: "ROTATE";
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); enum abstract StageEditorEdge(Int) {
if (tracker.exists) { var NONE;
tracker.x = x;
tracker.y = y; var TOP_LEFT;
tracker.scrollFactor.set(scrollX, scrollY); var TOP_MIDDLE;
if(tracker is FlxSprite) { var TOP_RIGHT;
var tracker:FlxSprite = cast tracker; var MIDDLE_LEFT;
} var MIDDLE_MIDDLE;
else if (tracker is StageCharPos) { var MIDDLE_RIGHT;
var tracker:StageCharPos = cast tracker; var BOTTOM_LEFT;
tracker.skewX = skewX; var BOTTOM_MIDDLE;
tracker.skewY = skewY; var BOTTOM_RIGHT;
}
function toString():String {
if(funkinTracker != null) { return switch(cast this) {
funkinTracker.scale.set(scaleX, scaleY); case NONE: "NONE";
funkinTracker.skew.set(skewX, skewY); case TOP_LEFT: "TOP_LEFT";
funkinTracker.alpha = alpha; case TOP_MIDDLE: "TOP_MIDDLE";
funkinTracker.spriteAnimType = spriteAnimType; case TOP_RIGHT: "TOP_RIGHT";
funkinTracker.antialiasing = antialiasing; case MIDDLE_LEFT: "MIDDLE_LEFT";
funkinTracker.width = width; case MIDDLE_MIDDLE: "MIDDLE_MIDDLE";
funkinTracker.height = height; case MIDDLE_RIGHT: "MIDDLE_RIGHT";
case BOTTOM_LEFT: "BOTTOM_LEFT";
funkinTracker.skipNegativeBeats = skipNegativeBeats; case BOTTOM_MIDDLE: "BOTTOM_MIDDLE";
funkinTracker.beatInterval = beatInterval; case BOTTOM_RIGHT: "BOTTOM_RIGHT";
funkinTracker.beatOffset = beatOffset;
funkinTracker.color = color;
}
} }
} }
public function handleSelection(selectionBox:UISliceSprite):Bool {
return false;
};
public function handleDrag(change:FlxPoint):Void {
};
} }
@@ -53,8 +53,8 @@ class StageCharacterButton extends StageElementButton {
return charPos.name; return charPos.name;
} }
public override function getInfoText():String { public override function getPos():FlxPoint {
return '${getName()} (${charPos.x}, ${charPos.y})'; return FlxPoint.get(charPos.x, charPos.y);
} }
public override function updatePos() { public override function updatePos() {
@@ -136,7 +136,14 @@ class StageElementButton extends UIButton {
// TODO: implement // TODO: implement
} }
public function getPos():FlxPoint {
return FlxPoint.get(-1, -1);
}
public function getInfoText():String { 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;
} }
} }
@@ -59,8 +59,8 @@ class StageSpriteButton extends StageElementButton {
return xml.att.name; return xml.att.name;
} }
public override function getInfoText():String { public override function getPos():FlxPoint {
return '${getName()} (${sprite.x}, ${sprite.y})'; return FlxPoint.get(sprite.x, sprite.y);
} }
public override function updatePos() { public override function updatePos() {
+18
View File
@@ -31,6 +31,18 @@ class UISliceSprite extends UISprite {
bHeight = h; 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 drawTop:Bool = true;
public var drawMiddle:Bool = true; public var drawMiddle:Bool = true;
public var drawBottom:Bool = true; public var drawBottom:Bool = true;
@@ -87,8 +99,10 @@ class UISliceSprite extends UISprite {
var y:Float = this.y; var y:Float = this.y;
if (visible && !(bWidth == 0 || bHeight == 0)) { if (visible && !(bWidth == 0 || bHeight == 0)) {
var oldAlpha = alpha;
// TOP // TOP
if (drawTop) { if (drawTop) {
super.set_alpha(topAlpha);
// TOP LEFT // TOP LEFT
frame = topleft; frame = topleft;
setPosition(x, y); setPosition(x, y);
@@ -118,6 +132,7 @@ class UISliceSprite extends UISprite {
// MIDDLE // MIDDLE
if (drawMiddle && bHeight > top.frame.height + bottom.frame.height) { 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)) - 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); bottomleft.frame.height * Math.min(bHeight/(bottomleft.frame.height*2), 1);
@@ -144,6 +159,7 @@ class UISliceSprite extends UISprite {
// BOTTOM // BOTTOM
if (drawBottom) { if (drawBottom) {
super.set_alpha(bottomAlpha);
// BOTTOM LEFT // BOTTOM LEFT
frame = bottomleft; frame = bottomleft;
setPosition(x, y + bHeight - (bottomleft.frame.height * Math.min(bHeight/(bottomleft.frame.height*2), 1))); 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) bottomright.frame.height * Math.min(bHeight/(bottomright.frame.height*2), 1)
); );
super.drawSuper(); super.drawSuper();
} }
super.set_alpha(oldAlpha);
} }
setPosition(x, y); setPosition(x, y);
+1
View File
@@ -288,6 +288,7 @@ class Stage extends FlxBasic implements IBeatReceiver {
for (path in Paths.getFolderContent("data/stages/", false, mods ? MODS : BOTH)) { for (path in Paths.getFolderContent("data/stages/", false, mods ? MODS : BOTH)) {
var extension = Path.extension(path); var extension = Path.extension(path);
if (extensions.contains(extension)) { if (extensions.contains(extension)) {
list.pushOnce("test");
list.pushOnce(Path.withoutExtension(path)); list.pushOnce(Path.withoutExtension(path));
} }
} }