您的位置:首页 > 其它

j2me学习七_翻译教程-牧羊犬游戏3

2011-07-27 22:56 190 查看
八.音效实现
SoundEffectsclass
利用MIDP2.0的mediaAPI创建犬吠,绵羊叫,还有游戏结束音
1创建SoundEffects类
2.引入类
importjavax.microedition.media.*;importjava.io.*;3.创建参数
classSoundEffects
{
privatestaticSoundEffectsinstance;
privatePlayersheepSoundPlayer;
privatePlayerdogSoundPlayer;
4.初始化
privateSoundEffects()
{
sheepSoundPlayer=createPlayer("/sheep.wav","audio/x-wav");
dogSoundPlayer=createPlayer("/dog.wav","audio/x-wav");
}
staticSoundEffectsgetInstance()
{
if(instance==null)
{
instance=newSoundEffects();
}
returninstance;
}
5.创建声音播放方法
voidstartSheepSound()
{
startPlayer(sheepSoundPlayer);
}
voidstartDogSound()
{
startPlayer(dogSoundPlayer);
}
voidstartGameOverSound()
{
startPlayer(createPlayer("/gameover.mid","audio/midi"));
}
voidstartHighScoreSound()
{
startPlayer(createPlayer("/highscore.mid","audio/midi"));
}
6.创建音效控制方法
privatevoidstartPlayer(Playerp)
{
if(p!=null)
{
try
{
p.stop();
p.setMediaTime(0L);
p.start();
}
catch(MediaExceptionme)
{
//ignore
}
}
}
7.创建createPlayer方法
privatePlayercreatePlayer(Stringfilename,Stringformat)
{
Playerp=null;
try
{
InputStreamis=getClass().getResourceAsStream(filename);
p=Manager.createPlayer(is,format);
p.prefetch();
}
catch(IOExceptionioe)
{
//ignore
}
catch(MediaExceptionme)
{
//ignore
}
returnp;
}
}
九.实现游戏功能SheepdogCanvasclass1.创建类2.引入类
importjava.util.Random;
importjava.util.Vector;
importjavax.microedition.lcdui.*;
importjavax.microedition.lcdui.game.*;
importjavax.microedition.media.*;
importjava.io.*;
3.SheepdogCanvas类继承GameCanvas类和Runable接口,GameCanvas是Canvas的一个子类,它提供了一些方便的游戏接口,还有一些特殊的游戏特性,例如帧缓冲,按键侦听。
classSheepdogCanvas
extendsGameCanvas
implementsRunnable
{4.定义和初始化参数staticfinalintNONE=-1;staticfinalintUP=0;staticfinalintLEFT=1;staticfinalintDOWN=2;staticfinalintRIGHT=3;privatestaticfinalintMILLIS_PER_TICK=50;privatestaticfinalintNUM_SHEEP=5;privatefinalSheepdogMIDletmidlet;privatefinalFieldfield;privatefinalSheepdogsheepdog;privatefinalVectorsheep=newVector();privatefinalLayerManagerlayerManager;privatefinalGraphicsgraphics;privatelonggameDuration;privatelongstartTime;privatevolatileThreadanimationThread=null;5.创建SheepdogCanvas对象,getGraphic方法用于获得Graphics对象来渲染GameCanvas,LayerManager类用于管理一系列的图层SheepdogCanvas(SheepdogMIDletmidlet){super(true);//suppresskeyeventsforgamekeysthis.midlet=midlet;setFullScreenMode(true);graphics=getGraphics();layerManager=newLayerManager();field=newField();sheepdog=newSheepdog(this);layerManager.append(sheepdog);for(inti=0;i<NUM_SHEEP;++i){SheepnewSheep=newSheep(this);layerManager.append(newSheep);sheep.addElement(newSheep);}layerManager.append(field);//lastlayer,behindspritesinit();}6.创建用于按键侦听的方法,如果按了一个负数按键码的按键了,则跳出菜单publicvoidkeyPressed(intkeyCode){//Theconstructorsuppresseskeyeventsforgamekeys,sowe'll//onlygetkeyeventsfornon-gamekeys.Thenumberkeys,*&#//havepositivekeyCodes,sonegativekeyCodesmeannon-game//specialkeyslikesoft-keys.We'llusekey-pressesonspecial//keystotakeustothemenu.if(keyCode<0){stop();midlet.sheepdogCanvasMenu();}}7.初见初始化函数,getWidth和getHeight方法用于获得当前画布的宽和高,setPosition方法用于设定层得位置(左上角为基准点)voidinit(){sheepdog.setPosition(field.getSheepdogStartX(),field.getSheepdogStartY());for(inti=0;i<sheep.size();++i){Sheepsh=(Sheep)(sheep.elementAt(i));//findavalidpositionforthesheepdo{intx=midlet.random(field.getWidth()-Sheep.WIDTH);inty=midlet.random(field.getHeight()-Sheep.HEIGHT);sh.setPosition(x,y);}while(field.containsImpassableArea(sh.getX(),sh.getY(),sh.getWidth(),sh.getHeight())||overlapsSheepdog(sh)||overlapsSheep(sh,i)||field.inFold(sh));}}8.创建用于开始和终止游戏的方法publicsynchronizedvoidstart(){animationThread=newThread(this);animationThread.start();startTime=System.currentTimeMillis()-gameDuration;}publicsynchronizedvoidstop(){gameDuration=System.currentTimeMillis()-startTime;animationThread=null;}9.创建run方法,FlushGraphics方法用于将缓冲区的图像在屏幕上显示publicvoidrun(){ThreadcurrentThread=Thread.currentThread();try{//ThisendswhenanimationThreadissettonull,orwhen//itissubsequentlysettoanewthread;eitherway,the//currentthreadshouldterminatewhile(currentThread==animationThread){longstartTime=System.currentTimeMillis();//Don'tadvancegameordrawifcanvasiscoveredby//asystemscreen.if(isShown()){tick();draw();flushGraphics();}longtimeTaken=System.currentTimeMillis()-startTime;if(timeTaken<MILLIS_PER_TICK){synchronized(this){wait(MILLIS_PER_TICK-timeTaken);}}else{currentThread.yield();}}}catch(InterruptedExceptione){//won'tbethrown}}10.创建用于监视多按键同时按下的情况,用到了getKeyStates方法来获得当前按键情况privatevoidtick(){//Ifplayerpressestwoormoredirectionbuttons,weignorethem//all.Butpressingfireisindependent.Thecodebelowalsoignores//directionbuttonsifGAME_A..GAME_Darepressed.intkeyStates=getKeyStates();booleanbark=(keyStates&FIRE_PRESSED)!=0;keyStates&=~FIRE_PRESSED;intdirection=(keyStates==UP_PRESSED)?UP:(keyStates==LEFT_PRESSED)?LEFT:(keyStates==DOWN_PRESSED)?DOWN:(keyStates==RIGHT_PRESSED)?RIGHT:NONE;sheepdog.tick(direction,bark);for(inti=0;i<sheep.size();++i){Sheepsh=(Sheep)(sheep.elementAt(i));sh.tick();}field.tick();}11.创建多个方法用于提取对象和控制犬吠FieldgetField(){returnfield;}SheepdoggetSheepdog(){returnsheepdog;}VectorgetSheep(){returnsheep;}voidhandleDogBark(){for(inti=0;i<sheep.size();++i){Sheepsh=(Sheep)(sheep.elementAt(i));sh.handleDogBark();}}12.创建精灵的碰撞控制方法,一个精灵是一个基本的视觉对象,它储存在一个图像中,并能变化;不同的帧能够显示精灵的运动,一些变换,如旋转,缩放也能应用到精灵上,用于进一步改变他们的显示。collidesWith方法用于检测精灵碰撞。booleanoverlapsSheepdog(Spritesprite){returnsprite.collidesWith(sheepdog,false);//false->notpixelLevel}booleanoverlapsSheep(Spritesprite){returnoverlapsSheep(sprite,sheep.size());}//whetherthespriteoverlapsthefirst'count'sheepbooleanoverlapsSheep(Spritesprite,intcount){for(inti=0;i<count;++i){Sheepsh=(Sheep)(sheep.elementAt(i));if(sprite.collidesWith(sh,false))//false->notpixelLevel{returntrue;}}returnfalse;}booleanoverlapsOtherSheep(Spritesprite){for(inti=0;i<sheep.size();++i){Objectobj=sheep.elementAt(i);if(obj!=sprite){Sheepsh=(Sheep)obj;if(sprite.collidesWith(sh,false))//false->notpixelLevel{returntrue;}}}returnfalse;}voidvibrate(intmillis){midlet.vibrate(millis);}13.创建方法用于画出游戏中可视的对象。getX方法获取x值,getY获取y之。//drawgameprivatevoiddraw(){intwidth=getWidth();intheight=getHeight();//clearscreentogreygraphics.setColor(0x00888888);graphics.fillRect(0,0,width,height);//clipandtranslatetocentreintdx=origin(sheepdog.getX()+sheepdog.getWidth()/2,field.getWidth(),width);intdy=origin(sheepdog.getY()+sheepdog.getHeight()/2,field.getHeight(),height);graphics.setClip(dx,dy,field.getWidth(),field.getHeight());graphics.translate(dx,dy);ThepaintmethodpaintsthisLayerifitisvisible.Formoreinformation,seepaintintheMIDP2.0APIspecification.//drawbackgroundandspriteslayerManager.paint(g,0,0);//undoclip&translategraphics.translate(-dx,-dy);graphics.setClip(0,0,width,height);//displaytime&scorelongtime=(System.currentTimeMillis()-startTime)/1000;intscore=numSheepInFold();graphics.setColor(0x00FFFFFF);//whitegraphics.drawString(Integer.toString(score),1,1,Graphics.TOP|Graphics.LEFT);graphics.drawString(Long.toString(time),width-2,1,Graphics.TOP|Graphics.RIGHT);if(score==sheep.size()){midlet.sheepdogCanvasGameOver(time);}}14.创建用于计算场景大小的方法//Ifthescreenisbiggerthanthefield,wecenterthefield//inthescreen.Otherwisewecenterthescreenonthefocus,except//thatwedon'tscrollbeyondtheedgesofthefield.privateintorigin(intfocus,intfieldLength,intscreenLength){intorigin;if(screenLength>=fieldLength){origin=(screenLength-fieldLength)/2;}elseif(focus<=screenLength/2){origin=0;}elseif(focus>=(fieldLength-screenLength/2)){origin=screenLength-fieldLength;}else{origin=screenLength/2-focus;}returnorigin;}15.创建用于计算羊的数目的方法intnumSheepInFold(){intcount=0;for(inti=0;i<sheep.size();++i){Sheepsh=(Sheep)(sheep.elementAt(i));if(field.inFold(sh)){count++;}}returncount;}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息