最近,在網上看到一篇寫個J2ME初學者的文章,覺得不錯! 特拷貝過來,供需要的朋友和自己學習 ,呵呵```
J2ME
開發的一些體會
J2ME
方面開發的資料,確實是少之又少,一般給新手推薦的都是王森先生的《PDA
與手機開發入門》一書,然而該書其實並不適合新人閱讀,該書的前幾章花了很大篇幅來講解命令行調試J2ME
程序的方法和很多要點,其實這些東西,作爲一個初級的J2ME
開發者來說,完全沒有必要學習和掌握,反而只會給自己平添很多負擔。現在做J2ME
開發,大多都有了IDE
(集成開發環境),比如JB
,Eclipse
什麼的,就算是用最簡單的WTK
,也不需要進行path
的配置等操作,所以初學者完全可以跳過這些內容,直接上手。我的認爲,做程序開發,重在實踐經驗,而不是理論研究,因此,新人完全可以直接從J2ME
的程序流程入手,直接進入,而不需要去了解太多基本概念,比如什麼是API
,什麼是MIDP
,什麼是JDK
等等。這些東西我到現在也不是很清楚,但並不影響我進行開發,我是講究實用主義的,因此,本文的基調就在於講述一些實用的開發方法。另外首先要聲明:本文中的一切開發調試都是在WTK
環境下進行的,請讀者注意。
一.
學習J2ME
需要的基礎知識
J2ME
本身是Java
語言的一部分,因此,對Java
語言有一定了解是必要的,而Java
語言本身是面向對象編程的一種語言,因此,對類與對象的概念要有必要的瞭解,而這些內容在本文中就不進行介紹了。另外,本文行文中對API
的介紹很簡略,因此,讀者應該自己多查閱API
中的相關內容。
二.J2ME
開發環境簡介
J2ME
的開發環境如前文所述,目前主要有JB
,Eclipse
,WTK
三種方式,其中前面兩者都是集成開發環境,在編程上比較方便,有智能聯想等功能,而WTK
相對只提供了手動編譯和打包,並且沒有Debug
功能。但WTK
不需要多餘的配置,對各種模擬器可以說是即插即用,而且在WTK
下的程序目錄簡潔明瞭,方便查詢。這幾種開發環境各有長短處,所以大家可以自己選擇,不過對新手來說,還是建議採用WTK
,因爲剛接觸J2ME
開發,與其把時間花在配置上,還不如花在編程上。
三.J2ME
程序流程
我的感覺,每門語言都有自己的固定格式,就跟寫文章的幾要素一樣,總有開頭,結尾等等。而瞭解一門語言的格式,是學習這門語言最先要掌握的內容。
如果把程序流程比做是一個管道工程的話,那麼每門語言裏都有一個管道的入口,在J2ME
裏,這個入口就是MIDlet
類,這個類一般也稱爲J2ME
的主類,每個程序,都有一個或多個固定的主類,在這裏,我們只談一般的情況,即只有一個MIDlet
主類的情況,大家看API
即可知道,MIDlet
類有幾個固定方法,startApp(),pauseApp(),destroyApp()
,這些方法就像是管道工程(以下的講述裏,我都把編程比作是管道工程)中的幾個關鍵閥門,一個J2ME
程序啓動後,便先經歷MIDlet
的構造方法,然後進入startApp()
方法,當有特殊情況掛起的時候,便會進入pauseApp
方法,當程序結束時,便經由destroyApp
方法退出。一個J2ME
程序可以沒有其他類,但不能沒有MIDlet
類,只要有一個完整的主類,便是一個完整的J2ME
程序。比如非常精典的"HelloWorld
",便只有一個MIDlet
。
我覺得,J2ME
實際上是一個很標準的順序流程語言,J2ME
中沒有真正的多線程,很多情況下,一個J2ME
程序的運行,我們都可以對他的流程進行完全的跟蹤。這在調試方面是非常方便的。
在這裏還要解釋一點,J2ME
程序中,屏幕對象是一個比較重要的對象,你的所有操作,你所要表達的意思,都需要在屏幕上描繪出來,因此,對屏幕的操作也是最基本和最重要的一個操作,因此,J2ME
程序的操作其實就是對Display
和Display
上的Displayable
(包括Form
,TextBox
,List
,Canvas
等等)對象進行控制。也就是說,讓程序在合適的時候,把需要的Displayable
顯示在屏幕上。使用的方法,即是Display.setCurrent()
方法。
在屏幕對象的操作上,我要解釋一下,J2ME
默認的屏幕只有一個,即是當前屏幕,所有操作都是對當前屏幕進行操作,因此,當你在主類中將一個Canvas
對象設置爲當前屏幕後,則主類已經處於脫屏狀態,脫屏狀態下的對象無法進行直接操作。這一點需要注意。所有外界的操作均只能作用於當前屏幕上顯示的Displayable
對象,無論是Form
,List
,或者是Canvas
。此時對脫屏類的操作只能通過靜態方法或者是該類的一個實例來進行。
J2ME
的遊戲中最簡單的一種遊戲流程是這樣,即一個主類和一個Canvas
類,主類入口處定義一個Canvas
對象,並且此Canvas
對象繼承一個接口,再定義一個基於此對象的線程,然後將此Canvas
對象設爲當前屏幕對象,並啓動線程,即用線程的start()
方法,啓動線程後,Canvas
裏的run
方法便開始運行,而run
方法通常要用repaint()
方法來刷屏,因此流程就是按paint()->run->paint().....
這樣的過程往復,其中如果還有鍵盤輸入,則keyPressed()
等方法就穿插在中間。基本上J2ME
的程序就是按這樣的流程來走,因此在開發和調試中只要對這個流程進行必要的跟蹤就可以了。
四.J2ME
中常用的類
J2ME
中常用的類有MIDlet
,Form
,List
,Canvas
,String
,Command,Graphics
等等。
其中Graphics
作爲遊戲開發中的核心類,自然需要熟練的掌握。
在Graphics
中如下的重要方法需要掌握:
setColor(int
設置的顏色)
setFont(Font
設置的字體)
drawRect(int
起點座標x,int
起點座標y,int
寬,int
高)
fillRect(int
起點座標x,int
起點座標y,int
寬,int
高)
drawImage(Image
要畫的圖形對象,int
起點座標x,int
起點座標y,int
基點類型)
drawLine(int
起點座標x,int
起點座標y,int
終點座標x,int
終點座標y)
drawString(String
要寫的字符串, int
起點座標x,int
起點座標y,int
基點類型)
在這裏要說明一下什麼是基點類型,基點是標誌你設置的起點座標在整個要繪製的對象(不論是圖像還是文字)中的位置,如左上,右下,正中間等等。
常用的值有0
或20
:左上,17
:正中間,24
:右上,36
:左下,40
:右下。
除此之外,還有幾個重要方法
addCommand,removeComman
d,這兩個方法是對Command的添加和取消的操作,很常用。
而
談到Command,自然就要涉及到commandListener這個接口,按鈕的監聽需要通過這個接口來進行,也就是要重載接口中的
commandAction()方法。不過在使用這個接口的時候,不要忘了對當前的對象設置setCommandListener(this)。
另外,對於String類,substring方法應該掌握
而對於Form這些高級控件,可用方法不多,看看API即可。
五.J2ME
中的線程
J2ME
中的線程是Thread
類,而實現線程有兩種方法,一種是繼承Runnable
接口,一種是Timer
和TimerTask
。而不管是哪種線程,其本質都是在運行其中的run
方法。在這裏要注意,Runnable
接口的run
方法和TimerTask
的run
方法又是不同的,因爲他們的運行機制不同。Runnable
接口是靠線程的休眠或等待來實現線程的刷新,而TimerTask
是按照事先給定的時間間隔來自動刷新。對Runnable
接口,一旦run
方法結束後,則線程就結束了,因此Runnable
線程裏的run
方法要寫成循環方式,一般是while(isRunning)
的形式,要結束的時候把isRunning
設爲false
,而TimerTask
則不用,因爲他是定時刷新。但這樣也有個問題,就是如果TimerTask
的run
方法寫得過長,執行時間超過了設置的線程間隔時間,就會出現線程重疊的情況。線程重疊會造成諸如遊戲速度突然加快等Bug
。
在Runnable
接口定義的線程裏,有兩種等待方法,一種是wait
,一種是sleep
,如果使用wait
方法,則要注意在線程run
方法裏,用synchonized
標誌符將該線程設置爲同步鎖定狀態,否則會出現java.lang.IllegalMonitorStateException
異常,大致意思是線程當前請求的監視器對象不能響應,因爲被別的線程佔用了。
線程在J2ME
裏非常重要,一切動態效果(當然這是遊戲的前提)都是通過線程來操作,因此,對線程的控制是值得研究的一個問題。如何優化代碼,使線程能夠在足夠短的間隔時間內正常刷新,換言之,這就是大家討論的FPS
問題。程序優化做得好,則線程間隔時間可以足夠短,使得FPS
可以足夠高,遊戲的流暢度當然就越高。
六.J2ME
開發中的好習慣
1.
多寫註釋,完備的註釋不管是對你自己,還是對別人,都是很有好處的,在調試中也會起很大的幫助。
2.
在重要流程的各個環節設置一些監聽點,其實很簡單,就是用symstem.out.println()
來輸出一些標誌符號就可以了,這樣可以監聽你的程序在運行的時候,走到哪一步。
3.
不要寫太多的類,儘量整合資源,不用的變量或者方法,儘量去掉。
4.
熟練掌握各種常見的異常,不要太依賴於問別人和翻書,這些應該是一個合格的程序員應該熟練於心的東西。
5.
對不熟悉的類,應該多寫小代碼來實驗其用法,別人講的永遠不如自己研究出來的結果牢靠。