スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



MIDP -> Android移植 Graphics.drawRegion()...

MIDP GraphicsクラスのdrawRegion()メソッドの移植していたのですが,
これが...。

なにが問題かといえば,元画像の一部を抽出して,
その抽出した画像を回転・反転させるという。

AndroidのCanvasクラスには回転や反転させて描画させるメソッドがあります。
void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)

また一部を抽出するメソッドもあります。
void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)

ですが...
一部を抽出して,そこに回転や反転を反映させるメソッドはありません。

drawRegion()メソッドは描画メソッドなので,
30FPSで作られたゲームでは1秒間に30回コールされます。

もしこの中でBitmapインスタンスを生成していたら
たまったものじゃない...と勝手に想像しています。
(実際にパフォーマンスをはかった訳じゃないので希有なのかもしれない)

なので,できるだけインスタンスを生成しないで描画する処理を考えていました。
下記の抽出して回転を加えた処理では,以下のことを想定して実装しました。

1.Canvasに対してMatrixを設定する。
2.drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)で抽出する。
このとき1.で設定したMatrixが適用される。

一見,うまくいったように見えるけど,Y軸がなぜか-145pxのオフセットがかかっている。
自分の考えが何か間違っているのだと思うけど...。

明日は,drawRegionメソッドの移植をやめて,
コール側で一時的な画像を生成して描画するように
実装しなおす方策にしようかと思う。

下記にコードを添付します。
もしわかる方がいれば教えてください。


matrixtest.jpg
package com.example.bitmap.matrix.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;

