com.bladecoder.engine.model.MusicEngine Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of blade-engine Show documentation
Show all versions of blade-engine Show documentation
Classic point and click adventure game engine
package com.bladecoder.engine.model;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.Json.Serializable;
import com.badlogic.gdx.utils.JsonValue;
import com.bladecoder.engine.assets.AssetConsumer;
import com.bladecoder.engine.assets.EngineAssetManager;
import com.bladecoder.engine.util.EngineLogger;
/**
* Simple music engine.
*
* Plays a music file, if another music is playing, stops it before playing the
* new music.
*
* @author rgarcia
*/
public class MusicEngine implements Serializable, AssetConsumer {
private MusicDesc desc = null;
private Music music = null;
private float currentMusicDelay = 0;
private boolean isPlayingSer = false;
private float musicPosSer = 0;
transient private boolean isPaused = false;
public void playMusic() {
if (music != null && !music.isPlaying()) {
music.play();
music.setLooping(desc.isLoop());
}
}
public void pauseMusic() {
if (music != null && music.isPlaying()) {
music.pause();
isPaused = true;
}
}
public void resumeMusic() {
if (music != null && isPaused) {
music.play();
isPaused = false;
}
}
public void stopMusic() {
if (music != null)
music.stop();
}
public void setMusic(MusicDesc d) {
stopMusic();
currentMusicDelay = 0;
if (d != null) {
if (desc != null)
dispose();
desc = new MusicDesc(d);
retrieveAssets();
} else {
dispose();
desc = null;
}
}
public void setVolume(float volume) {
if(desc != null)
desc.setVolume(volume);
if(music != null)
music.setVolume(volume);
}
public void leaveScene(MusicDesc newMusicDesc) {
if (desc != null && !desc.isStopWhenLeaving() &&
(newMusicDesc == null || newMusicDesc.getFilename().equals(desc.getFilename())))
return;
if (desc != null) {
currentMusicDelay = 0;
stopMusic();
dispose();
}
if (newMusicDesc != null) {
desc = new MusicDesc(newMusicDesc);
} else {
desc = null;
}
}
public void update(float delta) {
// music delay update
if (music != null && !music.isPlaying()) {
boolean initialTime = false;
if (currentMusicDelay <= desc.getInitialDelay())
initialTime = true;
currentMusicDelay += delta;
if (initialTime) {
if (currentMusicDelay > desc.getInitialDelay())
playMusic();
} else {
if (desc.getRepeatDelay() >= 0 && currentMusicDelay > desc.getRepeatDelay() + desc.getInitialDelay()) {
currentMusicDelay = desc.getInitialDelay();
playMusic();
}
}
}
}
@Override
public void dispose() {
if (music != null) {
EngineLogger.debug("DISPOSING MUSIC: " + desc.getFilename());
EngineAssetManager.getInstance().disposeMusic(desc.getFilename());
music = null;
desc = null;
}
}
@Override
public void loadAssets() {
if (music == null && desc != null) {
EngineLogger.debug("LOADING MUSIC: " + desc.getFilename());
EngineAssetManager.getInstance().loadMusic(desc.getFilename());
}
}
@Override
public void retrieveAssets() {
if (music == null && desc != null) {
if(!EngineAssetManager.getInstance().isLoaded(EngineAssetManager.MUSIC_DIR + desc.getFilename())) {
loadAssets();
EngineAssetManager.getInstance().finishLoading();
}
EngineLogger.debug("RETRIEVING MUSIC: " + desc.getFilename());
music = EngineAssetManager.getInstance().getMusic(desc.getFilename());
if(music != null)
music.setVolume(desc.getVolume());
if (isPlayingSer) {
playMusic();
if (music != null) {
music.setPosition(musicPosSer);
musicPosSer = 0f;
}
isPlayingSer = false;
}
}
}
@Override
public void write(Json json) {
json.writeValue("desc", desc);
json.writeValue("currentMusicDelay", currentMusicDelay);
json.writeValue("isPlaying", music != null && (music.isPlaying()|| isPaused));
json.writeValue("musicPos", music != null && (music.isPlaying()|| isPaused) ? music.getPosition() : 0f);
}
@Override
public void read(Json json, JsonValue jsonData) {
desc = json.readValue("desc", MusicDesc.class, jsonData);
currentMusicDelay = json.readValue("currentMusicDelay", float.class, jsonData);
isPlayingSer = json.readValue("isPlaying", boolean.class, jsonData);
musicPosSer = json.readValue("musicPos", float.class, jsonData);
}
}