hold right click to delete+cool delete animation

This commit is contained in:
lunarcleint
2024-03-21 01:25:45 -07:00
parent 00afff0ce9
commit aa29f8962a
2 changed files with 107 additions and 3 deletions
+64 -3
View File
@@ -1,5 +1,9 @@
package funkin.editors.charter;
import openfl.geom.Point;
import openfl.geom.Rectangle;
import flixel.graphics.FlxGraphic;
import flixel.addons.display.FlxTiledSprite;
import funkin.editors.ui.UIContextMenu.UIContextMenuOptionSpr;
import funkin.editors.ui.UITopMenu.UITopMenuButton;
import funkin.editors.charter.CharterStrumline;
@@ -55,6 +59,7 @@ class Charter extends UIState {
public var gridBackdropDummy:CharterBackdropDummy;
public var noteHoverer:CharterNoteHoverer;
public var noteDeleteAnims:CharterDeleteAnim;
public var strumlineInfoBG:FlxSprite;
public var strumlineAddButton:CharterStrumlineButton;
@@ -389,8 +394,10 @@ class Charter extends UIState {
selectionBox.incorporeal = true;
noteHoverer = new CharterNoteHoverer();
noteDeleteAnims = new CharterDeleteAnim();
selectionBox.cameras = notesGroup.cameras = gridBackdrops.cameras = noteHoverer.cameras = [charterCamera];
selectionBox.cameras = notesGroup.cameras = gridBackdrops.cameras =
noteHoverer.cameras = noteDeleteAnims.cameras = [charterCamera];
topMenuSpr = new UITopMenu(topMenu);
topMenuSpr.cameras = uiGroup.cameras = [uiCamera];
@@ -458,6 +465,7 @@ class Charter extends UIState {
add(addEventSpr);
add(eventsGroup);
add(noteHoverer);
add(noteDeleteAnims);
add(notesGroup);
add(selectionBox);
add(strumlineInfoBG);
@@ -560,6 +568,26 @@ class Charter extends UIState {
// var dataDisplay:FlxSprite = new FlxSprite().loadGraphic(waveformHandler.waveDatas.get("Voices.ogg"));
// dataDisplay.cameras = [charterCamera]; dataDisplay.x = -dataDisplay.width; add(dataDisplay);
// ! back into the vault you! -lunar
/*
var graphic:FlxGraphic = FlxG.bitmap.add(Paths.image('editors/charter/sustain'));
var realAnims:Array<FlxGraphic> = [
for (x in 0...2)
for (y in 0...2) {
var bitmapData:BitmapData = new BitmapData(Std.int(graphic.width/2), Std.int(graphic.height/2), true, 0x00000000);
bitmapData.copyPixels(
graphic.bitmap, new Rectangle(x*(graphic.width/2), y*(graphic.height/2), graphic.width, graphic.height), new Point(0,0)
);
FlxG.bitmap.add(bitmapData, true);
}
];
trace(realAnims);
var testSprite = new FlxTiledSprite(realAnims[0], 10, 100, false, true);
testSprite.cameras = [charterCamera]; add(testSprite);
*/
}
public var __endStep:Float = 0;
@@ -657,6 +685,7 @@ class Charter extends UIState {
for(s in selection) s.selected = true;
}
var deletedNotes:Selection = new Selection();
public function updateNoteLogic(elapsed:Float) {
updateSelectionLogic();
@@ -762,7 +791,11 @@ class Charter extends UIState {
case NONE:
if (FlxG.mouse.justPressed)
FlxG.mouse.getWorldPosition(charterCamera, dragStartPos);
else if (FlxG.mouse.justPressedRight) {
closeCurrentContextMenu();
gridActionType = DELTE_SELECTION;
}
if (gridBackdropDummy.hovered) {
// AUTO DETECT
if (FlxG.mouse.pressed && (Math.abs(mousePos.x - dragStartPos.x) > 20 || Math.abs(mousePos.y - dragStartPos.y) > 20))
@@ -840,6 +873,30 @@ class Charter extends UIState {
gridActionType = NONE;
currentCursor = ARROW;
}
case DELTE_SELECTION:
notesGroup.forEach(function(n) {
if (n.hovered || n.sustainDraggable) {
deletedNotes.push(n);
deleteSingleSelection(n, false);
if (selection.contains(n)) selection.remove(n);
noteDeleteAnims.deleteNotes.push({
note: n, time: noteDeleteAnims.deleteTime
});
}
});
if (FlxG.mouse.justReleasedRight) {
if (deletedNotes.length > 0)
undos.addToUndo(CDeleteSelection(deletedNotes.copy()));
else {
var mousePos = FlxG.mouse.getScreenPosition(uiCamera);
closeCurrentContextMenu();
openContextMenu(topMenu[1].childs, null, mousePos.x, mousePos.y);
mousePos.put();
}
gridActionType = NONE; deletedNotes = [];
}
}
addEventSpr.selectable = !selectionBox.visible;
@@ -1319,7 +1376,10 @@ class Charter extends UIState {
function _edit_delete(_) {
if (selection == null || selection.length == 0) return;
selection = deleteSelection(selection);
selection.loop((n:CharterNote) -> {
noteDeleteAnims.deleteNotes.push({note: n, time: noteDeleteAnims.deleteTime});
});
selection = deleteSelection(selection, true);
}
function _edit_undo(_) {
@@ -1885,6 +1945,7 @@ enum abstract CharterGridActionType(Int) {
var NOTE_DRAG = 2;
var INVALID_DRAG = 3;
var SUSTAIN_DRAG = 4;
var DELTE_SELECTION = 5;
}
typedef PlaytestInfo = {
@@ -0,0 +1,43 @@
package funkin.editors.charter;
class CharterDeleteAnim extends CharterNote {
public var deleteNotes:Array<{note:CharterNote, time:Float}> = [];
public var deleteTime:Float = .5;
public function new() {
super();
sustainSpr.color = 0xFF6D2425; color = 0xFF797171;
snappedToStrumline = selectable = autoAlpha = false;
@:privateAccess __animSpeed = 1.25;
}
public override function update(elapsed:Float) {
for (deleteData in deleteNotes) {
deleteData.time -= elapsed;
if (deleteData.time < 0) deleteNotes.remove(deleteData);
}
}
public override function draw() @:privateAccess {
for (deleteData in deleteNotes) {
y = deleteData.note.y + (deleteData.time>deleteTime*.6 ? (deleteData.time/deleteTime)*FlxG.random.float(-1.5, 1.5) : 0); // lunar when no shake :((
x = deleteData.note.x + (deleteData.time>deleteTime*.6 ? (deleteData.time/deleteTime)*FlxG.random.float(-1.5, 1.5) : 0); // lunar when no shake :((
angle = deleteData.note.angle; alpha = 1;
animation.curAnim.curFrame = 3;
sustainSpr.scale.set(10, (40 * deleteData.note.susLength) + (height/2));
sustainSpr.updateHitbox(); sustainSpr.follow(this, 15, 20);
sustainSpr.exists = deleteData.note.susLength != 0; sustainSpr.alpha = .4;
typeText.text = Std.string(deleteData.note.type);
typeText.exists = deleteData.note.type != 0; typeText.alpha = .4;
typeText.follow(this, 20 - (typeText.frameWidth/2), 20 - (typeText.frameHeight/2));
for (member in [this, sustainSpr, typeText])
member.alpha *= deleteData.time/deleteTime;
super.draw();
}
}
}