public class MainActivity extends GraphicsActivity
{
	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(new ScreenView(getApplicationContext()));
	}

	private static class ScreenView extends View
	{
		// 転送元Bitmap
		private Bitmap mSrcBitmap = null;

		// 描画用
		private Paint mPaint = null;

		//
		private Matrix mMatrix = new Matrix();

		// / 幅
		static final private float WIDTH = 100f;

		// / 高さ
		static final private float HEIGHT = 100f;

		/**
		 * コンストラクタ
		 * 
		 * @param context
		 */
		public ScreenView(Context context)
		{
			super(context);

			mSrcBitmap = Bitmap.createBitmap((int) WIDTH, (int) HEIGHT, Bitmap.Config.ARGB_8888);

			Canvas canvas = new Canvas(mSrcBitmap);

			canvas.drawColor(Color.BLACK);

			Path path = new Path();

			// (50, 50)を中心に半径30の円を書く
			path.addCircle(WIDTH / 2, HEIGHT / 2, 30.0f, Path.Direction.CCW);

			Paint paint = new Paint();
			paint.setAntiAlias(true);
			paint.setFilterBitmap(true);
			paint.setStrokeWidth(6);
			paint.setColor(Color.BLUE);

			canvas.drawPath(path, paint);

			final float pointY1 = 10f;
			final float pointY2 = HEIGHT - pointY1;
			final float pointX1 = 10f;
			final float pointX2 = WIDTH - pointX1;

			path.reset();
			path.moveTo(WIDTH / 2, pointY1);
			path.lineTo(pointX2, pointY2);
			path.lineTo(WIDTH / 2, pointY2);
			path.close();

			paint.setStyle(Paint.Style.FILL);
			paint.setColor(Color.GREEN);
			canvas.drawPath(path, paint);

			path.reset();
			path.moveTo(WIDTH / 2, pointY1);
			path.lineTo(pointX2, pointY2);
			path.lineTo(pointX1, pointY2);
			// path.lineTo(50f, 10f); // lineTo()だと線を閉じたことになっていなかった
			path.close();

			paint.setStyle(Paint.Style.STROKE);
			// paint.setStrokeCap(Cap.SQUARE);
			paint.setColor(Color.RED);
			canvas.drawPath(path, paint);

			mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
		}

		/*
		 * (非 Javadoc)
		 * 
		 * @see android.view.View#onDraw(android.graphics.Canvas)
		 */
		@Override
		protected void onDraw(Canvas canvas)
		{
			canvas.drawColor(Color.WHITE);

			canvas.save();
			canvas.translate(10.0f, 10f);
			canvas.drawBitmap(mSrcBitmap, 0.0f, 0.0f, mPaint);

			mMatrix.reset();
			mMatrix.setRotate(90f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postTranslate(WIDTH + 10f, 0f);
			canvas.drawBitmap(mSrcBitmap, mMatrix, mPaint);

			mMatrix.reset();
			mMatrix.setRotate(180f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postTranslate((WIDTH + 10f) * 2f, 0f);
			canvas.drawBitmap(mSrcBitmap, mMatrix, mPaint);

			mMatrix.reset();
			mMatrix.setRotate(270f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postTranslate((WIDTH + 10f) * 3f, 0f);
			canvas.drawBitmap(mSrcBitmap, mMatrix, mPaint);
			canvas.restore();

			// ---------------
			// 左右反転と回転
			// ---------------

			canvas.save();
			canvas.translate(10.0f, HEIGHT + 20f);
			mMatrix.reset();
			// mMatrix.setScale(-1f, 1f); // 左右反転
			// (0,0)を軸に反転するので反転後は-WIDTH方向に画像が展開される
			// mMatrix.postTranslate(WIDTH, 0f);
			mMatrix.setScale(-1f, 1f, WIDTH / 2, HEIGHT / 2); // 左右反転(画像の中心を軸に)
			canvas.drawBitmap(mSrcBitmap, mMatrix, mPaint);

			mMatrix.reset();
			mMatrix.setScale(-1f, 1f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postRotate(90f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postTranslate(WIDTH + 10f, 0f);
			canvas.drawBitmap(mSrcBitmap, mMatrix, mPaint);

			mMatrix.reset();
			mMatrix.setScale(-1f, 1f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postRotate(180f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postTranslate((WIDTH + 10f) * 2f, 0f);
			canvas.drawBitmap(mSrcBitmap, mMatrix, mPaint);

			mMatrix.reset();
			mMatrix.setScale(-1f, 1f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postRotate(270f, WIDTH / 2, HEIGHT / 2);
			mMatrix.postTranslate((WIDTH + 10f) * 3f, 0f);
			canvas.drawBitmap(mSrcBitmap, mMatrix, mPaint);
			canvas.restore();

			// ----------
			// 一部抽出
			// ----------

			float offsetY = (HEIGHT + 10f) * 2f + 10f;
			float offsetX = 10f;

			canvas.save();

			final int left = (int) (WIDTH / 4f + 0.5f);
			final int top = (int) (HEIGHT / 4 + 0.5f);
			final int width = (int) (WIDTH / 2 + 0.5f);
			final int height = (int) (HEIGHT / 2 + 0.5f);

			Rect src = new Rect(left, top, left + width, top + height);
			RectF dst = new RectF(left, top, left + width, top + height);

			{
				RectF dst2 = new RectF(dst);
				dst2.offset(offsetX, offsetY);
				canvas.drawBitmap(mSrcBitmap, src, dst2, mPaint);
			}

			canvas.restore();

			canvas.save();
			offsetX += WIDTH + 10f;
			mMatrix.reset();
			mMatrix.setRotate(90f, WIDTH / 2f, HEIGHT / 2f);
			mMatrix.postTranslate(offsetX, offsetY + 145f);	// なぜか145f
			canvas.setMatrix(mMatrix);
			canvas.drawBitmap(mSrcBitmap, src, dst, mPaint);
			canvas.restore();

			canvas.save();
			offsetX += WIDTH + 10f;
			mMatrix.reset();
			mMatrix.setRotate(180f, WIDTH / 2f, HEIGHT / 2f);
			mMatrix.postTranslate(offsetX, offsetY + 145f);	// なぜか145f
			canvas.setMatrix(mMatrix);
			canvas.drawBitmap(mSrcBitmap, src, dst, mPaint);
			canvas.restore();

			canvas.save();
			offsetX += WIDTH + 10f;
			mMatrix.reset();
			mMatrix.setRotate(270f, WIDTH / 2f, HEIGHT / 2f);
			mMatrix.postTranslate(offsetX, offsetY + 145f);	// なぜか145f
			canvas.setMatrix(mMatrix);
			canvas.drawBitmap(mSrcBitmap, src, dst, mPaint);
			canvas.restore();

			// ---------------------
			// 左右反転して一部抽出
			// ---------------------
		}
	}
}
関連記事
スポンサーサイト

テーマ : ゲーム開発
ジャンル : コンピュータ




コメントの投稿

非公開コメント

承認待ちコメント

このコメントは管理者の承認待ちです
アクセス
あなたは
キーワード
カテゴリー
最近の記事
リンク
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

WEB検索
Google

RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。