龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

J2ME中调用Canvas制作游戏菜单(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
第二个重要的问题是:焦点的切换,在高级UI类中,这是不需要我们处理的。但是使用Canvas制作菜单需要自己来处理焦点的移动,这里我们定义一个int类型
第二个重要的问题是:焦点的切换,在高级UI类中,这是不需要我们处理的。但是使用Canvas制作菜单需要自己来处理焦点的移动,这里我们定义一个int类型变量selected,来记录焦点所在的菜单条目位置,也就是选择的索引。当用户按键的时候,我们在keyPressed()方法中判断用户的移动方向,对selected进行相关的加减运算,然后repaint()整个屏幕即可。

Java代码

  1. publicvoidkeyPressed(intkeyCode){  
  2.  
  3. //根据用户输入更新selected的值,并重新绘制屏幕  
  4.  
  5. intaction=this.getGameAction(keyCode);  
  6.  
  7. switch(action){  
  8.  
  9. caseCanvas.FIRE:  
  10.  
  11. printLabel(selected);  
  12.  
  13. break;  
  14.  
  15. caseCanvas.DOWN:  
  16.  
  17. selected=(selected+1)%4;  
  18.  
  19. break;  
  20.  
  21. caseCanvas.UP:{  
  22.  
  23. if(--selected<0){  
  24.  
  25. selected+=4;  
  26.  
  27. }  
  28.  
  29. break;  
  30.  
  31. }  
  32.  
  33. default:  
  34.  
  35. break;  
  36.  
  37. }  
  38.  
  39. repaint();  
  40.  
  41. serviceRepaints();  
  42.  
  43. }  
  44.  
  45.  
  46.  

这样我们就制作出了一个基本的菜单,你还可以发挥想象给被选中的菜单增加动画效果。MenuCanvas的代码如下所示:

Java代码

  1. packagecom.j2medev.chapter3;  
  2.  
  3. importjavax.microedition.lcdui.*;  
  4.  
  5. publicclassMenuCanvasextendsCanvas{  
  6.  
  7. //selected变量标记了焦点位置  
  8.  
  9. privateintselected=0;  
  10.  
  11. privateintpreferWidth=-1;  
  12.  
  13. privateintpreferHeight=-1;  
  14.  
  15. publicstaticfinalint[]OPTIONS={0,1,2,3};  
  16.  
  17. publicstaticfinalString[]LABELS={"NewGame",
  18. "Setttings","HighScores","Exit"};  
  19.  
  20. publicMenuCanvas(){  
  21.  
  22. selected=OPTIONS[0];  
  23.  
  24. //计算菜单选项的长度和高度值  
  25.  
  26. FontFontf=Font.getDefaultFont();  
  27.  
  28. for(inti=0;i<LABELS.length;i++){  
  29.  
  30. inttemp=f.stringWidth(LABELS[i]);  
  31.  
  32. if(temp>preferWidth){  
  33.  
  34. preferWidth=temp;  
  35.  
  36. }  
  37.  
  38. }  
  39.  
  40. preferWidthpreferWidth=preferWidth+2*8;  
  41.  
  42. preferHeight=f.getHeight()+2*4;  
  43.  
  44. }  
  45.  
  46. publicvoidpaint(Graphicsg){  
  47.  
  48. //清除屏幕  
  49.  
  50. intcolor=g.getColor();  
  51.  
  52. g.setColor(0xFFFFFF);  
  53.  
  54. g.fillRect(0,0,getWidth(),getHeight());  
  55.  
  56. g.setColor(color);  
  57.  
  58. //计算整个菜单的高度,宽度和(x,y)  
  59.  
  60. intrectWidth=preferWidth;  
  61.  
  62. intrectHeight=preferHeight*LABELS.length;  
  63.  
  64. intx=(getWidth()-rectWidth)/2;  
  65.  
  66. inty=(getHeight()-rectHeight)/2;  
  67.  
  68. //画矩形  
  69.  
  70. g.drawRect(x,y,rectWidth,rectHeight);  
  71.  
  72. for(inti=1;i<LABELS.length;i++){  
  73.  
  74. g.drawLine(x,y+preferHeight*i,
  75. x+rectWidth,y+preferHeight*i);  
  76.  
  77. }  
  78.  
  79. //画菜单选项,并根据selected的值判断焦点  
  80.  
  81. for(intj=0;j<LABELS.length;j++){  
  82.  
  83. if(selected==j){  
  84.  
  85. g.setColor(0x6699cc);  
  86.  
  87. g.fillRect(x+1,y+j*preferHeight+1,
  88. rectWidth-1,preferHeight-1);  
  89.  
  90. g.setColor(color);  
  91.  
  92. }  
  93.  
  94. g.drawString(LABELS[j],x+8,y+j*preferHeight+4,
  95. Graphics.LEFT|Graphics.TOP);  
  96.  
  97. }  
  98.  
  99. }  
  100.  
  101. publicvoidkeyPressed(intkeyCode){  
  102.  
  103. //根据用户输入更新selected的值,并重新绘制屏幕  
  104.  
  105. intaction=this.getGameAction(keyCode);  
  106.  
  107. switch(action){  
  108.  
  109. caseCanvas.FIRE:  
  110.  
  111. printLabel(selected);  
  112.  
  113. break;  
  114.  
  115. caseCanvas.DOWN:  
  116.  
  117. selected=(selected+1)%4;  
  118.  
  119. break;  
  120.  
  121. caseCanvas.UP:{  
  122.  
  123. if(--selected<0){  
  124.  
  125. selected+=4;  
  126.  
  127. }  
  128.  
  129. break;  
  130.  
  131. }  
  132.  
  133. default:  
  134.  
  135. break;  
  136.  
  137. }  
  138.  
  139. repaint();  
  140.  
  141. serviceRepaints();  
  142.  
  143. }  
  144.  
  145. //showNotify()在paint()之前被调用  
  146.  
  147. publicvoidshowNotify(){  
  148.  
  149. System.out.println("showNotify()iscalled");  
  150.  
  151. }  
  152.  
  153. privatevoidprintLabel(intselected){  
  154.  
  155. System.out.println(LABELS[selected]);  
  156.  
  157. }  
  158.  
  159. }  

精彩图集

赞助商链接