核心技術(shù):J2ME游戲APIGameCanvas游戲畫(huà)布

字號(hào):

GameCanvas是MIDP2.0的一個(gè)最主要元素,提高了J2ME游戲開(kāi)發(fā)的方便性,相對(duì)于MIDP1.0,降低了J2ME游戲開(kāi)發(fā)的難度跟成本,本文專(zhuān)門(mén)詳述了GameCanvas游戲畫(huà)布的有關(guān)內(nèi)容,對(duì)GameCanvas有個(gè)大概的剖析。
    一、GameCanvas中的主要方法、方法原型跟方法的作用如下總結(jié):
    1、方法GameCanvas,方法原型protected GameCanvas(boolean suppressKeyEvents),作用:構(gòu)造方法,參數(shù) suppressKeyEvents 表示是否需要處理游戲鍵之外的其他按鍵事件。例如數(shù)字鍵,如果此參數(shù)為 false ,那么按鍵事件處理方法keyPressed ,keyRepeated , keyReleased 在程序運(yùn)行過(guò)程中不會(huì)被調(diào)用,這樣可以提高速度和性能。
    2、方法getGraphics,方法原型protected Graphics getGraphics( ),方法作用:得到畫(huà)布中脫機(jī)屏幕上用于作圖的 Graphics 對(duì)象。
    3、方法flushGraphics,方法原型public void flushGraphics( ),方法作用:要求刷新屏幕,這時(shí)脫機(jī)屏幕上的圖像會(huì)被繪制到真實(shí)屏幕上。
    4、方法flushGraphics,方法原型public void flushGraphics(int x, int y, int width, int height),方法作用:要求刷新屏幕上指定區(qū)域,這時(shí)脫機(jī)屏幕上指定區(qū)域的圖像會(huì)被繪制到真實(shí)屏幕上。
    5、方法getKeyStates,方法原型public int getKeyStates( ),方法作用:得到按鍵狀態(tài)。
    二、GameCanvas是為了方便游戲開(kāi)發(fā)的Canvas類(lèi),從類(lèi)的實(shí)現(xiàn)上,可以看出GameCanvas類(lèi)是Canvas類(lèi)的subclass,它繼承了MIDP1.0中在使用的javax.microedition.lcdui.Canvas類(lèi),因此Canvas備置的方法可以直接使用GameCanvas.
    三、GameCanvas的特征,就是支持取得offscreen緩沖和按鍵的狀態(tài)。
    1、所謂offscreen緩沖,是指在畫(huà)面以外的地方描繪,然后將描繪結(jié)果發(fā)送到實(shí)際畫(huà)面的系統(tǒng),因此,有了這個(gè)功能,就可以防止顯示動(dòng)畫(huà)時(shí)的畫(huà)面飄飛現(xiàn)象了。
    2、在以前的MIDP1.0應(yīng)用中,按鍵被按下時(shí),JVM需要調(diào)出keyPressed方法,這樣很容易明白按鍵的狀態(tài)。這種方法被稱(chēng)為event驅(qū)動(dòng),但此方法在按鍵被按下后到方法的執(zhí)行存在時(shí)間滯留現(xiàn)象,很難直接體現(xiàn)游戲中的動(dòng)作,因此GameCanvas可以隨意檢查按鍵狀態(tài)和描繪的更新。Canvas類(lèi),按鍵被按下時(shí)的方法keypressed與再描繪的方法paint通過(guò)JVM的判斷執(zhí)行,因此與游戲狀態(tài)的緊密連接比較難。而GameCanvas類(lèi),開(kāi)發(fā)者可以隨時(shí)查看按鍵的狀態(tài),執(zhí)行再描繪,因此是方便對(duì)游戲狀況進(jìn)行管理的方法。
    四、代碼示例
    1、按鍵狀態(tài)
    // 獲取按鍵狀態(tài)
    int keyStates = getKeyStates();
    // 根據(jù)按鍵狀態(tài)做相應(yīng)處理
    if ((keyStates & LEFT_PRESSED) != 0) {
    // 左鍵按下時(shí)候處理代碼
    } else if ((keyStates & RIGHT_PRESSED) != 0) {
    // 右鍵按下時(shí)候處理代碼
    } else if ((keyStates & UP_PRESSED) != 0) {
    // 向上鍵按下時(shí)候處理代碼
    } else if ((keyStates & DOWN_PRESSED) != 0) {
    // 向下鍵按下時(shí)候處理代碼
    }  
    2、調(diào)用重繪
    // 更新描繪內(nèi)容
    flushGraphics();