Commit e2cb276d authored by kingyu's avatar kingyu Committed by kingyuluk
Browse files

feat: 更换音频播放方式

BREAKING CHANGE: 使用AudioClip类的方法播放连续的短音频可能会导致线程冲突使游戏卡顿,改用sun.audio类的AudioPlayer方法播放音频
parent 4e8f8dab
package com.bird.main; package com.bird.main;
import com.bird.util.MusicUtil;
import static com.bird.util.Constant.FRAME_HEIGHT; import static com.bird.util.Constant.FRAME_HEIGHT;
import static com.bird.util.Constant.FRAME_WIDTH; import static com.bird.util.Constant.FRAME_WIDTH;
import static com.bird.util.Constant.FRAME_X; import static com.bird.util.Constant.FRAME_X;
...@@ -119,7 +117,6 @@ public class GameFrame extends Frame implements Runnable { ...@@ -119,7 +117,6 @@ public class GameFrame extends Frame implements Runnable {
foreground = new GameForeground(); foreground = new GameForeground();
ready = new GameReady(); ready = new GameReady();
bird = new Bird(); bird = new Bird();
MusicUtil.load();
setGameState(STATE_READY); setGameState(STATE_READY);
// 启动用于刷新窗口的线程 // 启动用于刷新窗口的线程
......
...@@ -22,36 +22,37 @@ public class Constant { ...@@ -22,36 +22,37 @@ public class Constant {
public static final int FRAME_Y = 100; public static final int FRAME_Y = 100;
// 图像资源路径 // 图像资源路径
public static final String BG_IMG_PATH = "sources/img/background.png"; // 背景图片 public static final String BG_IMG_PATH = "resources/img/background.png"; // 背景图片
public static final int HOVER_MOVING_SCORE = 4; //出现移动管道的分数 public static final int HOVER_MOVING_SCORE = 4; //出现移动管道的分数
// 小鸟图片 // 小鸟图片
public static final String[][] BIRDS_IMG_PATH = { public static final String[][] BIRDS_IMG_PATH = {
{ "sources/img/0.png", "sources/img/1.png", "sources/img/2.png", "sources/img/3.png", "sources/img/4.png", { "resources/img/0.png", "resources/img/1.png", "resources/img/2.png", "resources/img/3.png",
"sources/img/5.png", "sources/img/6.png", "sources/img/7.png" }, "resources/img/4.png", "resources/img/5.png", "resources/img/6.png", "resources/img/7.png" },
{ "sources/img/up.png", "sources/img/up.png", "sources/img/up.png", "sources/img/up.png", { "resources/img/up.png", "resources/img/up.png", "resources/img/up.png", "resources/img/up.png",
"sources/img/up.png", "sources/img/up.png", "sources/img/up.png", "sources/img/up.png" }, "resources/img/up.png", "resources/img/up.png", "resources/img/up.png", "resources/img/up.png" },
{ "sources/img/down_0.png", "sources/img/down_1.png", "sources/img/down_2.png", "sources/img/down_3.png", { "resources/img/down_0.png", "resources/img/down_1.png", "resources/img/down_2.png",
"sources/img/down_4.png", "sources/img/down_5.png", "sources/img/down_6.png", "resources/img/down_3.png", "resources/img/down_4.png", "resources/img/down_5.png",
"sources/img/down_7.png" }, "resources/img/down_6.png", "resources/img/down_7.png" },
{ "sources/img/dead.png", "sources/img/dead.png", "sources/img/dead.png", "sources/img/dead.png", { "resources/img/dead.png", "resources/img/dead.png", "resources/img/dead.png", "resources/img/dead.png",
"sources/img/dead.png", "sources/img/dead.png", "sources/img/dead.png", "sources/img/dead.png", } }; "resources/img/dead.png", "resources/img/dead.png", "resources/img/dead.png",
"resources/img/dead.png", } };
// 云朵图片 // 云朵图片
public static final String[] CLOUDS_IMG_PATH = { "sources/img/cloud_0.png", "sources/img/cloud_1.png" }; public static final String[] CLOUDS_IMG_PATH = { "resources/img/cloud_0.png", "resources/img/cloud_1.png" };
// 水管图片 // 水管图片
public static final String[] PIPE_IMG_PATH = { "sources/img/pipe.png", "sources/img/pipe_top.png", public static final String[] PIPE_IMG_PATH = { "resources/img/pipe.png", "resources/img/pipe_top.png",
"sources/img/pipe_bottom.png" }; "resources/img/pipe_bottom.png" };
public static final String TITLE_IMG_PATH = "sources/img/title.png"; public static final String TITLE_IMG_PATH = "resources/img/title.png";
public static final String NOTICE_IMG_PATH = "sources/img/start.png"; public static final String NOTICE_IMG_PATH = "resources/img/start.png";
public static final String SCORE_IMG_PATH = "sources/img/score.png"; public static final String SCORE_IMG_PATH = "resources/img/score.png";
public static final String OVER_IMG_PATH = "sources/img/over.png"; public static final String OVER_IMG_PATH = "resources/img/over.png";
public static final String AGAIN_IMG_PATH = "sources/img/again.png"; public static final String AGAIN_IMG_PATH = "resources/img/again.png";
public static final String SCORE_FILE_PATH = "sources/score"; // 分数文件路径 public static final String SCORE_FILE_PATH = "resources/score"; // 分数文件路径
// 游戏背景色 // 游戏背景色
public static final Color BG_COLOR = new Color(0x4bc4cf); public static final Color BG_COLOR = new Color(0x4bc4cf);
......
package com.bird.util; package com.bird.util;
import java.applet.Applet; import java.io.FileInputStream;
import java.applet.AudioClip; import java.io.FileNotFoundException;
import java.io.File; import java.io.IOException;
import java.net.MalformedURLException; import java.io.InputStream;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
/** /**
* 音乐工具类 * 音乐工具类
* *
* @author Kingyu wav音频:JDK提供的类可直接解码 mp3音频:JDK没有提供支持,需要使用第三方的工具包 * @author Kingyu wav音频:JDK提供的类可直接解码 mp3音频:JDK没有提供支持,需要使用第三方的工具包
* *
*/ */
public class MusicUtil { public class MusicUtil {
private static AudioClip fly; private static AudioStream fly;
private static AudioClip crash; private static AudioStream crash;
private static AudioClip score; private static AudioStream score;
// 装载音乐资源 private static InputStream flyIn;
@SuppressWarnings("deprecation") private static InputStream crashIn;
public static void load() { private static InputStream scoreIn;
try {
fly = Applet.newAudioClip(new File("sources/wav/fly.wav").toURL());
crash = Applet.newAudioClip(new File("sources/wav/crash.wav").toURL());
score = Applet.newAudioClip(new File("sources/wav/score.wav").toURL());
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
//wav播放 //wav播放
public static void playFly() { public static void playFly() {
fly.play(); try {
// create an audiostream from the inputstream
flyIn = new FileInputStream("resources/wav/fly.wav");
fly = new AudioStream(flyIn);
} catch (FileNotFoundException fnfe) {
} catch (IOException ioe) {
}
AudioPlayer.player.start(fly);
} }
public static void playCrash() { public static void playCrash() {
crash.play(); try {
// create an audiostream from the inputstream
crashIn = new FileInputStream("resources/wav/crash.wav");
crash = new AudioStream(crashIn);
} catch (FileNotFoundException fnfe) {
} catch (IOException ioe) {
}
AudioPlayer.player.start(crash);
} }
public static void playScore() { public static void playScore() {
score.play(); try {
// create an audiostream from the inputstream
scoreIn = new FileInputStream("resources/wav/score.wav");
score = new AudioStream(scoreIn);
} catch (FileNotFoundException fnfe) {
} catch (IOException ioe) {
}
AudioPlayer.player.start(score);
} }
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment