2009-09-25 45 views
3

對於我本月無用的項目,我正在開發一個'模擬器'來在Android上運行J2ME程序。但是現在我堅持使用J2ME Sprite實現。具體來說就是使用它的轉換。J2ME像Android上的Sprite

在我的Sprite中,我有一個包含三個字符圖像的位圖。我想繪製鏡像或旋轉90度的第二幀。最好的辦法是什麼?

我有下面的代碼,繪製給定的框架沒有任何轉換。

frameX,frameY是給出sprite位圖的幀位置座標。

Rect src = new Rect(frameX, frameY, frameX + spriteWidth, frameY + spriteHeight); 
Rect dst = new Rect(paintX, paintY, paintX + spriteWidth, paintY + spriteHeight); 
canvas.drawBitmap(image, src, dst, null); 

據我瞭解我需要在畫布上的一些矩陣魔法,但我一直沒能想出解決辦法:)

回答

4

你知道Microemulator,一個開源項目,使它可以在Android上運行J2ME代碼,對嗎?

http://www.microemu.org/

你總是可以看看,看看他們做什麼。

2

我還沒有做過任何Android開發,但是在那個移動開發中有很多移動和很多Java。所以請記住這一點。

我會做什麼,在Android的類文檔(下面鏈接)服用後一看,是這樣的:

Rect src = new Rect(frameX, frameY, frameX + spriteWidth, frameY + spriteHeight); 
Rect dst = new Rect(paintX, paintY, paintX + spriteWidth, paintY + spriteHeight); 
Matrix orig = canvas.getMatrix(); 
canvas.rotate(90.0f); 
canvas.drawBitmap(image, src, dst, null); 
canvas.setMatrix(orig); 

或者你也可以做到這一點,像這樣:

RectF src = new RectF(frameX, frameY, frameX + spriteWidth, frameY + spriteHeight); 
RectF dst = new RectF(paintX, paintY, paintX + spriteWidth, paintY + spriteHeight); 
Matrix matrix = canvas.getMatrix(); 
matrix.rotate(90.0f); 
matrix.setRectToRect(src, dst, Matrix.ScaleToFit.FILL); 
canvas.drawBitmap(image, matrix, null); 

兩個方法對我來說似乎很好。我不確定是否更快。後一種解決方案更加模塊化,因爲您無需更改畫布的矩陣。所以,這可能被認爲是更好的解決方案。

Android Class Listing

Android Canvas Class

Android Matrix Class

+0

矩陣.setRectToRect需要RectF不是Rect – tensaix2j 2009-10-24 14:46:59

3

去與分裂精靈分成幀,並使用變換用單個圖像:

public final void paint(final Canvas canvas) { 
    final Bitmap painted = images[frame]; 
    final Matrix matrix = createTransformationMatrix(transform); 
    matrix.postTranslate(spriteX, spriteY); 
    canvas.drawBitmap(painted, matrix, null); 
} 

private Matrix createTransformationMatrix(final int transform2) { 
    final Matrix result = new Matrix(); 
    switch (transform2) { 
    case TRANS_NONE: 
    break; 
    case TRANS_MIRROR_ROT180: 
    result.setScale(-1, 1); 
    result.postTranslate(getWidth(), 0); 
    result.postRotate(180); 
    break; 
    case TRANS_MIRROR: 
    result.setScale(-1, 1); 
    result.postTranslate(getWidth(), 0); 
    break; 
    case TRANS_ROT180: 
    result.postRotate(180); 
    break; 
    case TRANS_MIRROR_ROT270: 
    result.setScale(-1, 1); 
    result.postTranslate(getWidth(), 0); 
    result.postRotate(270); 
    break; 
    case TRANS_ROT90: 
    result.postRotate(90); 
    break; 
    case TRANS_ROT270: 
    result.postRotate(270); 
    break; 
    case TRANS_MIRROR_ROT90: 
    result.setScale(-1, 1); 
    result.postTranslate(getWidth(), 0); 
    result.postRotate(90); 
    break; 
    } 
    return result; 
} 

就像一個魅力:)