2009-09-25 2 views
3

Для моего бесполезного проекта месяца я работаю над эмулятором для запуска J2ME-программ на Android. Но теперь я застрял в реализации J2ME Sprite. В частности, используемые в нем преобразования.J2ME как Sprite на Android

В моем спрайте у меня есть растровое изображение с тремя символами. Я хотел бы нарисовать второй кадр, зеркально отраженный или повернутый на 90 градусов. Какой был бы лучший способ для этого?

У меня есть следующий код, который рисует данный кадр без каких-либо преобразований.

frameX, frameY - координаты положения кадра при заданном растровом изображении.

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, проект с открытым исходным кодом, делает его можно запустить J2ME-код на Android, верно?

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 not Rect – tensaix2j

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; 
} 

работает как шарм :)

Смежные вопросы