1
0
Fork 0
mirror of https://github.com/ninjamuffin99/Funkin.git synced 2025-12-04 02:07:13 +00:00

Sustains are kinda working?

This commit is contained in:
EliteMasterEric 2023-06-22 19:28:39 -04:00
parent 25c70564bd
commit 2cae781984
4 changed files with 64 additions and 33 deletions

View file

@ -1696,10 +1696,6 @@ class PlayState extends MusicBeatState
// Judge the miss. // Judge the miss.
// NOTE: This is what handles the scoring. // NOTE: This is what handles the scoring.
onNoteMiss(note); onNoteMiss(note);
// Kill the note.
// NOTE: This is what handles recycling the note graphic.
playerStrumline.killNote(note);
} }
} }
} }
@ -1932,17 +1928,9 @@ class PlayState extends MusicBeatState
popUpScore(note, input); popUpScore(note, input);
} }
playerStrumline.playConfirm(note.noteData.getDirection()); playerStrumline.hitNote(note);
note.hasBeenHit = true;
vocals.playerVolume = 1; vocals.playerVolume = 1;
if (!note.isSustainNote)
{
note.kill();
// activeNotes.remove(note, true);
note.destroy();
}
} }
} }
@ -2017,9 +2005,9 @@ class PlayState extends MusicBeatState
note.active = false; note.active = false;
note.visible = false; note.visible = false;
note.kill(); // Kill the note.
// activeNotes.remove(note, true); // NOTE: This is what handles recycling the note graphic.
note.destroy(); playerStrumline.killNote(note);
} }
/** /**

View file

@ -175,4 +175,16 @@ class NoteSprite extends FlxSprite
this.tooLate = false; this.tooLate = false;
this.hasMissed = false; this.hasMissed = false;
} }
public override function kill():Void
{
super.kill();
}
public override function destroy():Void
{
// This function should ONLY get called as you leave PlayState entirely.
// Otherwise, we want the game to keep reusing note sprites to save memory.
super.destroy();
}
} }

View file

@ -161,10 +161,10 @@ class Strumline extends FlxSpriteGroup
* @param strumTime * @param strumTime
* @return Float * @return Float
*/ */
static function calculateNoteYPos(strumTime:Float):Float static function calculateNoteYPos(strumTime:Float, ?vwoosh:Bool = true):Float
{ {
// Make the note move faster visually as it moves offscreen. // Make the note move faster visually as it moves offscreen.
var vwoosh:Float = (strumTime < Conductor.songPosition) ? 2.0 : 1.0; var vwoosh:Float = (strumTime < Conductor.songPosition) && vwoosh ? 2.0 : 1.0;
var scrollSpeed:Float = PlayState.instance?.currentChart?.scrollSpeed ?? 1.0; var scrollSpeed:Float = PlayState.instance?.currentChart?.scrollSpeed ?? 1.0;
return Conductor.PIXELS_PER_MS * (Conductor.songPosition - strumTime) * scrollSpeed * vwoosh * (PreferencesMenu.getPref('downscroll') ? 1 : -1); return Conductor.PIXELS_PER_MS * (Conductor.songPosition - strumTime) * scrollSpeed * vwoosh * (PreferencesMenu.getPref('downscroll') ? 1 : -1);
@ -206,13 +206,13 @@ class Strumline extends FlxSpriteGroup
{ {
note.visible = false; note.visible = false;
note.hasMissed = true; note.hasMissed = true;
if (note.holdNoteSprite != null) note.holdNoteSprite.missed = true; if (note.holdNoteSprite != null) note.holdNoteSprite.missedNote = true;
} }
else else
{ {
note.visible = true; note.visible = true;
note.hasMissed = false; note.hasMissed = false;
if (note.holdNoteSprite != null) note.holdNoteSprite.missed = false; if (note.holdNoteSprite != null) note.holdNoteSprite.missedNote = false;
} }
} }
@ -223,25 +223,25 @@ class Strumline extends FlxSpriteGroup
var renderWindowEnd = holdNote.strumTime + holdNote.fullSustainLength + Conductor.HIT_WINDOW_MS + RENDER_DISTANCE_MS / 8; var renderWindowEnd = holdNote.strumTime + holdNote.fullSustainLength + Conductor.HIT_WINDOW_MS + RENDER_DISTANCE_MS / 8;
if (Conductor.songPosition >= renderWindowEnd || holdNote.sustainLength <= 0) if (holdNote.missedNote && Conductor.songPosition >= renderWindowEnd)
{ {
// Hold note is offscreen, kill it. // Hold note is offscreen, kill it.
holdNote.visible = false; holdNote.visible = false;
holdNote.kill(); // Do not destroy! Recycling is faster. holdNote.kill(); // Do not destroy! Recycling is faster.
} }
else if (holdNote.sustainLength <= 0) else if (holdNote.hitNote && holdNote.sustainLength <= 0)
{ {
// Hold note is completed, kill it. // Hold note is completed, kill it.
playStatic(holdNote.noteDirection); playStatic(holdNote.noteDirection);
holdNote.visible = false; holdNote.visible = false;
holdNote.kill(); holdNote.kill();
} }
else if (holdNote.sustainLength <= 10) else if (holdNote.hitNote && holdNote.sustainLength <= 10)
{ {
// TODO: Better handle the weird edge case where the hold note is almost completed. // TODO: Better handle the weird edge case where the hold note is almost completed.
holdNote.visible = false; holdNote.visible = false;
} }
else if (Conductor.songPosition > holdNote.strumTime && !holdNote.missed) else if (Conductor.songPosition > holdNote.strumTime && holdNote.hitNote)
{ {
// Hold note is currently being hit, clip it off. // Hold note is currently being hit, clip it off.
holdConfirm(holdNote.noteDirection); holdConfirm(holdNote.noteDirection);
@ -258,7 +258,7 @@ class Strumline extends FlxSpriteGroup
holdNote.y = this.y - INITIAL_OFFSET + STRUMLINE_SIZE / 2; holdNote.y = this.y - INITIAL_OFFSET + STRUMLINE_SIZE / 2;
} }
} }
else if (holdNote.missed && (holdNote.fullSustainLength > holdNote.sustainLength)) else if (holdNote.missedNote && (holdNote.fullSustainLength > holdNote.sustainLength))
{ {
// Hold note was dropped before completing, keep it in its clipped state. // Hold note was dropped before completing, keep it in its clipped state.
holdNote.visible = true; holdNote.visible = true;
@ -285,11 +285,11 @@ class Strumline extends FlxSpriteGroup
if (PreferencesMenu.getPref('downscroll')) if (PreferencesMenu.getPref('downscroll'))
{ {
holdNote.y = this.y + calculateNoteYPos(holdNote.strumTime) - holdNote.height + STRUMLINE_SIZE / 2; holdNote.y = this.y + calculateNoteYPos(holdNote.strumTime, false) - holdNote.height + STRUMLINE_SIZE / 2;
} }
else else
{ {
holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime) + STRUMLINE_SIZE / 2; holdNote.y = this.y - INITIAL_OFFSET + calculateNoteYPos(holdNote.strumTime, false) + STRUMLINE_SIZE / 2;
} }
} }
} }
@ -316,7 +316,15 @@ class Strumline extends FlxSpriteGroup
public function hitNote(note:NoteSprite):Void public function hitNote(note:NoteSprite):Void
{ {
playConfirm(note.direction); playConfirm(note.direction);
note.hasBeenHit = true;
killNote(note); killNote(note);
if (note.holdNoteSprite != null)
{
note.holdNoteSprite.hitNote = true;
note.holdNoteSprite.missedNote = false;
note.holdNoteSprite.alpha = 1.0;
}
} }
public function killNote(note:NoteSprite):Void public function killNote(note:NoteSprite):Void
@ -327,8 +335,8 @@ class Strumline extends FlxSpriteGroup
if (note.holdNoteSprite != null) if (note.holdNoteSprite != null)
{ {
holdNoteSprite.missed = true; note.holdNoteSprite.missedNote = true;
holdNoteSprite.alpha = 0.6; note.holdNoteSprite.alpha = 0.6;
} }
} }
@ -416,7 +424,8 @@ class Strumline extends FlxSpriteGroup
holdNoteSprite.noteDirection = note.getDirection(); holdNoteSprite.noteDirection = note.getDirection();
holdNoteSprite.fullSustainLength = note.length; holdNoteSprite.fullSustainLength = note.length;
holdNoteSprite.sustainLength = note.length; holdNoteSprite.sustainLength = note.length;
holdNoteSprite.missed = false; holdNoteSprite.missedNote = false;
holdNoteSprite.hitNote = false;
holdNoteSprite.x = this.x; holdNoteSprite.x = this.x;
holdNoteSprite.x += getXPos(DIRECTIONS[note.getDirection() % KEY_COUNT]); holdNoteSprite.x += getXPos(DIRECTIONS[note.getDirection() % KEY_COUNT]);

View file

@ -33,10 +33,18 @@ class SustainTrail extends FlxSprite
public var noteData:SongNoteData; public var noteData:SongNoteData;
/** /**
* Set to `true` if the user missed the note. * Set to `true` if the user hit the note and is currently holding the sustain.
* The trail should be made transparent, with clipping and effects disabled * Should display associated effects.
*/ */
public var missed:Bool = false; // maybe BlendMode.MULTIPLY if missed somehow, drawTriangles does not support! public var hitNote:Bool = false;
/**
* Set to `true` if the user missed the note or released the sustain.
* Should make the trail transparent.
*/
public var missedNote:Bool = false;
// maybe BlendMode.MULTIPLY if missed somehow, drawTriangles does not support!
/** /**
* A `Vector` of floats where each pair of numbers is treated as a coordinate location (an x, y pair). * A `Vector` of floats where each pair of numbers is treated as a coordinate location (an x, y pair).
@ -252,6 +260,20 @@ class SustainTrail extends FlxSprite
} }
} }
public override function kill():Void
{
super.kill();
strumTime = 0;
noteDirection = 0;
sustainLength = 0;
fullSustainLength = 0;
noteData = null;
hitNote = false;
missedNote = false;
}
override public function destroy():Void override public function destroy():Void
{ {
vertices = null; vertices = null;