我想实现一个很酷的效果,当爆炸时,音乐会稍微变慢一些.
本Music类libgdx的不允许改变声音的音高,我尝试使用Sound类,而不是Music玩我的音乐,但它在加载文件很慢(5秒为5 MB的文件,在桌面上!).
所以,问题是如果有办法解决这个问题,或者是否有一个外部库,它可以在桌面和Android上运行,并且可以与libgdx一起使用.
经过一些搜索,我找到了一种编辑libgdx源代码的方法.
您需要使用该AudioDevice对象按样本播放音乐样本,为此,您需要包含libgdx的音频扩展名.
我们将编辑libgdx源代码,因此您需要下载它并用正确的libgdx项目替换gdx.jar,gdx-backend-android.jar和gdx-backend-lwjgl.jar(它们具有相同的名称而没有jar扩展名)
1)编辑gdx项目的com.badlogic.gdx.audio包中的AudioDevice.java
在界面中添加以下代码
public void setSpeed(float val);
Run Code Online (Sandbox Code Playgroud)
2)编辑gdx-backend-android项目的com.badlogic.gdx.backends.android包中的AndroidAudioDevice.java
AudioDevice类的Android端依赖于Android sdk的AudioTrack类,这个类有一个setPlaybackRate(..)方法.
在类中添加以下代码
@Override
public void setSpeed (float speed) {
track.setPlaybackRate((int)(track.getSampleRate()*speed));
}
Run Code Online (Sandbox Code Playgroud)
3)编辑gdx-backend-lwjgl项目的com.badlogic.gdx.backends.lwjgl.audio包中的OpenALAudioDevice.java
AudioDevice的桌面端依赖于OpenAL(音频的opengl),它具有方便的设置间距方法
在类中添加以下内容
@Override
public void setSpeed (float speed) {
alSourcef(sourceID, AL_PITCH, speed);
}
Run Code Online (Sandbox Code Playgroud)
4)播放音频
这是加载和播放声音文件的代码
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.audio.AudioDevice;
import com.badlogic.gdx.audio.io.Mpg123Decoder;
import com.badlogic.gdx.files.FileHandle;
public class MusicBeat {
static short[] samples = new short[2048];
Mpg123Decoder decoder;
AudioDevice device;
static FileHandle externalFile;
public boolean playing=true;
public MusicBeat(String name )
{
FileHandle file=Gdx.files.internal(name);
FileHandle external=Gdx.files.external("myappname/"+name);
if(!external.exists())file.copyTo(external); //copy the file to the external storage only if it doesnt exists yet
decoder = new Mpg123Decoder(external);
device = Gdx.audio.newAudioDevice(decoder.getRate(),decoder.getChannels() == 1 ? true : false);
playing=false;
externalFile=file;
}
void play()
{
playing=true;
Thread playbackThread = new Thread(new Runnable() {
@Override
public synchronized void run() {
int readSamples = 0;
while ( playing) {
if(decoder!=null){
if((readSamples = decoder.readSamples(samples, 0,samples.length))<=0){
decoder.dispose();
decoder = new Mpg123Decoder(externalFile);
playing=false;
}
device.writeSamples(samples, 0, readSamples);
}
}
}
});
playbackThread.setDaemon(true);
playbackThread.start();
}
public void stop(){
playing=false;
decoder.dispose();
}
public void setVolume(float vol){
device.setVolume(vol);
}
public void setSpeed(float speed){
device.setSpeed(speed);
}
Run Code Online (Sandbox Code Playgroud)
}
哪里可以获得音频扩展?(AudioDevice需要)
音频扩展似乎已被弃用,并且容易找到罐子,我已将它们上传到这里,它是旧版本但应该可以正常工作.
更简单的方法?
如果您的游戏只打算在桌面上运行,那么桌面上的libgdx音乐类再次依赖于OpenAL,它可以提供播放音高的功能,因此您只需要编辑音乐界面(桌面上的OpenALMusic)而不是不幸的是,因为dawez说Android上的Music类依赖于MediaPlayer而不是给我们提供音高变换选项,所以AudioDevice并通过样本事物得出整个播放样本.
结论:这种方法对我来说似乎并不好看.如果你的游戏真的需要音高的东西,没有它就没有意义,那就去吧,否则它只是为了这么小的细节而付出了太大的努力.
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |