Merge pull request #148 from mad-s/master

Make music pitch and speed go down on fail (like in osu!)
This commit is contained in:
Jeffrey Han 2015-11-16 15:53:02 -05:00
commit af0d3b8c56
5 changed files with 67 additions and 7 deletions

View File

@ -237,6 +237,15 @@ public class MusicController {
player.fade(duration, 0f, true); player.fade(duration, 0f, true);
} }
/**
* Fades out the pitch (and speed) of the track.
* @param duration the pitch fade time (in ms)
*/
public static void pitchFadeOut(int duration) {
if (isPlaying())
player.pitchFade(duration, 0f);
}
/** /**
* Returns the position in the current track, in milliseconds. * Returns the position in the current track, in milliseconds.
* If no track is loaded, 0 will be returned. * If no track is loaded, 0 will be returned.
@ -316,7 +325,7 @@ public class MusicController {
* @param pitch the new pitch * @param pitch the new pitch
*/ */
public static void setPitch(float pitch) { public static void setPitch(float pitch) {
SoundStore.get().setMusicPitch(pitch); player.setPitch(pitch);
} }
/** /**

View File

@ -1262,9 +1262,6 @@ public class Game extends BasicGameState {
// replays // replays
if (isReplay) if (isReplay)
GameMod.loadModState(previousMods); GameMod.loadModState(previousMods);
// reset playback speed
MusicController.setPitch(1f);
} }
/** /**

View File

@ -48,7 +48,7 @@ import org.newdawn.slick.state.transition.FadeOutTransition;
*/ */
public class GamePauseMenu extends BasicGameState { public class GamePauseMenu extends BasicGameState {
/** Music fade-out time, in milliseconds. */ /** Music fade-out time, in milliseconds. */
private static final int FADEOUT_TIME = 1000; private static final int FADEOUT_TIME = 2000;
/** Track position when the pause menu was loaded (for FADEOUT_TIME). */ /** Track position when the pause menu was loaded (for FADEOUT_TIME). */
private long pauseStartTime; private long pauseStartTime;
@ -207,6 +207,7 @@ public class GamePauseMenu extends BasicGameState {
pauseStartTime = System.currentTimeMillis(); pauseStartTime = System.currentTimeMillis();
if (gameState.getRestart() == Game.Restart.LOSE) { if (gameState.getRestart() == Game.Restart.LOSE) {
MusicController.fadeOut(FADEOUT_TIME); MusicController.fadeOut(FADEOUT_TIME);
MusicController.pitchFadeOut(FADEOUT_TIME);
SoundController.playSound(SoundEffect.FAIL); SoundController.playSound(SoundEffect.FAIL);
} else } else
MusicController.pause(); MusicController.pause();
@ -215,6 +216,13 @@ public class GamePauseMenu extends BasicGameState {
backButton.resetHover(); backButton.resetHover();
} }
@Override
public void leave(GameContainer container, StateBasedGame game)
throws SlickException {
// reset pitch fade out
MusicController.pitchFadeOut(0);
}
/** /**
* Loads all game pause/fail menu images. * Loads all game pause/fail menu images.
*/ */

View File

@ -1118,6 +1118,7 @@ public class SongMenu extends BasicGameState {
else if (resetTrack) { else if (resetTrack) {
MusicController.pause(); MusicController.pause();
MusicController.playAt(MusicController.getBeatmap().previewTime, true); MusicController.playAt(MusicController.getBeatmap().previewTime, true);
MusicController.setPitch(1.0f);
resetTrack = false; resetTrack = false;
} }

View File

@ -99,6 +99,18 @@ public class Music {
/** The position that was requested */ /** The position that was requested */
private float requiredPosition = -1; private float requiredPosition = -1;
/** The pitch of this music */
private float pitch = 1.0f;
/** Start pitch for fading pitch */
private float pitchStart;
/** End pitch for fading pitch */
private float pitchEnd;
/** Countdown for fading pitch */
private int pitchTime;
/** Duration for fading pitch */
private int pitchDuration;
/** /**
* Create and load a piece of music (either OGG or MOD/XM) * Create and load a piece of music (either OGG or MOD/XM)
* *
@ -313,6 +325,7 @@ public class Music {
currentMusic = this; currentMusic = this;
sound.playAsMusic(pitch, volume, loop); sound.playAsMusic(pitch, volume, loop);
setVolume(volume); setVolume(volume);
setPitch(pitch);
if (requiredPosition != -1) { if (requiredPosition != -1) {
setPosition(requiredPosition); setPosition(requiredPosition);
} }
@ -373,6 +386,17 @@ public class Music {
SoundStore.get().setCurrentMusicVolume(volume); SoundStore.get().setCurrentMusicVolume(volume);
} }
} }
/**
* Set the pitch of the music as a factor of it's normal pitch
*
* @param pitch The pitch to play music at.
*/
public void setPitch(float pitch) {
this.pitch = pitch;
if (currentMusic == this) {
SoundStore.get().setMusicPitch(pitch);
}
}
/** /**
* Get the individual volume of the music * Get the individual volume of the music
@ -397,6 +421,19 @@ public class Music {
fadeTime = duration; fadeTime = duration;
} }
/**
* Fade the pitch and speed of this music to the pitch specified
*
* @param duration Pitch fade time in milliseconds
* @param endPitch The target pitch (and speed)
*/
public void pitchFade (int duration, float endPitch) {
pitchStart = pitch;
pitchEnd = endPitch;
pitchDuration = duration;
pitchTime = duration;
}
/** /**
* Update the current music applying any effects that need to updated per * Update the current music applying any effects that need to updated per
* tick. * tick.
@ -408,6 +445,14 @@ public class Music {
return; return;
} }
if (pitchTime > 0) {
pitchTime -= delta;
if (pitchTime < 0) {
pitchTime = 0;
}
float offset = (pitchEnd - pitchStart) * (1 - (pitchTime / (float)pitchDuration));
setPitch(pitchStart + offset);
}
if (fadeTime > 0) { if (fadeTime > 0) {
fadeTime -= delta; fadeTime -= delta;
if (fadeTime < 0) { if (fadeTime < 0) {