J2ME中調(diào)用Canvas制作游戲菜單
你對(duì)J2ME中使用Canvas制作簡(jiǎn)單的游戲菜單是否熟悉,這里和大家分享一下,我們知道MIDP的圖形用戶界面分為兩類,分別是高級(jí)圖形用戶界面和低級(jí)用戶界面。一般來(lái)講高級(jí)圖形用戶界面類使用起來(lái)比較方便,可移植性強(qiáng),但是程序員對(duì)他的控制能力也很低,因?yàn)樗鼈兊慕缑姹憩F(xiàn)是由底層控制的,而不是我們控制的。
J2ME中使用Canvas制作簡(jiǎn)單的游戲菜單
我們知道MIDP的圖形用戶界面分為兩類,分別是高級(jí)圖形用戶界面和低級(jí)用戶界面。一般來(lái)講高級(jí)圖形用戶界面類使用起來(lái)比較方便,可移植性強(qiáng),但是程序員對(duì)他的控制能力也很低,因?yàn)樗鼈兊慕缑姹憩F(xiàn)是由底層控制的,而不是我們控制的。相比高級(jí)UI類,低級(jí)UI類則使用起來(lái)更難一些,但是控制能力更強(qiáng),可以做出自己需要的界面。
Canvas和Graphics是我們必須熟練使用的兩個(gè)類,分別代表了畫布和畫筆(事實(shí)上更豐富,姑且這么比喻)。而我們則是畫畫的人,而指導(dǎo)我們?nèi)绾蜗鹿P的就是Javadoc了,再加上勤奮努力一定可以畫出不錯(cuò)的界面。比如tabbed菜單,二級(jí)菜單等。這里我們講述一個(gè)簡(jiǎn)單菜單的制作方式。
在畫菜單的時(shí)候,需要考慮兩面的問(wèn)題,***是計(jì)算相對(duì)位置,讓菜單能夠盡可能適應(yīng)更多的機(jī)型,盡量少使用絕對(duì)值。例如畫下面的菜單的時(shí)候
我們應(yīng)該計(jì)算菜單的每個(gè)條目的高度,這些可以有Font的高度算出,當(dāng)然你可以給條目留一些padding的距離。還應(yīng)該計(jì)算條目的最寬值,畢竟每個(gè)條目的字?jǐn)?shù)不一樣。這樣基本知道了整個(gè)菜單占的空間。***還需要計(jì)算菜單在屏幕的位置。菜單的繪制如下所示:
Java代碼
- publicvoidpaint(Graphicsg){
- //清除屏幕
- intcolor=g.getColor();
- g.setColor(0xFFFFFF);
- g.fillRect(0,0,getWidth(),getHeight());
- g.setColor(color);
- //計(jì)算整個(gè)菜單的高度,寬度和(x,y)
- intrectWidth=preferWidth;
- intrectHeight=preferHeight*LABELS.length;
- intx=(getWidth()-rectWidth)/2;
- inty=(getHeight()-rectHeight)/2;
- //畫矩形
- g.drawRect(x,y,rectWidth,rectHeight);
- for(inti=1;i<LABELS.length;i++){
- g.drawLine(x,y+preferHeight*i,
- x+rectWidth,y+preferHeight*i);
- }
- //畫菜單選項(xiàng),并根據(jù)selected的值判斷焦點(diǎn)
- for(intj=0;j<LABELS.length;j++){
- if(selected==j){
- g.setColor(0x6699cc);
- g.fillRect(x+1,y+j*preferHeight+1,
- rectWidth-1,preferHeight-1);
- g.setColor(color);
- }
- g.drawString(LABELS[j],x+8,y+j*preferHeight+4,
- Graphics.LEFT|Graphics.TOP);
- }
- }
#p#第二個(gè)重要的問(wèn)題是:焦點(diǎn)的切換,在高級(jí)UI類中,這是不需要我們處理的。但是使用Canvas制作菜單需要自己來(lái)處理焦點(diǎn)的移動(dòng),這里我們定義一個(gè)int類型變量selected,來(lái)記錄焦點(diǎn)所在的菜單條目位置,也就是選擇的索引。當(dāng)用戶按鍵的時(shí)候,我們?cè)趉eyPressed()方法中判斷用戶的移動(dòng)方向,對(duì)selected進(jìn)行相關(guān)的加減運(yùn)算,然后repaint()整個(gè)屏幕即可。
Java代碼
- publicvoidkeyPressed(intkeyCode){
- //根據(jù)用戶輸入更新selected的值,并重新繪制屏幕
- intaction=this.getGameAction(keyCode);
- switch(action){
- caseCanvas.FIRE:
- printLabel(selected);
- break;
- caseCanvas.DOWN:
- selected=(selected+1)%4;
- break;
- caseCanvas.UP:{
- if(--selected<0){
- selected+=4;
- }
- break;
- }
- default:
- break;
- }
- repaint();
- serviceRepaints();
- }
這樣我們就制作出了一個(gè)基本的菜單,你還可以發(fā)揮想象給被選中的菜單增加動(dòng)畫效果。MenuCanvas的代碼如下所示:
Java代碼
- packagecom.j2medev.chapter3;
- importjavax.microedition.lcdui.*;
- publicclassMenuCanvasextendsCanvas{
- //selected變量標(biāo)記了焦點(diǎn)位置
- privateintselected=0;
- privateintpreferWidth=-1;
- privateintpreferHeight=-1;
- publicstaticfinalint[]OPTIONS={0,1,2,3};
- publicstaticfinalString[]LABELS={"NewGame",
- "Setttings","HighScores","Exit"};
- publicMenuCanvas(){
- selected=OPTIONS[0];
- //計(jì)算菜單選項(xiàng)的長(zhǎng)度和高度值
- FontFontf=Font.getDefaultFont();
- for(inti=0;i<LABELS.length;i++){
- inttemp=f.stringWidth(LABELS[i]);
- if(temp>preferWidth){
- preferWidth=temp;
- }
- }
- preferWidthpreferWidth=preferWidth+2*8;
- preferHeight=f.getHeight()+2*4;
- }
- publicvoidpaint(Graphicsg){
- //清除屏幕
- intcolor=g.getColor();
- g.setColor(0xFFFFFF);
- g.fillRect(0,0,getWidth(),getHeight());
- g.setColor(color);
- //計(jì)算整個(gè)菜單的高度,寬度和(x,y)
- intrectWidth=preferWidth;
- intrectHeight=preferHeight*LABELS.length;
- intx=(getWidth()-rectWidth)/2;
- inty=(getHeight()-rectHeight)/2;
- //畫矩形
- g.drawRect(x,y,rectWidth,rectHeight);
- for(inti=1;i<LABELS.length;i++){
- g.drawLine(x,y+preferHeight*i,
- x+rectWidth,y+preferHeight*i);
- }
- //畫菜單選項(xiàng),并根據(jù)selected的值判斷焦點(diǎn)
- for(intj=0;j<LABELS.length;j++){
- if(selected==j){
- g.setColor(0x6699cc);
- g.fillRect(x+1,y+j*preferHeight+1,
- rectWidth-1,preferHeight-1);
- g.setColor(color);
- }
- g.drawString(LABELS[j],x+8,y+j*preferHeight+4,
- Graphics.LEFT|Graphics.TOP);
- }
- }
- publicvoidkeyPressed(intkeyCode){
- //根據(jù)用戶輸入更新selected的值,并重新繪制屏幕
- intaction=this.getGameAction(keyCode);
- switch(action){
- caseCanvas.FIRE:
- printLabel(selected);
- break;
- caseCanvas.DOWN:
- selected=(selected+1)%4;
- break;
- caseCanvas.UP:{
- if(--selected<0){
- selected+=4;
- }
- break;
- }
- default:
- break;
- }
- repaint();
- serviceRepaints();
- }
- //showNotify()在paint()之前被調(diào)用
- publicvoidshowNotify(){
- System.out.println("showNotify()iscalled");
- }
- privatevoidprintLabel(intselected){
- System.out.println(LABELS[selected]);
- }
- }
【編輯推薦】
- 深入探究Myeclipse J2ME開(kāi)發(fā)環(huán)境配置
- 深入了解J2ME Polish+Eclipse配置過(guò)程
- NetBeans開(kāi)發(fā)J2ME時(shí)環(huán)境變量配置
- Eclipse中進(jìn)行JVM內(nèi)存設(shè)置
- 解析Linux下如何用eclipse搭建J2ME開(kāi)發(fā)環(huán)境

















