小例子學J2ME手機遊戲開發--(一)初具手機遊戲框架的HelloWorld

小例子學J2ME手機遊戲開發----(-)初具手機遊戲框架的HelloWorld

原創 58prince http://blog.csdn.net/prince58 轉載請註明出處,謝謝。

 

一、安裝

JDK1.6

WTK2.5.2

Eclipse3.4

ecpliseMe : http://eclipseme.org/updates

 

 

JDKWTK的安裝沒什麼特別的,一路NEXT下去就行了。Eclipse下載完後解壓出來即可以使用,打開Eclipse->help->software updates…即可彈出如上圖所示的對話框,新建一個eclipseMesite(http://eclipseme.org/updates),選擇install就可以在線安裝eclipseMe.安裝上還有問題的可以查看一下網站的幫助,本教程主要講解J2ME遊戲方面的,其他方面就略過了。

 二、CanvasGraphics

MIDP的圖形用戶界面分爲兩類,分別是高級圖形用戶界面和低級用戶界面。高級圖形用戶界面使用起來更方便,卻有失靈活性,無法自定義樣式,難以達到預期的效果,所以一般手機遊戲都是使用低級用戶界面來處理界面上的東西,以達到更豐富更個性的界面效果。

CanvasGraphics是我們必須熟練使用的兩個類,分別代表了畫布和畫筆。Canvas 繼承自javax.microedition.lcdui.Displayable,實現屏幕上畫東西的功能,當然Canvas還提供了一些按鍵和觸摸的監聽事件。我們只需要重載Paint方法,就可以在Canvas上進行繪製了。

Graphics類通過不同的圖形操作方法實現在Canvas 上畫東西,常用的就是這麼幾項:

繪製圖形基元(如矩形、直線等)

繪製文本

繪製圖像

 

當然,低級界面中也有一些問題,所以有些時候我們需要低級界面和高級界面結合起來用,比如用高級控件來給用戶輸入信息(網遊中常常要用到,如聊天功能)。但是不能把高級界面和低級界面放在同一個Displayable中,而越多的Displayable意味着越多的內存,所以儘可能讓所有的事情都在低級界面中完成。

 

三、從HelloWorld開始

和慣例一樣從HelloWorld開始,這個程序很簡單,用低級界面實現在屏幕上顯示"Hello World!"的字符串。按J2ME的規範,程序將從繼承自javax.microedition.midlet.MIDlet類的子類開始運,現在先來看MIDlet類的代碼如下:

import javax.microedition.midlet. MIDlet;

public class cMidlet extends MIDlet {

                static cMidlet s_midletInstance;// 聲明一個cMidlet的靜態變量,方便在canvas內中對其進行引用。

                static cGame s_cGameInstance = null;// 聲明一個可視類的對象,cGame是繼承自javax.microedition.lcdui.Canvas類的子類,負責程序的顯示和邏輯,在後面會做詳細的介紹。

                public cMidlet()

                {

                                s_midletInstance = this;// 在構造方法中將類的實例對象付給靜態變量s_midletInstance

                }

// startApp()是對應父類中定義的抽象方法的實現,程序運行時此方法將被調用。

                protected void startApp() {

                               

                                if (s_cGameInstance == null)

                                {

                                                s_cGameInstance = new cGame();

                                }

                               

                }

//對應父類中定義的抽象方法的實現。MIDlet進入暫停時此方法將被調用。 

                protected void pauseApp() {

                               

                }

//對應父類中定義的抽象方法的實現。程序結束時此方法將被調用。

                protected void destroyApp(boolean arg0) {

                                notifyDestroyed();

                }

 

}

Canvas類的代碼如下:

import javax.microedition.lcdui.Canvas;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.Graphics;

 

public class cGame extends Canvas {

 

                static cGame s_game;

               

                public cGame(){

                       Display.getDisplay(cMidlet.s_midletInstance).setCurrent(this);//將當前的displayable對象cGame設置爲當前可視類對象。很多時候這一步也可以在MIDlet類中的startApp內完成。

                                setFullScreenMode(true);//設置全屏模式

                }

                protected void paint(Graphics g) {

                                g.setColor(0x009900);

                                g.fillRect(0, 0, 240, 320);

                                g.setColor(0x000000);

                                g.drawString("Hello World!", 10, 20, Graphics.LEFT|Graphics.TOP);//相關參數和功能大家自行參看WTK的幫助文檔

                }

 

}

運行效果:

 

四、實現Runnable接口

也許你會覺得上邊這個例字相當的簡單,貌似也沒什麼用處,不過我們稍微修改一下便能成爲一個手機遊戲框架的雛形。對於遊戲來說,是由驅動的,即每隔一段時間將重繪一次畫面,而目前的示例代碼只在程序一開始系統調用一次paint,此後將不再調用,所以,我們要實現Runnable接口,控制遊戲的幀刷新。

根據人的視覺能力,一般來說,一秒鐘內運行25幀左右,人能看到的動畫是連慣的。而實際中由於實到手機硬件的限制,有時遊戲能以15幀每秒左右的速度運行,也能達到不錯的運行效果。

Runnable接口的聲明如下:

package java.lang;

public abstract interface Runnable {

  // Methods

  void run();

}

我們在cGame類添上implements Runnable,讓它實現Runnable接口。同時需要實現run方法,paint()是很耗費資源的,不能時時刻刻都在paint,所以爲了使遊戲平穩的運行,需要對幀對行控制,下面代碼中的while (System.currentTimeMillis() - s_lastFrameTimer<50)這個地方就是控制幀速的,1000毫秒/20 = 50毫秒,大約控制在20幀每秒的速度,每次畫完paint()都做一些間隔再畫。

public class cGame extends Canvas implements Runnable{

 

                static cGame s_game;

                static int s_paintCount;

                static long s_lastFrameTimer;

               

                public cGame(){

                                Display.getDisplay(cMidlet.s_midletInstance).setCurrent(this);

                                setFullScreenMode(true);

                                new Thread(this).start();

                }

               

                public void run() {

                                while (cMidlet.s_midletInstance!=null)

                                {

                                                repaint();

                                                while (System.currentTimeMillis() - s_lastFrameTimer<50)

                                                {

                                                                Thread.yield();

                                                }

                                                s_lastFrameTimer = System.currentTimeMillis();

                                }

                }

               

                protected void paint(Graphics g) {

                                g.setColor(0x009900);

                                g.fillRect(0, 0, 240, 320);

                                g.setColor(0x000000);

                                g.drawString("Hello World!", 10, 20, Graphics.LEFT|Graphics.TOP);

                                g.drawString("paint count: "+ (s_paintCount++), 10, 40, Graphics.LEFT|Graphics.TOP);

                }

 

}

運行效果如下圖,和上一個例子相近,只是paint count 會不停的累加。

 

到此我們已經這完成了一個簡單的J2ME手機遊戲的框架,下邊的教程會在此基礎上進一步的完善。

完整代碼下載:

http://www.xun6.com/file/17bb59997/HelloWorld.rar.html

調試以上代碼很簡單,自己新建一個J2ME的項目,把下載包裏src目錄下的代碼COPY到你的J2ME項目的src目錄即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章