Add docs to Acoustic
This commit is contained in:
@@ -29,10 +29,12 @@ public class AcousticHandler {
|
||||
private ArrayList<GameSound> sounds = new ArrayList<>();
|
||||
|
||||
public AcousticHandler(MdgaApp app) {
|
||||
|
||||
this.app = app;
|
||||
}
|
||||
|
||||
/**
|
||||
* This method updates the acousticHandler and should be called every frame
|
||||
*/
|
||||
public void update() {
|
||||
updateVolumeAndTrack();
|
||||
|
||||
@@ -52,6 +54,11 @@ public void update() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method instantly plays a sound
|
||||
*
|
||||
* @param sound the sound to be played
|
||||
*/
|
||||
public void playSound(MdgaSound sound) {
|
||||
ArrayList<SoundAssetDelayVolume> assets = new ArrayList<SoundAssetDelayVolume>();
|
||||
switch (sound) {
|
||||
@@ -72,6 +79,11 @@ public void playSound(MdgaSound sound) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This method fades the played music to fit the state.
|
||||
*
|
||||
* @param state the state of which the corresponding music should be played to be played
|
||||
*/
|
||||
public void playState(MdgaState state) {
|
||||
if(this.state == state) {
|
||||
return;
|
||||
@@ -105,10 +117,23 @@ public void playState(MdgaState state) {
|
||||
scheduled = new GameMusic(app, asset, getMusicVolumeTotal(), asset.getSubVolume(), asset.getLoop());
|
||||
}
|
||||
|
||||
/**
|
||||
* Performs linear interpolation between two float values.
|
||||
*
|
||||
* @param start The starting value.
|
||||
* @param end The ending value.
|
||||
* @param t The interpolation factor, typically between 0 and 1.
|
||||
* @return The interpolated value between start and end.
|
||||
*/
|
||||
private float lerp(float start, float end, float t) {
|
||||
return start + t * (end - start);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the current volume and handles track crossfading logic.
|
||||
* This method is responsible for fading out the currently playing track,
|
||||
* fading in the scheduled track, and handling crossfade between the two tracks.
|
||||
*/
|
||||
private void updateVolumeAndTrack() {
|
||||
if (playing == null && scheduled != null && !fading) {
|
||||
playing = scheduled;
|
||||
@@ -157,6 +182,10 @@ private void updateVolumeAndTrack() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a list of game tracks to the gameTracks collection and shuffles them.
|
||||
* This method adds predefined game tracks to the track list and shuffles the order.
|
||||
*/
|
||||
private void addGameTracks() {
|
||||
Random random = new Random();
|
||||
|
||||
@@ -166,6 +195,10 @@ private void addGameTracks() {
|
||||
Collections.shuffle(gameTracks, random);
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the current game tracks. If the currently playing track is nearing its end,
|
||||
* a new track will be scheduled to play. If the list of game tracks is empty, it will be refreshed.
|
||||
*/
|
||||
private void updateGameTracks() {
|
||||
if(playing.nearEnd(10)) {
|
||||
if (gameTracks.isEmpty()) {
|
||||
@@ -182,35 +215,75 @@ private void updateGameTracks() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the main volume level.
|
||||
*
|
||||
* @return The current main volume level.
|
||||
*/
|
||||
public float getMainVolume() {
|
||||
return mainVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the music volume level.
|
||||
*
|
||||
* @return The current music volume level.
|
||||
*/
|
||||
public float getMusicVolume() {
|
||||
return musicVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the sound volume level.
|
||||
*
|
||||
* @return The current sound volume level.
|
||||
*/
|
||||
public float getSoundVolume() {
|
||||
return soundVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the main volume level.
|
||||
*
|
||||
* @param mainVolume The desired main volume level.
|
||||
*/
|
||||
public void setMainVolume(float mainVolume) {
|
||||
this.mainVolume = mainVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the music volume level.
|
||||
*
|
||||
* @param musicVolume The desired music volume level.
|
||||
*/
|
||||
public void setMusicVolume(float musicVolume) {
|
||||
this.musicVolume = musicVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the sound volume level.
|
||||
*
|
||||
* @param soundVolume The desired sound volume level.
|
||||
*/
|
||||
public void setSoundVolume(float soundVolume) {
|
||||
this.soundVolume = soundVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the total music volume by multiplying the music volume by the main volume.
|
||||
*
|
||||
* @return The total music volume.
|
||||
*/
|
||||
float getMusicVolumeTotal() {
|
||||
|
||||
return getMusicVolume() * getMainVolume();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates the total sound volume by multiplying the sound volume by the main volume.
|
||||
*
|
||||
* @return The total sound volume.
|
||||
*/
|
||||
float getSoundVolumeTotal() {
|
||||
return getSoundVolume() * getMainVolume();
|
||||
}
|
||||
|
||||
@@ -5,12 +5,25 @@
|
||||
import com.jme3.audio.AudioSource;
|
||||
import pp.mdga.client.MdgaApp;
|
||||
|
||||
/**
|
||||
* Represents a game music track, including its playback controls and volume settings.
|
||||
* This class manages the playback of a music track, allowing for playing, pausing,
|
||||
* volume adjustment, and tracking the current status of the music.
|
||||
*/
|
||||
class GameMusic {
|
||||
private float volume;
|
||||
private final float subVolume;
|
||||
|
||||
private final AudioNode music;
|
||||
|
||||
/**
|
||||
* Constructs a new GameMusic object.
|
||||
*
|
||||
* @param app The instance of the application, used to access the asset manager.
|
||||
* @param asset The music asset to be played.
|
||||
* @param volume The total volume of the music, adjusted by the main volume.
|
||||
* @param subVolume A relative volume that modifies the base music volume, typically a percentage.
|
||||
* @param loop A flag indicating whether the music should loop once it finishes.
|
||||
*/
|
||||
GameMusic(MdgaApp app, MusicAsset asset, float volume, float subVolume, boolean loop) {
|
||||
this.volume = volume;
|
||||
this.subVolume = subVolume;
|
||||
@@ -23,6 +36,11 @@ class GameMusic {
|
||||
music.setLooping(loop);
|
||||
}
|
||||
|
||||
/**
|
||||
* Plays the current music track.
|
||||
* If the music is already initialized, it starts playback.
|
||||
* If the music is not available, no action is performed.
|
||||
*/
|
||||
void play() {
|
||||
if(null == music) {
|
||||
return;
|
||||
@@ -31,6 +49,10 @@ void play() {
|
||||
music.play();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pauses the current music track.
|
||||
* If the music is not available or is not playing, no action is performed.
|
||||
*/
|
||||
void pause() {
|
||||
if(null == music) {
|
||||
return;
|
||||
@@ -39,11 +61,23 @@ void pause() {
|
||||
music.stop();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the current music track is playing.
|
||||
*
|
||||
* @return true if the music is playing, false otherwise.
|
||||
*/
|
||||
boolean isPlaying() {
|
||||
|
||||
return music.getStatus() == AudioSource.Status.Playing;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the current music track is near the end.
|
||||
*
|
||||
* @param thresholdSeconds The threshold in seconds. If the remaining time is less than or equal to this value,
|
||||
* the track is considered near the end.
|
||||
* @return true if the track is near its end (within the threshold), false otherwise.
|
||||
*/
|
||||
boolean nearEnd(float thresholdSeconds) {
|
||||
if (music == null || !isPlaying()) {
|
||||
return false;
|
||||
@@ -61,6 +95,12 @@ boolean nearEnd(float thresholdSeconds) {
|
||||
return remainingTime <= thresholdSeconds;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the volume of the music.
|
||||
* If the volume has changed, it will adjust the music's volume accordingly.
|
||||
*
|
||||
* @param newVolume The new total volume for the music.
|
||||
*/
|
||||
void update(float newVolume) {
|
||||
if(volume != newVolume) {
|
||||
volume = newVolume;
|
||||
|
||||
@@ -6,6 +6,11 @@
|
||||
import com.jme3.system.NanoTimer;
|
||||
import pp.mdga.client.MdgaApp;
|
||||
|
||||
/**
|
||||
* Represents a game sound effect, with control over playback, volume, and timing.
|
||||
* This class manages the playback of a sound effect, including starting playback after a delay,
|
||||
* adjusting volume, and tracking whether the sound has finished playing.
|
||||
*/
|
||||
class GameSound {
|
||||
private float volume;
|
||||
final private float subVolume;
|
||||
@@ -18,6 +23,15 @@ class GameSound {
|
||||
private float delay = 0.0f;
|
||||
private NanoTimer timer = null;
|
||||
|
||||
/**
|
||||
* Constructs a new GameSound object.
|
||||
*
|
||||
* @param app The instance of the application, used to access the asset manager.
|
||||
* @param asset The sound asset to be played.
|
||||
* @param volume The total volume of the sound, adjusted by the main volume.
|
||||
* @param subVolume A relative volume that modifies the base sound volume, typically a percentage.
|
||||
* @param delay The delay before the sound starts playing, in seconds.
|
||||
*/
|
||||
GameSound(MdgaApp app, SoundAsset asset, float volume, float subVolume, float delay) {
|
||||
this.volume = volume;
|
||||
this.subVolume = subVolume;
|
||||
@@ -32,10 +46,21 @@ class GameSound {
|
||||
timer = new NanoTimer();
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the sound is currently playing.
|
||||
*
|
||||
* @return true if the sound is playing, false otherwise.
|
||||
*/
|
||||
boolean isPlaying() {
|
||||
return !finished;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the sound playback, adjusting the volume if necessary, and starting
|
||||
* the sound after the specified delay.
|
||||
*
|
||||
* @param newVolume The new total volume for the sound.
|
||||
*/
|
||||
void update(float newVolume) {
|
||||
if(!playing && timer.getTimeInSeconds() > delay) {
|
||||
sound.play();
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
package pp.mdga.client.Acoustic;
|
||||
|
||||
/**
|
||||
* Enum representing the various sound effects used in the game.
|
||||
* Each sound corresponds to an event or action in the game and may consist of one or more
|
||||
* audio files, potentially with time delays between them.
|
||||
*
|
||||
* These sounds are used to play specific audio cues, such as when a dice is rolled,
|
||||
* a turn starts or ends, a piece is moved or lost, and various other events in the game.
|
||||
*/
|
||||
public enum MdgaSound {
|
||||
DICE_ROLL,
|
||||
TURN_START,
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
package pp.mdga.client.Acoustic;
|
||||
|
||||
/**
|
||||
* Enum representing various music assets used in the game.
|
||||
* Each constant corresponds to a specific music track, along with its properties such as file path,
|
||||
* looping behavior, and relative volume (subVolume).
|
||||
* These music assets are used to control the music that plays in different parts of the game, such as menus and in-game music.
|
||||
*/
|
||||
enum MusicAsset {
|
||||
MAIN_MENU("Spaceship.wav", 1.0f),
|
||||
LOBBY("DeadPlanet.wav", 1.0f),
|
||||
@@ -15,26 +21,55 @@ enum MusicAsset {
|
||||
private final boolean loop;
|
||||
private final float subVolume;
|
||||
|
||||
/**
|
||||
* Constructs a new MusicAsset object with the specified name and sub-volume.
|
||||
* The track will not loop by default.
|
||||
*
|
||||
* @param name The name of the music file.
|
||||
* @param subVolume A relative volume that modifies the base volume of the track (typically a percentage).
|
||||
*/
|
||||
MusicAsset(String name, float subVolume) {
|
||||
this.path = "music/" + name;
|
||||
this.loop = false;
|
||||
this.subVolume = subVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a new MusicAsset object with the specified name, loop flag, and sub-volume.
|
||||
*
|
||||
* @param name The name of the music file.
|
||||
* @param loop If true, the track will loop; otherwise, it will play once.
|
||||
* @param subVolume A relative volume that modifies the base volume of the track (typically a percentage).
|
||||
*/
|
||||
MusicAsset(String name, boolean loop, float subVolume) {
|
||||
this.path = "music/" + name;
|
||||
this.loop = loop;
|
||||
this.subVolume = subVolume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the file path of the music track.
|
||||
*
|
||||
* @return The path to the music file (relative to the music folder).
|
||||
*/
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets whether the music track should loop.
|
||||
*
|
||||
* @return true if the track should loop, false otherwise.
|
||||
*/
|
||||
public boolean getLoop() {
|
||||
return loop;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the relative volume (subVolume) for the music track.
|
||||
*
|
||||
* @return The relative volume for the track, typically a value between 0.0 and 1.0.
|
||||
*/
|
||||
public float getSubVolume() {
|
||||
return subVolume;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
package pp.mdga.client.Acoustic;
|
||||
|
||||
/**
|
||||
* Enum representing various sound assets used in the game.
|
||||
* Each constant corresponds to a specific sound effect used throughout the game.
|
||||
* These sounds are associated with various events and actions, such as dice rolls,
|
||||
* turn changes, piece movements, and game outcomes.
|
||||
*/
|
||||
enum SoundAsset {
|
||||
DICE_ROLL(""),
|
||||
TURN_START(""),
|
||||
@@ -15,10 +21,20 @@ enum SoundAsset {
|
||||
|
||||
private final String path;
|
||||
|
||||
/**
|
||||
* Constructs a new SoundAsset object with the specified name.
|
||||
*
|
||||
* @param name The name of the sound file.
|
||||
*/
|
||||
SoundAsset(String name) {
|
||||
this.path = "sound/" + name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the file path of the sound effect.
|
||||
*
|
||||
* @return The path to the sound file (relative to the sound folder).
|
||||
*/
|
||||
public String getPath() {
|
||||
return path;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
package pp.mdga.client.Acoustic;
|
||||
|
||||
record SoundAssetDelayVolume(SoundAsset asset, float subVolume, float delay) {
|
||||
}
|
||||
/**
|
||||
* A record that encapsulates a sound asset along with its playback settings:
|
||||
* the relative volume (subVolume) and a delay before it starts playing.
|
||||
*/
|
||||
record SoundAssetDelayVolume(SoundAsset asset, float subVolume, float delay) { }
|
||||
|
||||
@@ -20,8 +20,8 @@ public class BoardView {
|
||||
|
||||
private final MdgaApp app;
|
||||
|
||||
private PileControl drawPile = new PileControl();
|
||||
private PileControl discardPile = new PileControl();
|
||||
private PileControl drawPile = null;
|
||||
private PileControl discardPile = null;
|
||||
|
||||
private ArrayList<NodeControl> infield = new ArrayList<NodeControl>(40);
|
||||
private ArrayList<PieceControl> pieces;
|
||||
|
||||
Reference in New Issue
Block a user