Testmerge #5
@@ -29,10 +29,12 @@ public class AcousticHandler {
|
|||||||
private ArrayList<GameSound> sounds = new ArrayList<>();
|
private ArrayList<GameSound> sounds = new ArrayList<>();
|
||||||
|
|
||||||
public AcousticHandler(MdgaApp app) {
|
public AcousticHandler(MdgaApp app) {
|
||||||
|
|
||||||
this.app = app;
|
this.app = app;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method updates the acousticHandler and should be called every frame
|
||||||
|
*/
|
||||||
public void update() {
|
public void update() {
|
||||||
updateVolumeAndTrack();
|
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) {
|
public void playSound(MdgaSound sound) {
|
||||||
ArrayList<SoundAssetDelayVolume> assets = new ArrayList<SoundAssetDelayVolume>();
|
ArrayList<SoundAssetDelayVolume> assets = new ArrayList<SoundAssetDelayVolume>();
|
||||||
switch (sound) {
|
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) {
|
public void playState(MdgaState state) {
|
||||||
if(this.state == state) {
|
if(this.state == state) {
|
||||||
return;
|
return;
|
||||||
@@ -105,10 +117,23 @@ public void playState(MdgaState state) {
|
|||||||
scheduled = new GameMusic(app, asset, getMusicVolumeTotal(), asset.getSubVolume(), asset.getLoop());
|
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) {
|
private float lerp(float start, float end, float t) {
|
||||||
return start + t * (end - start);
|
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() {
|
private void updateVolumeAndTrack() {
|
||||||
if (playing == null && scheduled != null && !fading) {
|
if (playing == null && scheduled != null && !fading) {
|
||||||
playing = scheduled;
|
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() {
|
private void addGameTracks() {
|
||||||
Random random = new Random();
|
Random random = new Random();
|
||||||
|
|
||||||
@@ -166,6 +195,10 @@ private void addGameTracks() {
|
|||||||
Collections.shuffle(gameTracks, random);
|
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() {
|
private void updateGameTracks() {
|
||||||
if(playing.nearEnd(10)) {
|
if(playing.nearEnd(10)) {
|
||||||
if (gameTracks.isEmpty()) {
|
if (gameTracks.isEmpty()) {
|
||||||
@@ -182,35 +215,75 @@ private void updateGameTracks() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the main volume level.
|
||||||
|
*
|
||||||
|
* @return The current main volume level.
|
||||||
|
*/
|
||||||
public float getMainVolume() {
|
public float getMainVolume() {
|
||||||
return mainVolume;
|
return mainVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the music volume level.
|
||||||
|
*
|
||||||
|
* @return The current music volume level.
|
||||||
|
*/
|
||||||
public float getMusicVolume() {
|
public float getMusicVolume() {
|
||||||
return musicVolume;
|
return musicVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the sound volume level.
|
||||||
|
*
|
||||||
|
* @return The current sound volume level.
|
||||||
|
*/
|
||||||
public float getSoundVolume() {
|
public float getSoundVolume() {
|
||||||
return soundVolume;
|
return soundVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the main volume level.
|
||||||
|
*
|
||||||
|
* @param mainVolume The desired main volume level.
|
||||||
|
*/
|
||||||
public void setMainVolume(float mainVolume) {
|
public void setMainVolume(float mainVolume) {
|
||||||
this.mainVolume = mainVolume;
|
this.mainVolume = mainVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the music volume level.
|
||||||
|
*
|
||||||
|
* @param musicVolume The desired music volume level.
|
||||||
|
*/
|
||||||
public void setMusicVolume(float musicVolume) {
|
public void setMusicVolume(float musicVolume) {
|
||||||
this.musicVolume = musicVolume;
|
this.musicVolume = musicVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the sound volume level.
|
||||||
|
*
|
||||||
|
* @param soundVolume The desired sound volume level.
|
||||||
|
*/
|
||||||
public void setSoundVolume(float soundVolume) {
|
public void setSoundVolume(float soundVolume) {
|
||||||
this.soundVolume = 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() {
|
float getMusicVolumeTotal() {
|
||||||
|
|
||||||
return getMusicVolume() * getMainVolume();
|
return getMusicVolume() * getMainVolume();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates the total sound volume by multiplying the sound volume by the main volume.
|
||||||
|
*
|
||||||
|
* @return The total sound volume.
|
||||||
|
*/
|
||||||
float getSoundVolumeTotal() {
|
float getSoundVolumeTotal() {
|
||||||
return getSoundVolume() * getMainVolume();
|
return getSoundVolume() * getMainVolume();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,12 +5,25 @@
|
|||||||
import com.jme3.audio.AudioSource;
|
import com.jme3.audio.AudioSource;
|
||||||
import pp.mdga.client.MdgaApp;
|
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 {
|
class GameMusic {
|
||||||
private float volume;
|
private float volume;
|
||||||
private final float subVolume;
|
private final float subVolume;
|
||||||
|
|
||||||
private final AudioNode music;
|
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) {
|
GameMusic(MdgaApp app, MusicAsset asset, float volume, float subVolume, boolean loop) {
|
||||||
this.volume = volume;
|
this.volume = volume;
|
||||||
this.subVolume = subVolume;
|
this.subVolume = subVolume;
|
||||||
@@ -23,6 +36,11 @@ class GameMusic {
|
|||||||
music.setLooping(loop);
|
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() {
|
void play() {
|
||||||
if(null == music) {
|
if(null == music) {
|
||||||
return;
|
return;
|
||||||
@@ -31,6 +49,10 @@ void play() {
|
|||||||
music.play();
|
music.play();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pauses the current music track.
|
||||||
|
* If the music is not available or is not playing, no action is performed.
|
||||||
|
*/
|
||||||
void pause() {
|
void pause() {
|
||||||
if(null == music) {
|
if(null == music) {
|
||||||
return;
|
return;
|
||||||
@@ -39,11 +61,23 @@ void pause() {
|
|||||||
music.stop();
|
music.stop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the current music track is playing.
|
||||||
|
*
|
||||||
|
* @return true if the music is playing, false otherwise.
|
||||||
|
*/
|
||||||
boolean isPlaying() {
|
boolean isPlaying() {
|
||||||
|
|
||||||
return music.getStatus() == AudioSource.Status.Playing;
|
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) {
|
boolean nearEnd(float thresholdSeconds) {
|
||||||
if (music == null || !isPlaying()) {
|
if (music == null || !isPlaying()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -61,6 +95,12 @@ boolean nearEnd(float thresholdSeconds) {
|
|||||||
return remainingTime <= 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) {
|
void update(float newVolume) {
|
||||||
if(volume != newVolume) {
|
if(volume != newVolume) {
|
||||||
volume = newVolume;
|
volume = newVolume;
|
||||||
|
|||||||
@@ -6,6 +6,11 @@
|
|||||||
import com.jme3.system.NanoTimer;
|
import com.jme3.system.NanoTimer;
|
||||||
import pp.mdga.client.MdgaApp;
|
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 {
|
class GameSound {
|
||||||
private float volume;
|
private float volume;
|
||||||
final private float subVolume;
|
final private float subVolume;
|
||||||
@@ -18,6 +23,15 @@ class GameSound {
|
|||||||
private float delay = 0.0f;
|
private float delay = 0.0f;
|
||||||
private NanoTimer timer = null;
|
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) {
|
GameSound(MdgaApp app, SoundAsset asset, float volume, float subVolume, float delay) {
|
||||||
this.volume = volume;
|
this.volume = volume;
|
||||||
this.subVolume = subVolume;
|
this.subVolume = subVolume;
|
||||||
@@ -32,10 +46,21 @@ class GameSound {
|
|||||||
timer = new NanoTimer();
|
timer = new NanoTimer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the sound is currently playing.
|
||||||
|
*
|
||||||
|
* @return true if the sound is playing, false otherwise.
|
||||||
|
*/
|
||||||
boolean isPlaying() {
|
boolean isPlaying() {
|
||||||
return !finished;
|
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) {
|
void update(float newVolume) {
|
||||||
if(!playing && timer.getTimeInSeconds() > delay) {
|
if(!playing && timer.getTimeInSeconds() > delay) {
|
||||||
sound.play();
|
sound.play();
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
package pp.mdga.client.Acoustic;
|
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 {
|
public enum MdgaSound {
|
||||||
DICE_ROLL,
|
DICE_ROLL,
|
||||||
TURN_START,
|
TURN_START,
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
package pp.mdga.client.Acoustic;
|
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 {
|
enum MusicAsset {
|
||||||
MAIN_MENU("Spaceship.wav", 1.0f),
|
MAIN_MENU("Spaceship.wav", 1.0f),
|
||||||
LOBBY("DeadPlanet.wav", 1.0f),
|
LOBBY("DeadPlanet.wav", 1.0f),
|
||||||
@@ -15,26 +21,55 @@ enum MusicAsset {
|
|||||||
private final boolean loop;
|
private final boolean loop;
|
||||||
private final float subVolume;
|
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) {
|
MusicAsset(String name, float subVolume) {
|
||||||
this.path = "music/" + name;
|
this.path = "music/" + name;
|
||||||
this.loop = false;
|
this.loop = false;
|
||||||
this.subVolume = subVolume;
|
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) {
|
MusicAsset(String name, boolean loop, float subVolume) {
|
||||||
this.path = "music/" + name;
|
this.path = "music/" + name;
|
||||||
this.loop = loop;
|
this.loop = loop;
|
||||||
this.subVolume = subVolume;
|
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() {
|
public String getPath() {
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets whether the music track should loop.
|
||||||
|
*
|
||||||
|
* @return true if the track should loop, false otherwise.
|
||||||
|
*/
|
||||||
public boolean getLoop() {
|
public boolean getLoop() {
|
||||||
return loop;
|
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() {
|
public float getSubVolume() {
|
||||||
return subVolume;
|
return subVolume;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
package pp.mdga.client.Acoustic;
|
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 {
|
enum SoundAsset {
|
||||||
DICE_ROLL(""),
|
DICE_ROLL(""),
|
||||||
TURN_START(""),
|
TURN_START(""),
|
||||||
@@ -15,10 +21,20 @@ enum SoundAsset {
|
|||||||
|
|
||||||
private final String path;
|
private final String path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new SoundAsset object with the specified name.
|
||||||
|
*
|
||||||
|
* @param name The name of the sound file.
|
||||||
|
*/
|
||||||
SoundAsset(String name) {
|
SoundAsset(String name) {
|
||||||
this.path = "sound/" + 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() {
|
public String getPath() {
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
package pp.mdga.client.Acoustic;
|
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 final MdgaApp app;
|
||||||
|
|
||||||
private PileControl drawPile = new PileControl();
|
private PileControl drawPile = null;
|
||||||
private PileControl discardPile = new PileControl();
|
private PileControl discardPile = null;
|
||||||
|
|
||||||
private ArrayList<NodeControl> infield = new ArrayList<NodeControl>(40);
|
private ArrayList<NodeControl> infield = new ArrayList<NodeControl>(40);
|
||||||
private ArrayList<PieceControl> pieces;
|
private ArrayList<PieceControl> pieces;
|
||||||
|
|||||||
Reference in New Issue
Block a user