很就沒有關心J2ME的情況了,今天看到一篇介紹MIDP 2.0的文章就翻譯了出來,雖然不是很新。偶的E文不好,有錯的地方希望大家諒解!
原文出處:http://www.microJava.com/articles/techtalk/game_api
MIDP 2.0: The Game API
by Mikko Kontio
MIDP 2.0 為移動開發者帶來幾項新特性,比如支持媒體、更好的用戶界面、新的連通協議、enabled push、空中下載和更好的安全性。然而一個最讓人感興趣的新特性就是GAME API。
這篇文章重點介紹GAME API裡的新類和它們的用法,開發環境使用J2ME Wireless Toolkit 2.0 Beta。
The Game API
The Game API 幫助開發者(游戲開發者或其他想得到更好用戶界面的人)快速開發有較好可用性且節約設備資源(比如內存)的用戶界面。The Game API也有利減小jar文件的大小。在MIDP 1.0中,開發者必須寫自己的繪圖程序來得到好的效果,這導致jar文件的增大。使用MIDP提供的程序可以得到較好的效果並且減小jar文件的大小,因此開發者應該信任所有支持MIDP 2.0 GAME API的設備。
Game API的基本概念是game screen包含了layers,背景在一個層上,道路在一層上,而英雄
的配角在其他層上。所有這些層能被分別的操作。API甚至允許直接在層上繪圖。因此游戲區域也比screen大很多,並且在游戲代碼卷屏也成為可能。The Game API提供一個觀察窗口,它能觀察整個游戲區域。這個窗口能很容易的被移動,觀察窗口上的點可以對於實際屏幕上點。
Java手機網[www.cnjm.Net]The Game API能在Javax.microedition.lcdui.game中找到。API中有5個新類,它們是:GameCanvas, Layer, LayerManager, Sprite和TiledLayer.
GameCanvas是個抽象類,它提供了游戲用戶界面的基本。它比Canvas有2點益處。它擁有off-screen buffer;它能得到設備物理鍵的狀態
Layer是個抽象類。它能描繪從Layer繼承來的game.Sprite和TiledLayer元素。Layer通常被用做它自己的子類。
LayerManager是管理幾個層物體並將它們繪到屏幕上的類。
Sprite是一個能包含存儲在一個image裡幾幀的類。例如一個image包含4個圖片表示運動的小狗。Sprite能用image的一部分表示一幀並構造一個顯示序列來建立一個運做。它也被用來在其他Sprite或TiledLayer裡檢測碰撞。
TiledLayer有點象Sprite,但它主要用來顯示背景、道路或其他大的區域。TiledLayer由單元網格組成,它能被圖片和標題填充。因此背景要由
處理用戶輸入
在MIDP 2.0裡處理用戶輸入和1.0裡有少許的不同。在1.0裡你能用getGameAciton()方法來得到游戲動作。但在2.0裡你要用getKeyStates()方法來得到按鍵狀態。下面的代碼顯示了怎麼樣做,首先我們通過檢測變量keyState得到4個按鍵(up,down,left,right)的狀態並做我們想做的。
protected void keyPressed(int keyCode) {
int move = 0;
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
// do something
}
if ((keyState & RIGHT_PRESSED) != 0) {
// do something
}
if ((keyState & UP_PRESSED) != 0) {
// do something
Java手機網[www.cnjm.Net] }
if ((keyState & DOWN_PRESSED) != 0) {
// do something
}
Java手機網[www.cnjm.Net]}
使用off-screen buffer
使用off-screen buffer很容易創建無閃爍的動畫而開發者不用額外的圖形對象去建立兩個緩沖。在GameCanvas裡的off-screen buffer提供一個off-screen圖形物體,它能被用來繪象素或層或sprites到canvas上。當有任何東西被繪的它都能立即被更新。
在下面的代碼中getGraphics()方法被用來得到off-screen buffer。在循環裡,buffer被用來繪LayerManager(layers object)的內容。當調用flushGraphics()方法時buffer被更新。這兒也有flushGraphics(int x,int y,int width,int hight)方法,被用來刷新特點范圍的off-screen buffer。
public void run() {
Graphics g = getGraphics();
while (play) {
try {
Java手機網[www.cnjm.Net] // First draw all the layers
layers.paint(g, 0, 0);
// If the game is on, flush the graphics
if (play) {
flushGraphics();
}
Java手機網[www.cnjm.Net] try {
mythread.sleep(sleepTime);
} catch (Java.lang.InterruptedException e) {}
Java手機網[www.cnjm.Net]
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java手機網[www.cnjm.Net]使用層
在游戲裡(或在繪圖應用程序裡)Screen經常由不同的物體組成,他們任何一個都可能和其他一個或幾個有聯系。舉個例子,一只蜜蜂能在森林、陸地、水面和空中飛,但在迷宮裡主角去不能穿牆。
在MIDP2.0 Game API裡介紹了層,它提供了方法來管理物體或屏幕上的內容。層能夠是TiledLayer(背景,牆)、Sprite(蜜蜂)或其他從Layer繼承來的類。
下面的代碼是把程序裡不同的部分重疊在一起,如圖所示來介紹Layer的用法。代碼中重要的類是TiledLayer,LayerManager,Image。image類是保存幾個相同大小圖片的。TiledLayer使用這些圖片把他們繪在柵格裡。
當一個TiledLayer實例被創建時,構造函數需要5個參數。這些參數是列號、行號、圖片、寬、高。在例子中,柵格有40列,16行,圖片是Tiles.png,高和寬是7個象素。代碼開始最後一個整數參考具體的用法。
在TiledLayer實例被創建後,調用fillCells()方法來填充柵格。在代碼最後一行TiledLayer被加到LayerManage中。append()方法是觀察者最大限度的安置layer。當然你可以用insert()方法插入你的layer在任何位置。
private TiledLayer tiles;
private LayerManager layers;
private Image tilesImage;
Java手機網[www.cnjm.Net]public final int TILE_GROUND = 1;
public final int TILE_WATER = 2;
public final int TILE_SHORE_LEFT = 3;
public final int TILE_FOREST = 4;
public final int TILE_AIR = 5;
Java手機網[www.cnjm.Net]public final int TILE_SHORE_RIGHT = 5;
Java手機網[www.cnjm.Net]
// ...
// Creating an instance of the TiledLayer
layers = new LayerManager();
try {
Java手機網[www.cnjm.Net] tilesImage = Image.createImage("/Tiles.png");
} catch (IOException e) {}
tiles = new TiledLayer(40, 16, tilesImage, 7, 7);
// ...
// Filling the TiledLayer with tiles
tiles.fillCells(0, 0, 40, 16, TILE_AIR);
tiles.fillCells(14, 12, 12, 4, TILE_WATER);
tiles.fillCells(0, 10, 14, 6, TILE_GROUND);
// and more tiles like FOREST and the shores...
layers.append(tiles);
下面的圖片顯示整個屏幕的狀態。
Java手機網[www.cnjm.Net]
使用Sprites
如前所述,Sprites描繪了屏幕上的一個單一物體。這個物體可以是推石頭的小孩、一個射擊敵人的戰艦。Sprite類的工作方式有點類似tilesLayer類(他們都是從Layer繼承來的)。Sprites也可以將幾個相同大小圖片當作一個圖片來顯示,無論如何這些圖片沒有標題,他們是動畫裡的幀。Sprites可以是活動的,可以顯示幀讓它看起來是活動的。
下面的代碼說明怎樣創建一個Sprites的實例,這個正確的原則也適用於TiledLayer.
try {
spriteImage = Image.createImage("/Sprite.png");
} catch (IOException e) {}
Java手機網[www.cnjm.Net]
sprite = new Sprite(spriteImage, 7, 7);
在Layer類裡,有2種方法讓Sprites在游戲區域裡移動
move(int dx, int dy)
setPositions(int x, int y)
讓LayerManage控制Sprites的繪制和移動是重要的,在代碼裡設置和存儲Sprites也是很重要的。下面的代碼說明了怎麼樣移動Sprites。Sprites裡的圖片是7個象素高寬的,因此Sprites每次移動7個象素。
public static final int UP = 0;
public static final int RIGHT = 1;
public static final int DOWN = 2;
public static final int LEFT = 3;
// ...
switch (direction){
case UP:
sprite.move(0, -7);
break;
case DOWN:
sprite.move(0, 7);
break;
case RIGHT:
sprite.move(7, 0);
Java手機網[www.cnjm.Net] break;
case LEFT:
sprite.move(-7, 0);
break;
default: break;
}
Java手機網[www.cnjm.Net]在游戲中另一個重要的就是判斷碰撞。Sprites可以停留在游戲區域中一個特定位置,這對判斷Sprites是否和其他物體碰撞是很重要的。在游戲裡碰撞意味著改變方向或游戲結束。Sprites用下面4個方法幫助開發者判斷碰撞:
collidesWith(Image image, int x, int y,
boolean pixelLevel)
collidesWith(Sprite s, boolean pixelLevel)
collidesWith(TiledLayer t, boolean pixelLevel)
defineCollisionRectangle(int x, int y,
int width, int height)
總結
這篇文章介紹了MIDP2.0裡的一個新特性,Game API並給出了一個例子,它用到了API裡的許多特性。這些可以幫助開發者應付游戲區域比屏幕大很多的情況,並可以在多個層上繪物體。
來自Wireless Toolkit 2.0 Beta的競爭者不很快,事實上這些特性中的一些使用起來仍然有點慢,但它帶給我們基本的支持。重要的是這些已經被軟件開發者開始設計。你不得不思考2次你想做什麼;怎樣做更好。最後沒有平台和API提供壞的設計。