Audio

Heli haldav klass

Audio lisamiseks oma mängu tuleks algselt luua klass nagu nt AudioManager, kuhu saab lisada audio käsitlemisega seotud meetodid. LibGDX pakub ka Sound ja Music klasse, mida saab kasutada muusika ning muud tüüpi helide nagu tulistamise, jooksmise, eristamiseks. Lisaks aitab ka AssetManager kasutamine efektiivsemalt helivara laadida ja hallata.

AudioManager klassi loomine on hea mitmel põhjusel:

  • Koondab kõik heliga seotud funktsioonid nagu heliressursside laadimine, esitamine, peatamine jne, ühte kohta, mis võimaldab tsentraliseeritud haldamist kõigi audioga seotud tegevuste kohta.

  • Heliloogika kapseldamine spetsiifilisse klassi eraldab see implementeerimise detailid teistest koodiosadest, mis parendab koodi loetavust ja hooldatavust.

  • Haldava klassi olemasolu soodustab koodi korduvkasutatavust, pakkudes erinevatele ekraanidele lihtsat juurdepääsu helifunktsioonidele, mis hoiab ära dubleeritud koodi ning tagab ühtlase heli käitumise läbi mängu.

  • Mängu keerukuse kasvades saab ka eraldioleva klassi tõttu vajadusel hõlpsasti sinna meetodeid juurde lisada või olemasolevaid muuta.

Koodistruktuuri näide

public class AudioManager {
   private AssetManager assetManager;
   private Music backgroundMusic;
   private Sound soundEffect;
   private float musicVolume;
   private float soundVolume;

   // Constructor, initialization, and configuration methods

   public void loadAssets() {
       // Load audio assets using AssetManager
   }

   public void playBackgroundMusic() {
       // Play background music
   }

   public void playSoundEffect() {
       // Play sound effect
   }

   // Methods for controlling audio playback, adjusting volume, etc.

   public void dispose() {
       // Dispose of audio resources
   }
}
  • loadAssets() meetodi kaudu saab laadida sisse AssetManager abil oma helivarasid.

  • playBackgroundMusic() mängib näiteks mingit taustamuusikat.

  • playSoundEffect() mängib mingisugust heli.

  • dispose() meetodit kasutatakse erinevate helide kõrvaldamiseks peale kasutust vältimaks mälulekkeid.

Helide loomine

Selleks, et luua erinevaid helisid, tuleb ette valmistada helifailid kas .wav, .mp3 või mingis muus formaadis. Wav formaati on näiteks hea kasutada, kuna see on lossless format, mis tähendab, et kompresseerimise (compression) ajal ei kao algne helikvaliteet ning .wav failid laevad tüüpiliselt kiiremini kui teised formaadid, kuna dekompresseerimise (decompression) vajadus puudub. Järgmisena tuleks fail eeldatavasti oma projekti asset directory kausta paigaldada, kust neid hiljem kätte saab. Kasutades assetManager.load() meetodit saab heli sisse laadida ning finishLoading() tagab, et kõik vajalikud helid on sisse laetud enne jätkamist. (Selle meetodi kasutamisel tuleb arvestada, et kui on palju varasid (asset) vaja laadida või fail on suur, võib mäng seiskuda seniks kuni vajalik on laetud, kuid AssetManageri asünkroonne laadimine load() meetodil tüüpiliselt aitab sellel mitte juhtuda.)

public void loadAssets() {
   assetManager.load("path/to/file.wav", Music.class);
   // You can load more assets here if needed
   assetManager.finishLoading(); // Blocking call to ensure all assets are loaded
   backgroundMusic = assetManager.get("path/to/file.wav", Music.class);
}

public void playBackgroundMusic() {
       backgroundMusic.play();
}

Mängu alustades saab muusika nüüd mängima panna

public class GameScreen implements Screen {
   private AudioManager audioManager;

   public GameScreen() {
       // Initialize AudioManager
       audioManager = new AudioManager();

       // Load audio assets
       audioManager.loadAssets();
   }

   @Override
   public void show() {
       audioManager.playBackgroundMusic();
   }

   // Other screen methods and implementation
}

Volüüm

Volüümi muutmist saab implementeerida näiteks LibGDX poolt pakutud Liugur (Slider) klassiga.

public class VolumeSlider extends Slider {
   private AudioManager audioManager;

   public VolumeSlider(float min, float max, float stepSize, boolean vertical, Skin skin, AudioManager audioManager) {
       super(min, max, stepSize, vertical, skin);
       this.audioManager = audioManager;

       // Add a change listener to the slider
       addListener(new ChangeListener() {
           @Override
           public void changed(ChangeEvent event, Actor actor) {
               // Retrieve the current slider value
               float volume = getValue();

               // Update the music volume using AudioManager
               audioManager.setMusicVolume(volume);
           }
       });
   }
}
  • Konstruktor initsialiseerib volüümi liuguri (VolumeSlider) parameetritega min ja max, mis määravad minimaalse ja maksimaalse väärtuse; stepSize, mis määrab mitme võrra volüüm korraga tõuseb või langeb; vertical, mis määrab liuguri (slider) orientatsiooni; skin, mida kasutatakse liuguri (slider) stiliseerimiseks ja audioManager, mis seob liuguri (slider) oma heli haldava klassiga.

  • super() initsialiseerib liuguri (slider) sisseantud parameetritega.

  • addListener() lisab nö “muutuste kuulaja”, mis käivitab changed() meetodi, kui kasutaja volüümi redigeerida üritab.

Nüüd saab lisada selle näiteks oma AudioScreen klassile.

public class AudioScreen implements Screen {
   private Stage stage;
   private Skin skin;
   private AudioManager audioManager;


   public AudioScreen() {
       // Initialize AudioManager
       audioManager = new AudioManager();

       // Load UI skin
       skin = new Skin(Gdx.files.internal("path/to/uiskin.json"));

       // Create volume slider
       VolumeSlider volumeSlider = new VolumeSlider(0f, 1f, 0.1f, false, skin, audioManager);

       // Add slider to stage
       stage.addActor(volumeSlider);
   }

    // Other screen methods and implementation
 }

Lisaks abistavaid materjale