JAVA 炸弹人(二)
来源:互联网 发布:害怕别人超过自己知乎 编辑:程序博客网 时间:2024/05/16 17:57
JAVA音效
JMF,JAVA多媒体框架。用这个框架播放音乐,和视频代码比较简单,只需要引入相关jar,就OK了。本来是想用这个框架的,后来还是用了JDK自带的。
在把整个项目打成jar运行的时候,资源出现了路径错误,找不到这些音乐资源,如果用流去读这些资源,就可以解决此问题。
下面是主要代码,音效类和音效管理类:
package util; import java.io.BufferedInputStream;import java.io.IOException;import java.io.InputStream;import javax.sound.sampled.AudioFormat;import javax.sound.sampled.AudioInputStream;import javax.sound.sampled.AudioSystem;import javax.sound.sampled.DataLine;import javax.sound.sampled.SourceDataLine;import javax.sound.sampled.UnsupportedAudioFileException;/*** * * @author Jack Lei * @Time 上午11:51:18 2016年1月13日 * @desc */public class Music {private MusicType type;private String filePath; private InputStream inputStream; private boolean running; private final int byteChunkSize = 1024; private byte[] muteData; public Music(MusicType type,String filePath){ this.type = type; running = false; muteData = setMuteData(); this.filePath = filePath; } public void playMusic() {try { inputStream= this.getClass().getResourceAsStream(this.filePath); inputStream = new BufferedInputStream(inputStream); AudioInputStream in = AudioSystem.getAudioInputStream(inputStream); AudioInputStream din = null; AudioFormat baseFormat = in.getFormat(); AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, baseFormat.getSampleRate(), 16, baseFormat.getChannels(), baseFormat.getChannels() * 2, baseFormat.getSampleRate(), false); din = AudioSystem.getAudioInputStream(decodedFormat, in); stream(decodedFormat, din); in.close();} catch (UnsupportedAudioFileException | IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} private void stream(AudioFormat targetFormat, AudioInputStream din){ try{ byte[] data = new byte[byteChunkSize]; SourceDataLine line = getLine(targetFormat); if(line != null){ line.start(); int nBytesRead = 0; while(nBytesRead != -1 ){ nBytesRead = din.read(data, 0, data.length); if(nBytesRead != -1){ line.write(data, 0, nBytesRead); } // while(pause && running){// wait(15);// } } line.drain(); line.stop(); line.close(); din.close(); } }catch(Exception e){ System.err.println("Problem playing audio!"); e.printStackTrace(); } } private SourceDataLine getLine(AudioFormat audioFormat){ SourceDataLine res = null; DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat); try{ res = (SourceDataLine) AudioSystem.getLine(info); res.open(audioFormat); }catch(Exception e){ System.err.println("Could not get audio line!"); e.printStackTrace(); } return res; } public boolean isPlaying(){ return running; } public void stop(){ this.running =false; } public void play(){ this.running = true; } private byte[] setMuteData(){ byte[] x = new byte[byteChunkSize]; for(int i = 0; i < x.length; i++){ x[i] = 0; } return x; } /** * @return the muteData */public byte[] getMuteData() {return muteData;}/** * @return the byteChunkSize */public int getByteChunkSize() {return byteChunkSize;}/** * @return the type */public MusicType getType() {return type;} }
/** * */package util;import java.util.HashMap;import java.util.Iterator;import java.util.Map;/** * @author Jack Lei * @Time 下午5:33:25 2016年1月11日 * @desc */public class MusicManager {private static MusicManager instance ;private Thread musicThread;private static Map<MusicType,Music> musics = new HashMap<MusicType, Music>();private MusicManager(){musics.put(MusicType.BACK_GROUND,new Music(MusicType.BACK_GROUND, "/sound/back_sound.wav"));musics.put(MusicType.READY, new Music(MusicType.READY, "/sound/ready.wav"));musics.put(MusicType.BOOM, new Music(MusicType.BOOM, "/sound/boom.wav"));musics.put(MusicType.MOVE, new Music(MusicType.MOVE, "/sound/move.wav"));musics.put(MusicType.SET_BOMB, new Music(MusicType.SET_BOMB, "/sound/setbomb.wav"));musics.put(MusicType.WIN, new Music(MusicType.WIN, "/sound/win.wav"));musics.put(MusicType.FILE, new Music(MusicType.FILE, "/sound/faile.wav"));musics.put(MusicType.GET_ITEM, new Music(MusicType.GET_ITEM, "/sound/getItem.wav"));musics.put(MusicType.ENEMY_BOOM, new Music(MusicType.GET_ITEM, "/sound/enemy.wav"));}public static MusicManager getInstance(){if(instance == null){instance = new MusicManager();}return instance;}public void run(){musicThread = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub while(true){ Iterator<Music> musicIterator = musics.values().iterator(); while(musicIterator.hasNext()){ Music music = musicIterator.next(); if(music.getType() != MusicType.BACK_GROUND){ if(music.isPlaying()){ music.playMusic();; music.stop(); } } } try {Thread.sleep(Common.THREAD_SLEEP_TIME);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} } }});musicThread.start();new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){musics.get(MusicType.BACK_GROUND).playMusic();; try {Thread.sleep(Common.THREAD_SLEEP_TIME);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}).start();}public void playerMusic(MusicType type){musics.get(type).play();}public void stopMusic(MusicType type){musics.get(type).stop();} }
源代码:
点击下载
后续:
这次就没写整个开发过程了,我会在新年假期时,写一个RPG类型,记录整个开发过程,希望自己能完成。哈哈。
0 0
- JAVA 炸弹人(二)
- 【Java】炸弹人小游戏
- JAVA 炸弹人(一)
- java 制作炸弹人
- Java炸弹人实现及源码
- 炸弹人
- 炸弹人
- 炸弹人
- 星球炸弹 (二)
- csapp 实验二 二进制炸弹
- 搜索之“炸弹人”
- hdu 3529 炸弹人
- 再解炸弹人
- 炸弹人--枚举
- 炸弹人 游戏
- 3.2炸弹人
- 炸弹人 枚举
- 炸弹人:深搜
- SSH框架jsp迭代实体类,并获取关联对象的属性
- Maven架构及使用
- SwipeRefreshLayout与ViewPager滑动事件冲突解决
- jQuery全屏滚动插件fullPage.js
- 2.1使用synchronized同步方法
- JAVA 炸弹人(二)
- python安装feedparser失败
- 为何电脑里的物体如此逼真
- C++菱形继承及解决方法
- mysql kettle 分页
- tspitr(tablespace point in time recovery)实验
- 前瞻:2016年商业智能的七大趋势
- EditText只允许输入数字和字母,且是暗文显示的
- C#源代码—演示静态构造函数的使用