原文見: http://today.java.net/pub/a/today/2005/07/07/j2me3.html?page=3
定義游戲的角色和特征
一個只能將圖片左右移動的游戲是沒有意思的。我們現在要對清單1的代碼作一些改動,讓它變得更有趣些。首先我們要定義游戲顯示的邊界,這樣能保證在所有設備上的大小一致,先定義一些常量,如下代碼所示:
(注意,我們這里引入了一個游戲特征:couple小精靈很快就可以在屏幕上跳動了)
在游戲屏幕上定義的這些常量規定了游戲的邊界,如圖2所示。
圖 2. 用常量定義游戲邊界
當然,我們現在需要修改代碼來使用這些常量。在清單1的代碼中添加一個buildGameScreen(Graphics g)方法,如下代碼所示:
再在updateGameScreen()方法里繪制couple之前添加一個該方法的調用,還要將couple小精靈的開始位置由CENTER_Y改為BASE(在start()方法里設置coupleY = BASE)。
couple小精靈可以左右移動,我們要限制它走出邊界,更改calculateCoupleX()方法里左右移動的代碼,避免坐標超出邊界。修改后的代碼如下:
方法使用Math.max()和min()函數使圖片顯示在游戲邊界內。注意我們在計算中還考慮了圖片的大小。
我們剛才說過要實現couple小精靈在屏幕上跳躍的功能,我們現在增加一個方法使圖片在Y軸上移動,跳躍時移動的具體路徑將不受玩家影響。
在清單1的代碼中添加三個新的實例變量:up、jumpHeight 和random。如下所示:
jumpHeight初始值被設為MAX_HEIGHT。jumpHeight變量會在couple小精靈每次跳躍時動態設為隨機值,新增的calculateCoupleY()方法如下:
你可能已經發覺,這個方法不依賴于用戶的按鍵,傳入的keyState信息也沒有用到。傳入這個值是為了與calculateCoupleX()方法保持一致。方法剛開始時通過漸增coupleY變量值使couple小精靈上升,直到達到這次的跳躍高度(剛開始是MAX_HEIGHT)。達到這個高度后,小精靈開始往下降,降到BASE后又隨機生成一個介于MAX_HEIGHT和圖像高度之間的數值,按這個高度開始下一次跳躍。
游戲的整個效果是一個以隨機高度跳躍的couple小精靈,它可以在用戶的操縱下左右移動。圖3是游戲的一個截屏:
圖 3. 游戲截屏
承接第一部分,介紹小游戲的具體實現,實現第一個版本,并介紹GameCanvas類的使用及運行機制。
原文見:http://www.aygfsteel.com/Andyluo/archive/2005/12/08/23003.html
圖中有14個著名的開源項目,你都能看出來嗎?(答案附文后)
答案:
原文見:http://today.java.net/pub/a/today/2005/07/07/j2me3.html?page=2
構建一個J2ME游戲:從GameCanvas類開始
GameCanvas類繼承自Canvas,提供了一個屏幕后端的緩沖區,所有的繪制操作都先在這個緩沖區里進行。當所有繪制操作完成后,我們調用flushGraphics()方法將緩沖區內容輸出到屏幕。這種雙緩沖機制可以使圖像的移動更加平滑,避免圖像的閃爍。緩沖區大小等于屏幕的大小,而且每一個GameCanvas實例有且僅有一個緩沖區。
GameCanvas類提供一種存儲按鍵狀態的機制,我們可以通過它方便的了解用戶與游戲的交互。這種機制可以跟蹤用戶按特殊鍵的次數,調用getKeyStates()方法返回所有游戲鍵按鍵狀態的二進制表示,1代表上次調用方法后按過該鍵,0表示上次調用后還沒有按過該鍵。我們可以跟蹤的游戲狀態有(這里的鍵都是在Canvas類里定義的):DOWN_PRESSED, UP_PRESSED, RIGHT_PRESSED, LEFT_PRESSED, FIRE_PRESSED, GAME_A_PRESSED, GAME_B_PRESSED, GAME_C_PRESSED和GAME_D_PRESSED。
首先擴展GameCanvas類,定制一個游戲畫布,代碼見清單1。清單2是運行例子的MIDlet。
清單 1. MyGameCanvas:游戲畫布的第一個版本
清單 2 是使用這個游戲畫布的MIDlet:
清單 2. 運行游戲示例的MIDlet類
使用Wireless工具建立一個工程,導入這兩個類,然后生成并運行工程。確保你的工程目錄res中有這個圖片文件,并保證名稱為couple.gif, 圖1是運行結果。
圖1. 構建一個游戲:使用GameCanvas類
使用設備的方向鍵可以左右移動屏幕中的小圖像,這是通過從checkUserInput()里取得按鍵狀態,然后調用calculateCoupleX(),通過將按鍵狀態與GameCanvas里預定義的按鍵值進行與操作(&),得到用戶當前按的鍵,然后將實例變量更新,最終反映到設備屏幕上。
圖像是在updateGameScreen()方法里被繪制到屏幕上的。這個方法使用傳入的Graphics對象進行繪制,每一個GameCanvas只有一個Graphics對象。方法首先擦除上次繪制的圖像,然后基于當前的coupleX值(還有一直不變的coupleY值)繪制couple.gif圖像,最后將緩沖區的數據輸出到屏幕。
run()方法里的循環體遵循我們剛開始提出的游戲結構。循環每30毫秒檢查一次用戶輸入并刷新屏幕。你可以試著將這個值改變一下,這會改變刷新的頻率。
最后,注意MyGameCanvas的構造器里調用了父類GameCanvas的構造方法,傳入的參數為true,這表示從Canvas類繼承的按鍵事件機制被抑制了,因為我們的代碼不需要這些通知機制。我們的游戲狀態用GameCanvas里自帶的按鍵信息(由getKeyStates()方法取得)來處理已經足夠了。通過抑制“keyPressed”、“keyReleased”和“keyRepeated”等通知機制,可以提高游戲的性能。
原文見:http://today.java.net/pub/a/today/2005/07/07/j2me3.html
J2ME是一個很流行的用于移動設備游戲開發的平臺。J2ME中的MIDP 2.0引入了一個新的API包,它提供了一些定義好的游戲結構,這在以前的1.0版中要通過很多累贅代碼來實現。在這部分tutorial中,我們會學習這個API包,然后用它開發一個小游戲(為了學習需要,我們會用到包中所有的類)。這個包是javax.microedition.lcdui.game. 它的建立基于我們前兩次學的J2ME概念。
J2ME游戲API:摘要
javax.microedition.lcdui.game包只有5個類:GameCanvas, Layer, Sprite, TiledLayer和LayerManager. 這5個類提供了開發各種游戲應用的平臺。
Layer是Sprite和TiledLayer的父類。這個類封裝了游戲中可視化元素的行為。可視化元素可以是小精靈(sprite),代表一個可以在屏幕上來回移動的獨立圖形(或組成動畫的一組圖形),
或是一個背景層:通過很少的圖片,就可以生成龐大游戲中的背景。我們可以用Layer來布置圖形和進行可視化操作。Layer的子類通過重寫paint(Graphics g)方法將元素繪制到屏幕上。
LayerManager類可以控制各層的繪制及繪制順序,因此我們可以更方便地管理游戲中的可視化元素(包括小精靈和背景層)。
GameCanvas類擴展了上兩節我們講過的Canvas類(畫布),提供一個在屏幕后端運行(off-screen)的緩沖區,所有繪制操作都先在這個緩沖區上進行,然后再顯示到屏幕。它還提供了得到用戶按鍵信息的快捷方法。
最好的學習方法應該是寫一個完整的小游戲,通過這個小游戲我們可以了解游戲制作的方方面面。我們在介紹完這個小游戲的構造后(針對目前還沒有游戲開發經驗的),會在開發游戲的過程中具體介紹包中的每個類。
構建游戲的簡短入門
游戲和動畫是建立在重復執行某段代碼的機制上的。這段代碼跟蹤實例變量的值,然后更新相應狀態。基于當前游戲狀態,代碼將游戲元素繪制到屏幕上。實例變量值是隨著用戶交互和游戲內部行為而改變的。
代碼的重復執行是通過將這段代碼放入循環中實現的。在進入循環前,先檢查一下實例變量,看是否要繼續游戲,否則退出循環。為了控制實例變量的更新頻率(其實是屏幕刷新的頻率),循環體中的代碼應該每次休眠一段時間(毫秒計)。
游戲的結構如下列代碼所示:
我們將在以下幾節中使用這個結構來開發一個游戲。
轉自:http://forum.ubuntu.org.cn/viewtopic.php?t=6774
1、臨時更改(不需要重啟):
代碼:
$ sudo ifconfig eth0 down
$ sudo ifconfig eth0 hw ether XX:XX:XX:XX:XX:XX
$ sudo ifconfig eth0 up
這樣做完以后default route可能就沒有了,要重新加一下
代碼:
$ sudo route add default gw xxx.xxx.xxx.xxx
2、永久更改:
代碼:
$ sudo gedit /etc/iftab
eth0 mac 00:e0:4d:75:8e:50(改成你要的物理地址mac)
代碼:
$ sudo gedit /etc/network/interfaces
將iface eth0 inet static后面添加一行
hwaddress ether 00:E0:4d:75:8E:50
如:iface eth0 inet static
hwaddress ether 00:E0:4d:75:8E:50(自己加的)
address 219.220.214.113
。
。
。
然后就好了 可能要重啟一下
J2ME Tutorial, Part 1: Creating MIDlets
J2ME Tutorial, Part 2: User Interfaces with MIDP 2.0
J2ME Tutorial, Part 3: Exploring the Game API of MIDP 2.0
J2ME Tutorial, Part 4: Multimedia and MIDP 2.0J2ME Tutorial, Part 1: Creating MIDlets
J2ME Tutorial, Part 2: User Interfaces with MIDP 2.0
J2ME Tutorial, Part 3: Exploring the Game API of MIDP 2.0
J2ME Tutorial, Part 4: Multimedia and MIDP 2.0