package com.github.czyzby.lml.uedi.music;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.math.Interpolation;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import com.badlogic.gdx.scenes.scene2d.actions.TemporalAction;
/** Allows to easily handle {@link Music} volume transitions.
*
* @author MJ */
public class VolumeAction extends TemporalAction {
private float start, end;
private Music music;
@Override
protected void begin() {
music.setVolume(start);
}
@Override
protected void update(final float percent) {
music.setVolume(start + (end - start) * percent);
}
@Override
protected void end() {
music.setVolume(end);
music = null;
}
@Override
public void reset() {
super.reset();
music = null;
}
/** @return managed {@link Music} instance. */
public Music getMusic() {
return music;
}
/** @param music managed {@link Music} instance. */
public void setMusic(final Music music) {
this.music = music;
}
/** @return initial volume. */
public float getStart() {
return start;
}
/** @param start initial volume. */
public void setStart(final float start) {
this.start = start;
}
/** @return target volume. */
public float getEnd() {
return end;
}
/** @param end target volume. */
public void setEnd(final float end) {
this.end = end;
}
/** @param music its volume will go from 0 to 1.
* @param duration length of the transition.
* @return {@link VolumeAction} which should be added to a stage. */
public static VolumeAction fadeIn(final Music music, final float duration) {
return fadeIn(music, duration, Interpolation.fade);
}
/** @param music its volume will go from 0 to 1.
* @param duration length of the transition.
* @param interpolation handles how the volume is changed in time.
* @return {@link VolumeAction} which should be added to a stage. */
public static VolumeAction fadeIn(final Music music, final float duration, final Interpolation interpolation) {
return setVolume(music, 0f, 1f, duration, interpolation);
}
/** @param music its volume will go from current value to 0.
* @param duration length of the transition.
* @return {@link VolumeAction} which should be added to a stage. */
public static VolumeAction fadeOut(final Music music, final float duration) {
return fadeOut(music, duration, Interpolation.fade);
}
/** @param music its volume will go from current value to 0.
* @param duration length of the transition.
* @param interpolation handles how the volume is changed in time.
* @return {@link VolumeAction} which should be added to a stage. */
public static VolumeAction fadeOut(final Music music, final float duration, final Interpolation interpolation) {
return setVolume(music, music.getVolume(), 0f, duration, interpolation);
}
/** @param music its volume will be modified.
* @param from starting volume value.
* @param to target volume value.
* @param duration length of the transition.
* @param interpolation decides how the volume is changed in time.
* @return {@link VolumeAction} instance which should be added to a stage. */
public static VolumeAction setVolume(final Music music, final float from, final float to, final float duration,
final Interpolation interpolation) {
final VolumeAction action = Actions.action(VolumeAction.class);
action.start = from;
action.end = to;
action.music = music;
action.setDuration(duration);
action.setInterpolation(interpolation);
return action;
}
}