问题描述
看了一下这个代码有的地方看不明白哪位大侠给注释一下就是在每个函数写上是干什么的我来回的看逻辑混乱了--这只是一个菜单类midlet没发~还有如果要把菜单加上logo和背景图片怎么弄?importjava.util.Vector;importjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.Font;importjavax.microedition.lcdui.Graphics;publicclassMenuCanvasextendsCanvas{privatefinalintLOGO=0;privatefinalintMENU=1;privatefinalintGAME=2;privatefinalintINFO=3;privatefinalintHELP=4;privatefinalintEXIT=5;//常量表示各个状态privateintzt;//状态变量privateintwidth,height;//屏幕宽和高privateFontft;//字体privateStringsmenu[]={"开始游戏","制作人员","游戏说明","退出游戏"};//菜单文字privateStringsinfo="作者:XXXn"+"";//介绍文字privateStringinfo[];//保存介绍文字privateStringshelp="2,8,4,9控制上,下,左,右,确定/5键确定";//帮助文字privateStringhelp[];//保存帮助文字privateintn,m;publicMenuCanvas(){width=getWidth();height=getHeight();ft=Font.getFont(Font.FACE_SYSTEM,Font.STYLE_BOLD,Font.SIZE_LARGE);switchZ(MENU);}publicvoidswitchZ(intzt){//改变状态时要做的事switch(zt){caseLOGO://我这里就不做LOGO了.break;caseMENU:break;caseGAME://游戏等菜单做完了再教你做游戏,一步步来break;caseINFO:info=format(sinfo,width,ft);break;caseHELP:help=format(shelp,width,ft);break;caseEXIT:m=0;break;}this.zt=zt;}protectedvoidpaint(Graphicsg){g.setClip(0,0,width,height);g.setColor(0x000000);g.fillRect(0,0,width,height);switch(zt){caseLOGO:break;caseMENU:drawmenu(g);break;caseINFO:drawinfo(g);break;caseHELP:drawhelp(g);break;caseEXIT:drawexit(g);break;}}privatevoiddrawexit(Graphicsg){g.setColor(0x00ff00);g.setFont(ft);g.drawString("你要退出吗",width/2,height/2-50,Graphics.HCENTER|Graphics.TOP);if(m==1){g.setColor(0xff0000);}else{g.setColor(0xffffff);}g.drawString("是",35,height-50,20);if(m==0){g.setColor(0xff0000);}else{g.setColor(0xffffff);}g.drawString("否",width-35,height-50,24);}privatevoiddrawhelp(Graphicsg){g.setColor(0xffffff);g.setFont(ft);for(inti=0;i<help.length;i++){g.drawString(help[i],0,i*ft.getHeight(),20);}}privatevoiddrawinfo(Graphicsg){g.setColor(0xffffff);g.setFont(ft);for(inti=0;i<info.length;i++){g.drawString(info[i],0,i*ft.getHeight(),20);}}publicvoiddrawmenu(Graphicsg){g.setColor(0x0000ff);g.setFont(ft);for(inti=0;i<smenu.length;i++){g.drawString(smenu[i],width/2,height/2+i*ft.getHeight()-50,Graphics.HCENTER|Graphics.TOP);}g.setColor(0xff0000);g.drawRect(width/2-50,height/2+n*ft.getHeight()-50,100,ft.getHeight());}publicString[]format(Stringtext,intmaxWidth,Fontft){//字符串切割,实现字符串自动换行String[]result=null;VectortempR=newVector();intlines=0;intlen=text.length();intindex0=0;intindex1=0;booleanwrap;while(true){intwidthes=0;wrap=false;for(index0=index1;index1<len;index1++){if(text.charAt(index1)=='n'){index1++;wrap=true;break;}widthes=ft.charWidth(text.charAt(index1))+widthes;if(widthes>maxWidth){break;}}lines++;if(wrap){tempR.addElement(text.substring(index0,index1-1));}else{tempR.addElement(text.substring(index0,index1));}if(index1>=len){break;}}result=newString[lines];tempR.copyInto(result);returnresult;}protectedvoidkeyPressed(intarg0){repaint();switch(this.getGameAction(arg0)){caseFIRE:switch(zt){caseMENU:switch(n){case0:System.out.println("游戏没写");break;case1:switchZ(INFO);break;case2:switchZ(HELP);break;case3:switchZ(EXIT);break;}break;caseINFO:switchZ(MENU);break;caseHELP:switchZ(MENU);break;caseEXIT:switch(m){case0:switchZ(MENU);break;case1:MenuMIDlet.inc.notifyDestroyed();break;}}break;caseUP:switch(zt){caseMENU:n--;if(n<0){//循环选择移动n=3;}break;}break;caseDOWN:switch(zt){caseMENU:n++;if(n>3){//循环选择n=0;}break;}break;caseLEFT:switch(zt){caseEXIT:m++;if(m>1){m=0;}break;}break;caseRIGHT:switch(zt){caseEXIT:m--;if(m<0){m=1;}break;}break;}}}
解决方案
解决方案二:
不是通用的控件
解决方案三:
楼上意思是?难到一般的java游戏不是这种模版吗?我好不容易找到的……谁有j2me游戏菜单模版分享一下谢谢
解决方案四:
从方法名就能看出它的功能呀,不是很复杂的
解决方案五:
找个通用控件吧。。
解决方案六:
楼上。。。。。。。什么是通用控件
解决方案七:
背景就是在绘制画布的时候加个图片就可以了先申明privateImagebackground;在构造函数中装载图片try{background=Image.createImage("/test.jpg");}catch(IOExceptione){System.err.println("Failedloadingimages!");}绘制过程中绘制出来publicvoidpaint(Graphicsg){g.drawImage(background,0,0,Graphics.TOP|Graphics.LEFT);背景就是任意图片,也可以而绘制各种单色。。看自己想象了吧至于LOGO没给MIDLET我也不知道加载哪了-。-貌似也可以像绘制背景一样绘制出来
解决方案八:
不是特别的尽量别用jpg格式图片它的色深有点浪费资源
解决方案九:
该回复于2010-08-31 17:32:14被版主删除
解决方案十:
该回复于2010-09-01 17:20:17被版主删除
解决方案十一:
啊~~~~~~~仰慕
解决方案十二:
这个代码麻烦,不通用,,只能算上一般。
解决方案十三:
他就是用了一个状态机么通过keypress调用switchZ改变状态然后再贴图的时候根据状态贴出不同的界面来
解决方案十四:
这是个MIDlet入口类的下一个类,你这个类里面包含了LOGO,MENU等等,不推荐这样写,把所有的功能都在一个这一个类里面会使这个类很累,负担重。实现LOGO:publicclassLogo{publicImageLogo[];publicImageisplay;publicSoundS;publicintstate=0;publicfinalintLogo_logo=0;publicfinalintLogo_isplay=1;publicfinalintLogo_end=2;publicintLogo_loop,Logo_time;publicLogo(){//Logo的构造函数S=newSound();Logo=newImage[3];try{for(inti=0;i<Logo.length;i++){Logo[i]=Image.createImage("/LOGO/"+i+".png");}isplay=Image.createImage("/LOGO/isplay.png");}catch(Exceptione){System.out.println("图片载LOGO类中加载错误");e.printStackTrace();}}publicvoidkeyPressed(intk){//处理Logo类的按键事件的方法switch(state){caseLogo_logo:break;caseLogo_isplay:if(k==-6){BM_S.Play("menu",true);BM_S.SetVolume(50);state=Logo_end;}elseif(k==-7){state=Logo_end;}break;}}publicvoidpaint(Graphicsg){//Logo类的绘画事件的方法switch(state){caseLogo_logo:g.setColor(255,255,255);g.fillRect(0,0,240,320);g.drawImage(Logo[Logo_loop],BoomMan_Date.WIDTH>>1,BoomMan_Date.HIGTH>>1,Graphics.HCENTER|Graphics.VCENTER);break;caseLogo_isplay:g.drawImage(isplay,0,0,0);break;}}publicvoidlogic(){//Logo类的逻辑事件的方法switch(state){caseLogo_logo:Logo_time++;if(Logo_time==1000/30){Logo_loop++;Logo_time=0;if(Logo_loop>2){state=Logo_isplay;}}break;}}}———————————————————————————————————————————————其实我个人认为把LOGO,MENU,GAME,HERO,NPC,MAP以及其他能用到的类都分开写为最好!
解决方案十五:
其他方案:
13L正解
其他方案:
同意13L的看法,但是一般写游戏的时候都是把主菜单以及LOGO的方法写在框架里的,没必要另外在写个类出来。游戏中的菜单在GAME类中写或者在框架中写都是可以的,方法可以互相调用。