290 likes | 389 Views
Java 游戏开发 学习情境 5 :音乐播放器设计. 08 游戏 3-2. 目标: 为游戏添加音效,能够用 Java 加载、播放游戏中的声音文件,并按要求控制播放。 任务: 用 Java 设计一个播放多种声音的程序。为电梯模拟游戏添加背景音乐。. 目标与任务. 教师. 学生. 提供: 声音播放案例. 模仿完成: 声音播放案例. 项目核心. 提供: 多个声音列表 播放关键代码. 协作完成: 多个声音列表 播放. 功能扩展. 提供: 电梯游戏的 声音和界面. 协作完成: 电梯游戏的 音效处理. 应用升级. 学习过程.
E N D
Java游戏开发学习情境5:音乐播放器设计 08游戏3-2
目标: • 为游戏添加音效,能够用Java加载、播放游戏中的声音文件,并按要求控制播放。 任务: • 用Java设计一个播放多种声音的程序。为电梯模拟游戏添加背景音乐。 目标与任务
教师 学生 提供: 声音播放案例 模仿完成: 声音播放案例 项目核心 提供: 多个声音列表 播放关键代码 协作完成: 多个声音列表 播放 功能扩展 提供: 电梯游戏的 声音和界面 协作完成: 电梯游戏的 音效处理 应用升级 学习过程
AU文件格式 • WAV文件格式 • AIFF文件格式 • MIDI文件格式 声音文件有很多格式 Java支持的音频文件格式
这是Java语言最早的声音格式,扩展名为AU或SND,适用于短的声音文件。AU类型文件使用的三种典型音频格式为:8位单声道采样频率为8KHz的μ-law类型、8位线性类型以及16位线性类型。这是Java语言最早的声音格式,扩展名为AU或SND,适用于短的声音文件。AU类型文件使用的三种典型音频格式为:8位单声道采样频率为8KHz的μ-law类型、8位线性类型以及16位线性类型。 AU声音文件
扩展名为WAV,由Microsoft和IBM共同开发,Windows 9X系统都支持此格式。 WAV声音文件
扩展名为AIF或IEF,是Macintosh公司和SGI公司所共用的标准音频文件格式。扩展名为AIF或IEF,是Macintosh公司和SGI公司所共用的标准音频文件格式。 AIFF声音文件
扩展名为MID,是音乐制造业所认可的标准,主要用于控制诸如合成器和声卡之类的设备。Java 2平台支持三种类型的MIDI文件公式,它们分别为MIDI文件类型O、MIDI文件类型1以及RMF。 MIDI声音文件
java.applet.Applet • javax.sound.midi • javax.sound.midi.spi • javax.sound.sampled • javax.sound.sampled.spi 与声音处理有关的包和类
javax.sound.midi包,为I/O、序列化和MIDI数据的合成提供接口和类。 • javax.sound.midi.spi 包,为新MIDI设备、MIDI文件阅读器和编写器等的实现提供接口。javax.sound.sampled 包,为捕获、处理和播放音频数据提供接口和类。 • javax.sound.sampled.spi 包,为新音频设备、声音文件阅读器和编写器或音频格式转换提供抽象类。 与声音处理有关的包和类
使用play()方法装载与播放声音。格式如下:1、void play(URL url) 2、void play(URL url,String name) • 一旦play()方法装载了声音文件就立即播放。如果找不到,play()方法不返回出错信息,反应到用户端就是听不到声音。 • play()方法只播放一遍声音文件 在Applet类播放声音
如果需要重复播放某个声音文件,就需要使用AudioClip接口提供的方法。如果需要重复播放某个声音文件,就需要使用AudioClip接口提供的方法。 • AudioClip接口提供播放声音片段的方法。 • 多个AudioClip项可以在同一时间播放,从而产生声音混合的效果。 重复播放声音
(1)通过继承Applet类来创建一个有三个按钮的容器(1)通过继承Applet类来创建一个有三个按钮的容器 • import java.applet.*; • public class mAudio extends Applet{} • (2)定义成员属性 • 包含3个成员属性,分别表示播放的声音的URL相对地址,当前播放的音频流和声音播放状态。 步骤一:创建一个Applet小程序
(3)在Applet的子类中覆盖Applet类的init()方法 • init()是java.applet.Applet类中的方法,当applet程序首次被打开时,会执行此方法定义的程序代码。当applet程序首次被打开时,init()将第一个被自动执行。 • 在其中调用getAudioClip来初始化当前要播放的音频流: • audio=getAudioClip(new URL(getDocumentBase(),hurl)); 步骤一:创建一个Applet小程序
(1)为Applet容器添加按钮动作监听器 • 由于要对Applet容器中发生的三种按钮按下事件进行分别响应,可以直接在 • init()方法中对三个按钮添加语句: • addActionListener(this); • (2)实现ActionListener接口 • public class mAudio extends Applet implements ActionListener{ • public void actionPerformed(ActionEvent e) { • … } • } 步骤二:对Applet容器中的按钮动作进行事件处理
这里需要根据事件源即按钮的不同作出分别动作,可以通过e.getActionCommand()来判断是哪个按钮被按下。这里需要根据事件源即按钮的不同作出分别动作,可以通过e.getActionCommand()来判断是哪个按钮被按下。 • AudioClip类中的play,stop,loop方法分别对应播放、停止和循环播放功能。 步骤一:创建一个Applet小程序
定义令一组成员属性 • 包含新的3个成员属性,分别表示播放的第二段声音的URL相对地址,当前播放的音频流和声音播放状态。改写init()方法 • 在其中调用getAudioClip来初始化另一个要播放的音频流: • Audio2=getAudioClip(new URL(getDocumentBase(),hurl2)); • 并且添加一套新按钮,重新布局。 扩展步骤一:增加一套按钮
为Applet容器中的新按钮添加事件监听器 • 由于要对Applet容器中发生的三种按钮按下事件进行分别响应,可以直接在 • init()方法中对三个按钮添加语句: • addActionListener(this); • (4)实现ActionListener接口,在actionPerformed方法中对六个事件源作出相应 • public class mAudio extends Applet implements ActionListener{ • public void actionPerformed(ActionEvent e) { • … } • } 扩展步骤二:对Applet容器中的按钮重新进行事件处理
完成(1)-(4),得到最终结果的正确输出,100分。完成(1)-(4),得到最终结果的正确输出,100分。 • 完成(1)-(3),正确生成菜单,80分。 • 完成(1)-(2),正确生成菜单,60分。 完成情况评价标准
编写一个applet让用户从几个音频片段中选择来播放,程序运行画面如下: 功能扩展之案例二
// 程序中声音的名字 • public final String[] AUDIO = • { "ping", "pop", "return", "salvation", "shuffle", "squish" }; • // 包含上述字符串数组的下拉框 • private Choice choice; • // 真实的音频片段数据 • private AudioClip[] clips; 功能扩展之案例二
// 控制播放停止的按钮 • private Button playClip; • private Button loopClip; • private Button stopClip; • private Button stopAllClips; • // 跟踪当前哪些音频片段在播放 • private boolean[] clipsPlaying; 功能扩展之案例二
问题陈述: • 在电梯系统的模拟程序里,公司要求在模拟中加入声音。例如,当一个人走路时,应能听到脚步声。每当按下或者复位一个楼层按钮或者电梯按钮时,应当听到单击声。电梯到达时铃声应当响起,且在门打开时或者关上时,门应当吱吱作响。最后,当电梯在楼层间运行时,应播放“电梯音乐”。 应用升级
解决思路: • 编写类SoundEffects,将声音文件转换成java.applet.AudioClip对象 应用升级
try { return Applet.newAudioClip( getClass().getResource( prefix + soundFile ) ); } // return null if soundFile does not exist catch ( NullPointerException nullPointerException ) { return null; } } 关键代码
(2)编写一个类,通过播放AudioClip对象来产生声音。(学生自主完成)(2)编写一个类,通过播放AudioClip对象来产生声音。(学生自主完成) 应用升级