J2ME就像Android上的Sprite一样

时间:2009-09-25 18:23:24

标签: android java-me sprite transformation

对于我这个月无用的项目,我正在使用'模拟器'在Android上运行J2ME程序。但现在我坚持使用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);

据我了解,我需要在画布上制作一些矩阵魔法,但我无法弄明白:)

3 个答案:

答案 0 :(得分:4)

你知道Microemulator是一个开源项目,可以在Android上运行J2ME代码,对吗?

http://www.microemu.org/

你总是可以看看他们做了什么。

答案 1 :(得分: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;
}

像魅力一样工作:)

答案 2 :(得分: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