今天偷个懒, 整理一下声音。
声音是非常重要的。CLDC中声音一样可以为game增色不少,
播放声音使用的是import javax.microedition.media 包中的Player和Manager, 可以很方便的播放多种媒体类型的声音,具体的类型和参数字符串,请查看帮助,和有关说明。需要注意的呢, 控制好开缓存的时机, 因为本身没有同步机制,所以要手写一些同步事件和状态标示。多种类型声音的混用应该没有问题。仅仅测试了一下同步播放tone。
大部分代码没有变, 所以只列出更改部分的:
public class BackCanvas extends GameCanvas {
.....
public VoiceCtr Voice_Sore;
.
.
.
protected void keyPressed(int keyCode){
.......
switch (keyCode) {
case -1:{
Manager.playTone(69, 1000, 200);
if (scence.screenY>scence.unitHeight) scence.screenY=scence.screenY-scence.unitHeight; break;
}
..........
case -5:{
Voice_Sore = new VoiceCtr(this);Voice_Sore.setPriority(1);Voice_Sore.start();
ani= new SpeakAni(this);ani.setPriority(1); ani.start(); //过高的线程优先级会导致线程sleep 也优先执行。
}
在两个按键触发声音播放。
新增加的声音播放线程:
import javax.microedition.lcdui.game.GameCanvas;
import javax.microedition.media.Player;
import javax.microedition.media.Manager;
import java.io.InputStream;
public class VoiceCtr extends Thread {
private GameCanvas owner;
private InputStream is_Sore;
public Player player;
public VoiceCtr(GameCanvas creater){
owner=creater;
is_Sore = getClass().getResourceAsStream("/test.wav");
if (is_Sore== null) {
System.out.println("读取文件错误。");}
try {
player = Manager.createPlayer(is_Sore,"audio/x-wav");
}
catch (Exception e){
System.out.println("建立播放器错误");
e.printStackTrace();
}
}
public void run(){
try{
player.start();
}
catch (Exception pe){
pe.printStackTrace();
}
}
}
配合一下画面:
import javax.microedition.media.Player;
public class SpeakAni extends Thread {
private BackCanvas bc;
private int frameIndex;
private int maxFrameIndex;
public SpeakAni (BackCanvas creater){
bc=creater;
frameIndex=0;
maxFrameIndex=bc.Sore.getRawFrameCount()-1;
}
public void run(){
boolean saying=true;
while (saying){
while (frameIndex<=maxFrameIndex){
bc.Sore.setFrame(frameIndex);
frameIndex=frameIndex+1;
bc.repaint();
try{
sleep(50);
System.out.println("changeing...");
}
catch (Exception e)
{
;
}
}
frameIndex=0;
if (bc.Voice_Sore.player.getState()!=Player.STARTED) saying=false;
}
}
}

被折叠的 条评论
为什么被折叠?



