Render a ghost hold note when dragging to place (plus fix for hold notes on different note quants)

This commit is contained in:
EliteMasterEric 2023-09-11 19:42:10 -04:00
parent d3f5a81b13
commit abcec3c5f6
2 changed files with 28 additions and 8 deletions

View file

@ -139,8 +139,9 @@ class ChartEditorHoldNoteSprite extends SustainTrail
{
// noteData.stepTime is a calculated value which accounts for BPM changes
var stepTime:Float = this.noteData.stepTime;
var roundedStepTime:Float = Math.floor(stepTime + 0.01); // Add epsilon to fix rounding issues
this.y = roundedStepTime * ChartEditorState.GRID_SIZE;
// Add epsilon to fix rounding issues?
// var roundedStepTime:Float = Math.floor((stepTime + 0.01) / noteSnapRatio) * noteSnapRatio;
this.y = stepTime * ChartEditorState.GRID_SIZE;
}
this.x += ChartEditorState.GRID_SIZE / 2;

View file

@ -1121,6 +1121,11 @@ class ChartEditorState extends HaxeUIState
*/
var gridGhostNote:Null<ChartEditorNoteSprite> = null;
/**
* A sprite used to indicate the note that will be placed on click.
*/
var gridGhostHoldNote:Null<ChartEditorHoldNoteSprite> = null;
/**
* A sprite used to indicate the event that will be placed on click.
*/
@ -1294,6 +1299,13 @@ class ChartEditorState extends HaxeUIState
add(gridGhostNote);
gridGhostNote.zIndex = 11;
gridGhostHoldNote = new ChartEditorHoldNoteSprite(this);
gridGhostHoldNote.alpha = 0.6;
gridGhostHoldNote.noteData = new SongNoteData(0, 0, 0, "");
gridGhostHoldNote.visible = false;
add(gridGhostHoldNote);
gridGhostHoldNote.zIndex = 11;
gridGhostEvent = new ChartEditorEventSprite(this);
gridGhostEvent.alpha = 0.6;
gridGhostEvent.eventData = new SongEventData(-1, '', {});
@ -2286,6 +2298,8 @@ class ChartEditorState extends HaxeUIState
}
else
{
// Clicking and dragging.
// Scroll the screen if the mouse is above or below the grid.
if (FlxG.mouse.screenY < MENU_BAR_HEIGHT)
{
@ -2413,15 +2427,17 @@ class ChartEditorState extends HaxeUIState
{
// Handle extending the note as you drag.
// TODO: This should be beat snapped?
var dragLengthSteps:Float = Conductor.getTimeInSteps(cursorSnappedMs) - currentPlaceNoteData.stepTime;
var dragLengthMs:Float = dragLengthSteps * Conductor.stepLengthMs;
var dragLengthPixels:Float = dragLengthSteps * GRID_SIZE;
// Without this, the newly placed note feels too short compared to the user's input.
var INCREMENT:Float = 1.0;
// TODO: Make this not busted with BPM changes
var dragLengthMs:Float = Math.floor(dragLengthSteps + INCREMENT) * Conductor.stepLengthMs;
gridGhostHoldNote.visible = true;
gridGhostHoldNote.noteData = gridGhostNote.noteData;
gridGhostHoldNote.noteDirection = gridGhostNote.noteData.getDirection();
// TODO: Add and update some sort of preview?
gridGhostHoldNote.setHeightDirectly(dragLengthPixels);
gridGhostHoldNote.updateHoldNotePosition(renderedHoldNotes);
if (FlxG.mouse.justReleased)
{
@ -2577,6 +2593,7 @@ class ChartEditorState extends HaxeUIState
if (cursorColumn == eventColumn)
{
if (gridGhostNote != null) gridGhostNote.visible = false;
gridGhostHoldNote.visible = false;
if (gridGhostEvent == null) throw "ERROR: Tried to handle cursor, but gridGhostEvent is null! Check ChartEditorState.buildGrid()";
@ -2621,6 +2638,7 @@ class ChartEditorState extends HaxeUIState
else
{
if (gridGhostNote != null) gridGhostNote.visible = false;
if (gridGhostHoldNote != null) gridGhostHoldNote.visible = false;
if (gridGhostEvent != null) gridGhostEvent.visible = false;
Cursor.cursorMode = Default;
}
@ -2629,6 +2647,7 @@ class ChartEditorState extends HaxeUIState
else
{
if (gridGhostNote != null) gridGhostNote.visible = false;
if (gridGhostHoldNote != null) gridGhostHoldNote.visible = false;
if (gridGhostEvent != null) gridGhostEvent.visible = false;
}