1.在主mainGame 里设置music信息
1 2 3 | private Music music; private int musicId; private int lastMusicId; public int musicVoice;<br> public int soundVoice; |
2.初始化加载
musicVoice=gameConfig.playerConfig.getInteger("music",4);
soundVoice=gameConfig.playerConfig.getInteger("sound",4);
musicId=gameConfig.geRandomtMusicId(0,0);
music = Gdx.audio.newMusic(gameConfig.getMusicFile(musicId));
music.setLooping(true);
music.setVolume(musicVoice*1f/7);
music.play();
3.记录音乐信息并加载
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public int geRandomtMusicId( int type, int lastId) { Array<XmlReader.Element> xmlEs=getCONFIG_MUSIC().e.getChildrenByName( "music" ); int musicId=lastId; IntArray rs=game.tempUtil.getTempIntArray(); for ( int i= 0 ;i<xmlEs.size;i++){ XmlReader.Element e=xmlEs.get(i); int id=e.getInt( "id" ); if (e.getInt( "type" ,- 1 )==type&&id!=lastId){ rs.add(id); } } if (rs.size> 0 ){ musicId=rs.random(); game.tempUtil.disposeTempIntArray(rs); } Gdx.app.log( "geRandomtMusicId" ,lastId+ ":" +musicId+ ":" +type); return musicId; } public FileHandle getMusicFile( int musicId){ XmlReader.Element e=getCONFIG_MUSIC().getElementById(musicId); if (e!= null ){ return Gdx.files.internal(e.get( "file" )); } return Gdx.files.internal( "audio/jokull.mp3" ); } |
4.播放
//ifForceLoop 是否强制设定音乐循环
public void setMusicById(int id,boolean ifForceLoop){
Gdx.app.log("playMusic",id+":"+musicVoice);
if(musicId!=id||!music.isLooping()){
lastMusicId=musicId;
musicId=id;
music.pause();
music.dispose();
music = Gdx.audio.newMusic(gameConfig.getMusicFile(musicId));
// music.setLooping(true);
music.setVolume(musicVoice*1f/7);
music.play();
if(gameConfig.getCONFIG_MUSIC().getElementById(musicId).get("play","loop").equals("loop")||ifForceLoop){
music.setLooping(true);
}else{
music.setLooping(false);
music.setOnCompletionListener(new Music.OnCompletionListener() {
@Override
public void onCompletion(Music aMusic) {
int musicType=gameConfig.getCONFIG_MUSIC().getElementById(musicId).getInt("type",0);
int musicId=gameConfig.geRandomtMusicId(musicType,lastMusicId);
setMusicById(musicId,false);
}
});
}
}
}
public void setMusicByType(int type){
int musicType=gameConfig.getCONFIG_MUSIC().getElementById(musicId).getInt("type",0);
if(type!=musicType){
int musicId=gameConfig.geRandomtMusicId(type,this.musicId);
setMusicById(musicId,false);
}
}
5.在转换场景中加入切歌
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | public void toScreen( int nextScreenId) { if (nextScreenId== 81 ){ //获取战斗场景中的详细音乐设定 XmlReader.Element xmlE=gameConfig.getDEF_STAGE().getElementById(stageId); int musicId=xmlE.getInt( "musicId" , 0 ); if (musicId==- 1 ){ //如果值是-1,则默认为通用战斗场景播放 int bgmType=gameConfig.getCONFIG_LAYOUT().getElementById(screenId).getInt( "bgmType" ); setMusicByType(bgmType); } else { setMusicById(musicId, true ); } } else { //获取普通场景的音乐类型设定 int bgmType=gameConfig.getCONFIG_LAYOUT().getElementById(screenId).getInt( "bgmType" ); setMusicByType(bgmType); } -----------------场景跳转-------------------- } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!