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:
@@ -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>
|
||||||
@@ -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) {}
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user