4

今月の役に立たないプロジェクトとして、Android で J2ME プログラムを実行するための「エミュレータ」に取り組んでいます。しかし、今は J2ME Sprite の実装に行き詰まっています。具体的には、そこで使用される変換。

私のスプライトには、3 つのキャラクター イメージを含むビットマップがあります。ミラーリングまたは 90 度回転した 2 番目のフレームをペイントしたいと思います。そのための最良の方法は何ですか?

指定されたフレームを変換せずに描画する次のコードがあります。

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

3 に答える 3

4

オープンソースプロジェクトであるMicroemulatorを使用すると、AndroidでJ2MEコードを実行できるようになります。

http://www.microemu.org/

あなたはいつでも見て、彼らが何をしているのかを見ることができます。

于 2009-09-25T19:32:24.963 に答える
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;
}

魅力のように機能します:)

于 2010-04-30T21:15:26.337 に答える
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クラスリスト

Androidキャンバスクラス

Androidマトリックスクラス

于 2009-09-26T10:20:55.337 に答える