程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2ME >> J2ME中調用Canvas制作游戲菜單

J2ME中調用Canvas制作游戲菜單

編輯:J2ME

你對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.  
第二個重要的問題是:焦點的切換,在高級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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved