有了前面的基礎,我們就可以開發游戲了,當然這就看自己的程度了,呵呵!但是,開發出的游戲再華麗是否都有些遺憾呢?對了就是少了音樂的緣故。我們這就一起來看一看怎樣在游戲中添加音樂。
J2ME通過Mobile Media API 支撐手機音頻,這是在特定類型的設備上支撐不同程度的多媒體的類和接口的一個聚集。更具體地說,Mobile Media API劃分為兩個不同的API聚集:
一個是Mobile Media API,重要針對高級聲音和多媒體才能;另一個是MIDP2.0 Media API,重要針對支撐唯一音頻的受限制的設備。很明顯,我們重要是討論後一部分。
MIDP2.0 Media API缭繞著2個重要的部分進行設計:治理器,播放器,和把持器。MIDP2.0 Media API都位於javax.microedition.media和Javax.microedition.media.control包中。其中治理器Manager位於media包中,它通過為各種媒體類型創立播放器,從而使我們能夠查詢一個手機的媒體才能。播放器Player接口位於同一個包中,供給了一組通用的方法來把持音頻的回放。把持器Control接口位於media.control包中,用來進行特定類型的媒體把持,例如,VolumeControl用來把持音量,ToneControl用來把持樂音。
假如要想知道我們的手機對語音支撐的才能,我們可以應用下面的代碼(只供給Canvas類):
import Javax.microedition.lcdui.*;
import Javax.microedition.media.*;
import Javax.microedition.media.control.*;
public class SCCanvas extends Canvas {
private Display display;
public SCCanvas(Display d) {
super();
display = d;
}
void start() {
display.setCurrent(this);
repaint();
}
public void paint(Graphics g) {
// 清除畫布
g.setColor(0, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(255, 255, 255);
// 得得手機支撐的聲音的類型
String[] contentTypes = Manager.getSupportedContentTypes(null);
// 顯示所支撐的聲音的類型
int y = 0;
for (int i = 0; i < contentTypes.length; i++) {
// 顯示類型
g.drawString(contentTypes[i], 0, y, Graphics.TOP | Graphics.LEFT);
y += Font.getDefaultFont().getHeight();
// 假如支撐樂音天生器,播放樂音
if (contentTypes[i] == "audio/x-tone-seq") {
try {
Manager.playTone(ToneControl.C4, 2000, 100);
}
catch(MediaException me) {
}
}
}
}
}
下面是MIDP2.0手機所支撐的常見的音頻MIME類型:
audio/x-tone-seq 表現樂音和樂音序列;audio/x-wav表現聲波聲音;audio/midi表現midi音樂;audio/mpeg表現MP3音頻。
應用MIDP2.0 Media API的步驟:
(1) 應用Manager類獲得一個針對特定媒體類型的播放器。
(2) 應用Player接口在特定的播放器上播放媒體。
(3) 假如需要的話,應用Control接口來轉變媒體的回放。
下面是一個播放樂音的例子:
byte tempo=50; // 設定聲音播放速度
byte d=8; // 聲調值
byte C4=ToneControl.C4; //基准聲調
byte D4=(byte)(C4+2); //聲調值
byte E4=(byte)(C4+4);
byte G4=(byte)(C4+7);
byte rest=ToneControl.SILENCE; //無聲
byte[] mySequence=
{
ToneControl.VERSION,1, //設置版本號,當前必需設為1
ToneControl.TEMPO,tempo, //設置聲音播放速度,值越大,播放越快
ToneControl.SET_VOLUME,100, //設置音量,值越大,音量越大
ToneControl.BLOCK_START,0, //預定義播放塊,當前塊號為0
E4,d,D4,d,C4,d,E4,d,
E4,d,E4,d,E4,d,rest,d, //塊的內容
ToneControl.BLOCK_END,0, //塊定義結束符
ToneControl.PLAY_BLOCK,0, //播放當前塊號為0的塊,塊號必需提前定義
D4,d,D4,d,D4,d,rest,d, //不應用塊號方法播放的內容,必需位於塊定義後面
};
//創立播放器
Player p=Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR);
//准備播放信息
p.realize();
//獲取聲調把持
ToneControl c=(ToneControl)p.getControl("ToneControl");
//設置聲調序列
c.setSequence(mySequence);
//設置播放資源,獲取設備
p.prefetch();
//開端播放
p.start();
}
catch(Exception e)
{
}
下面是一個播放音樂文件的例子:
try
{
//從資源中獲取聲音
InputStream is=getClass().getResourceAsStream("/"+"Testsound.mid");
//創立播放MIDI聲音的播放器
Player player=Manager.createPlayer(is,"audio/midi");
//獲取播放信息
player.realize();
//獲取設備
player.prefetch();
//開端播放聲音
player.start();
VolumeControl control=(VolumeControl)player.getControl("VolumeControl"); //獲得把持接口,此接口的獲得必需在獲取播放信息或者獲取播放設備後面,假如在它們前面,將會呈現無法播放聲音的情況
if(control!=null) //必需檢查是否為null,由於有些聲音格局可能不支撐音量把持
{
control.setLevel(5); //設置音量級別為50
//control.setMute(true); //設置靜音
}
只是一個簡略的例子,更具體的請參考專業的書籍。