J2ME, как Sprite на Android

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

В моем спрайте у меня есть растровое изображение с тремя символами. Я хотел бы нарисовать второй кадр, зеркально отраженный или повернутый на 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); 

Насколько я понимаю, мне нужно сделать магию магии на холсте, но я не смог это понять 🙂

Вы знаете, что Microemulator, проект с открытым исходным кодом, позволяет запускать J2ME-код на Android, верно?

http://www.microemu.org/

Вы всегда можете посмотреть и посмотреть, что они делают.

Пошел с раскалыванием спрайта в рамки и с помощью преобразований с одним изображением:

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

Работает как шарм 🙂

Я не занимался разработкой 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

Android Canvas Class

Android Matrix Class