J2ME中调用Canvas制作游戏菜单

开发 前端
本文向大家简单介绍一下J2ME中如何使用Canvas制作简单的游戏菜单,我们知道MIDP的图形用户界面分为两类,分别是高级图形用户界面和低级用户界面。

你对J2ME中使用Canvas制作简单的游戏菜单是否熟悉,这里和大家分享一下,我们知道MIDP的图形用户界面分为两类,分别是高级图形用户界面和低级用户界面。一般来讲高级图形用户界面类使用起来比较方便,可移植性强,但是程序员对他的控制能力也很低,因为它们的界面表现是由底层控制的,而不是我们控制的。

J2ME中使用Canvas制作简单的游戏菜单

我们知道MIDP的图形用户界面分为两类,分别是高级图形用户界面和低级用户界面。一般来讲高级图形用户界面类使用起来比较方便,可移植性强,但是程序员对他的控制能力也很低,因为它们的界面表现是由底层控制的,而不是我们控制的。相比高级UI类,低级UI类则使用起来更难一些,但是控制能力更强,可以做出自己需要的界面。

Canvas和Graphics是我们必须熟练使用的两个类,分别代表了画布和画笔(事实上更丰富,姑且这么比喻)。而我们则是画画的人,而指导我们如何下笔的就是Javadoc了,再加上勤奋努力一定可以画出不错的界面。比如tabbed菜单,二级菜单等。这里我们讲述一个简单菜单的制作方式。

在画菜单的时候,需要考虑两面的问题,***是计算相对位置,让菜单能够尽可能适应更多的机型,尽量少使用绝对值。例如画下面的菜单的时候

我们应该计算菜单的每个条目的高度,这些可以有Font的高度算出,当然你可以给条目留一些padding的距离。还应该计算条目的最宽值,毕竟每个条目的字数不一样。这样基本知道了整个菜单占的空间。***还需要计算菜单在屏幕的位置。菜单的绘制如下所示:

Java代码

  1. publicvoidpaint(Graphicsg){  
  2.  
  3. //清除屏幕  
  4.  
  5. intcolor=g.getColor();  
  6.  
  7. g.setColor(0xFFFFFF);  
  8.  
  9. g.fillRect(0,0,getWidth(),getHeight());  
  10.  
  11. g.setColor(color);  
  12.  
  13. //计算整个菜单的高度,宽度和(x,y)  
  14.  
  15. intrectWidth=preferWidth;  
  16.  
  17. intrectHeight=preferHeight*LABELS.length;  
  18.  
  19. intx=(getWidth()-rectWidth)/2;  
  20.  
  21. inty=(getHeight()-rectHeight)/2;  
  22.  
  23. //画矩形  
  24.  
  25. g.drawRect(x,y,rectWidth,rectHeight);  
  26.  
  27. for(inti=1;i<LABELS.length;i++){  
  28.  
  29. g.drawLine(x,y+preferHeight*i,
  30. x+rectWidth,y+preferHeight*i);  
  31.  
  32. }  
  33.  
  34. //画菜单选项,并根据selected的值判断焦点  
  35.  
  36. for(intj=0;j<LABELS.length;j++){  
  37.  
  38. if(selected==j){  
  39.  
  40. g.setColor(0x6699cc);  
  41.  
  42. g.fillRect(x+1,y+j*preferHeight+1,
  43. rectWidth-1,preferHeight-1);  
  44.  
  45. g.setColor(color);  
  46.  
  47. }  
  48.  
  49. g.drawString(LABELS[j],x+8,y+j*preferHeight+4,
  50. Graphics.LEFT|Graphics.TOP);  
  51.  
  52. }  
  53.  
  54. }  
  55.  
  56.  
  57.  

#p#第二个重要的问题是:焦点的切换,在高级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. }  

【编辑推荐】

  1. 深入探究Myeclipse J2ME开发环境配置
  2. 深入了解J2ME Polish+Eclipse配置过程
  3. NetBeans开发J2ME时环境变量配置
  4. Eclipse中进行JVM内存设置
  5. 解析Linux下如何用eclipse搭建J2ME开发环境

 

责任编辑:佚名 来源: dev.10086.cn
相关推荐

2010-09-29 08:57:04

J2ME前景

2010-09-30 13:48:10

J2ME游戏引擎

2010-09-29 13:09:48

OTAJ2ME程序

2009-06-23 11:30:16

RMSJ2ME

2011-12-02 10:37:14

JavaJ2ME

2010-09-30 12:53:00

J2MECSS

2009-06-11 09:19:38

netbeans实例J2ME游戏

2010-09-29 09:19:39

J2ME开发工具

2010-09-29 15:35:04

Item类J2ME

2010-09-30 08:49:17

cookieJ2ME

2010-09-29 15:45:49

J2MEFontColor

2009-06-17 11:27:00

setClip方法J2ME

2009-06-30 15:49:00

J2ME编程

2010-09-29 14:18:36

J2ME SDK

2010-09-29 13:50:31

J2MEJ2SE

2010-09-29 10:58:22

J2MEKVMAPI

2010-09-30 13:28:55

J2ME图形

2009-03-22 09:38:03

Android移植J2ME

2010-09-30 09:56:26

J2ME Polish

2009-06-08 21:34:09

J2EEJ2SEJ2ME
点赞
收藏

51CTO技术栈公众号