在MIDP應(yīng)用程序中播放聲音
if(block[i][j]){
g.drawImage(
blockImg,
i*BLOCK_WIDTH,
(j+1)*BLOCK_HEIGHT,
Graphics.LEFT|Graphics.TOP);
}
}
}
ex.6
接著查看球和小棒。在paint方法中有以下敘述。(ex.7)
//查看球
g.drawImage(ballImg,ballX,ballY,Graphics.LEFT|Graphics.TOP);
//查看小棒
g.drawImage(barImg,barX,barY,Graphics.LEFT|Graphics.TOP);
ex.7
圖片安裝完成后出現(xiàn)如下畫面。
4.使圖片運(yùn)動(dòng)
接下來使用線程和按鍵事件移動(dòng)球和小棒。為了使用線程就得在AudioCanvas類中安裝Runnable接口、記述run方法。使用球和小棒定義的移動(dòng)速度分別變化球和小棒的坐標(biāo)。此外,小棒的移動(dòng)速度根據(jù)按鍵處理而變化。以下記述了run方法。(ex.8)
/**
*線程的運(yùn)行處理
*/
publicvoidrun(){
while(state==ACTIVE){
moveBall();//使球運(yùn)動(dòng)
moveBar();//移動(dòng)小棒
repaint();//再次描畫
try{
Thread.sleep(50);
}catch(InterruptedCodeExampleceptione){
e.printStackTrace();
break;
}
}
}
/**
//使球運(yùn)動(dòng)
*/
publicvoidmoveBall(){
ballX+=ballMovCodeExample;
ballY+=ballMoveY;
}
/**
*移動(dòng)小棒
*/
publicvoidmoveBar(){
barX+=barMovCodeExample;
//不能向畫面外移動(dòng)
if(barX0){
barX=0;
}elseif(barX+BAR_WIDTH>getWidth()){
barX=getWidth()-BAR_WIDTH;
}
}
ex.8
以下表示的是按鍵處理。(ex.9)
/*****************************************
*按鍵處理
*****************************************/
/**
*按按鍵時(shí)
*/
protectedvoidkeyPressed(intkey){
if(state==ACTIVE){//正在運(yùn)動(dòng)
if(getGameAction(key)==Canvas.RIGHT){
barMovCodeExample=6;
}elseif(getGameAction(key)==Canvas.LEFT){
barMovCodeExample=-6;
}
repaint();
}else{//停止運(yùn)動(dòng)后
//再次啟動(dòng)
this.initialize();
}
}
/**
*釋放按鍵時(shí)
*/
protectedvoidkeyReleased(intkey){
barMovCodeExample=0;
}
ex.9
5.球的反彈
下面是球的反彈。
球的反彈形式有以下3種。
·碰邊壁后反彈
·碰小棒后反彈
·碰彩球后反彈
記述了每個(gè)moveBall方法。(ex.10)
碰彩球的反彈時(shí)
block[i][j]=false;
blockCount--;
彩球立刻就破碎。彩球破碎后余下的彩球數(shù)量blockCount將有所減少。
另外,球掉落時(shí),改變游戲狀態(tài)后游戲結(jié)束。
/**
//使球運(yùn)動(dòng)
*/
publicvoidmoveBall(){
ballX+=ballMovCodeExample;
ballY+=ballMoveY;
//反彈
//碰邊壁后反彈
if(ballX0){
ballMovCodeExample*=-1;
ballX=0;
}elseif(getWidth()
ballX=getWidth()-BALL_HEIGHT;
ballMovCodeExample*=-1;
}
if(ballY0){
ballMoveY*=-1;
ballY=0;
}elseif(ballY>getHeight()){//球落下后
//游戲結(jié)束
state=GAME_OVER;
}
//碰上小棒后反彈
if(ballY+BALL_HEIGHT>barY
ballX+BALL_WIDTH>barX
ballX
ballMoveY*=-1;
ballY=barY-BALL_HEIGHT;
if(barMovCodeExample0){
ballMovCodeExample-=2;
}elseif(barMovCodeExample>0){
ballMovCodeExample+=2;
}
}
//碰上彩球后反彈
for(inti=0;i
for(intj=0;j
if(block[i][j]){
if(ballX+BALL_WIDTH>i*BLOCK_WIDTH
ballX(i+1)*BLOCK_WIDTH){
if(ballY+BALL_HEIGHT>(j+1)*BLOCK_HEIGHT
ballY(j+2)*BLOCK_HEIGHT){
//清除彩球
block[i][j]=false;
blockCount--;
ballMoveY*=-1;}
}
}
}
}
}
}
ex.10
碰小棒后反彈情況如下所示:向右按鍵時(shí),球就會(huì)讓右方快速移動(dòng),反之,向左按鍵時(shí),球則向左方快速移動(dòng)。(ex.11)
if(barMoveX0){
ballMoveX-=2;
}elseif(barMoveX>0){
ballMoveX+=2;
}
ex.11
·清除檢查
至此安裝完畢游戲就有雛形了。但是,在現(xiàn)在的程序中即使彩球全部消失,游戲也不能清除。那么,球與彩球相撞時(shí),數(shù)出彩球的剩余數(shù)。當(dāng)該數(shù)值為0時(shí),則游戲清除。以下記述的是該處理。(ex.12)
//清除彩球
block[i][j]=false;
blockCount--;
ballMoveY*=-1;
//播放音效
blockSound.play();
//檢查游戲清除
if(blockCount==0){
state=CLEAR;
}
ex.12
6.音樂播放
在本講中的泡泡龍游戲的應(yīng)用程序中最好使用BGM和音效。游戲開始的同時(shí)演奏BGM,音效則是球在碰壁、碰小棒反彈時(shí),以及彩球破碎時(shí)才播放的。
·讀取
用BlockApplication構(gòu)造函數(shù)讀取音樂數(shù)據(jù)。而且,這里的BGM能夠循環(huán)播放,所以可以使用音頻事件處理。(ex.13)
評(píng)論