【Android】SurfaceViewを使ってゲームっぽいアプリを作ってみる(入力編)


前回の記事「【Android】SurfaceViewを使ってゲームっぽいアプリを作ってみる(1)」の続きです。

ゲームの基幹部分が終わったので、次は入力部分を…。

画面をタッチして操作するような機能を作ってみます(`・ω・´)



【参考にしたサイトさん】
・タッチイベント(TouchEvent)を取得するには - 逆引きAndroid入門
・Androidでアプリ画面のタッチイベントを取得する方法 | Tech Booster



タッチイベント(TouchEventとMotionEvent)でタッチした座標を取得する


タッチされた場所を取得するには onTouchEvent 関数を使います。
引数になっているMotionEventの関数を使って、座標やアクションの内容を取得できます。

public boolean onTouchEvent(MotionEvent event) {
        /* ここに入力したい内容を記述する */
	return true;
}



・MothionEvent関数の例
関数名取得できる情報
getX() , getY()タッチされたX座標、Y座標
getAction()タッチのアクション名
getPressure()タッチされた圧力

今回はタッチされたX座標とY座標を取得してみます。
前回作成したSampleSurficeView.java を修正します。

・SampleSurficeView.java
import android.content.Context;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SampleSurficeView extends SurfaceView{

	private SampleHolderCallBack cb;

	public SampleSurficeView(Context context) {
		super(context);
		SurfaceHolder holder = getHolder();
		cb = new SampleHolderCallBack();
		holder.addCallback(cb);
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		float x = event.getX(); // X座標を取得
                float y = event.getY(); // Y座標を取得
		cb.getTouchPoint( x , y );
		return true;
	}
}




次に SampleHolderCallBack.java を修正して、
タッチした場所を保持する処理を追加します。

取得した座標に白丸の座標を移動させるような処理にしてみました。

・SampleHolderCallBack.java
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.view.SurfaceHolder;

public class SampleHolderCallBack implements SurfaceHolder.Callback, Runnable{

	private SurfaceHolder holder = null;
	private Thread thread = null;
	private boolean isAttached = true;

	private float dx = 10, dy = 10;
    private float width, height;
    private int   circle_x, circle_y;

  	private long t1 = 0, t2 = 0; // スリープ用

  	private float touch_x; //タッチされたX座標

	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,	int height) {
		// TODO 自動生成されたメソッド・スタブ
		this.width = width;
		this.height = height;
	}

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO 自動生成されたメソッド・スタブ
		this.holder = holder;
		thread = new Thread(this);
		thread.start(); //スレッドを開始
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder holder) {
		// TODO 自動生成されたメソッド・スタブ
	       isAttached = false;
	       thread = null; //スレッドを終了
	}

	@Override
	public void run() {
		// TODO 自動生成されたメソッド・スタブ
		// メインループ(無限ループ)
		while( isAttached ){
			t1 = System.currentTimeMillis();

			//丸の表示位置を動かす
			if( circle_x < 0 || circle_x > this.width ){
				dx = -dx;
			}
			if( circle_y < 0 || circle_y > this.height ){
				dy = -dy;
			}

			circle_x += dx;
			circle_y += dy;

			//描画処理を開始
			Canvas canvas = holder.lockCanvas();
			canvas.drawColor(0,PorterDuff.Mode.CLEAR );
			Paint paint = new Paint();
	        paint.setColor(Color.WHITE);
	        canvas.drawCircle( circle_x, circle_y, 50, paint);

			//描画処理を終了
			holder.unlockCanvasAndPost(canvas);

			// スリープ
			t2 = System.currentTimeMillis();
			if(t2 - t1 < 16){ // 1000 / 60 = 16.6666
				try {
					Thread.sleep(16 - (t2 - t1));
				} catch (InterruptedException e) {
				}
			}
		}
	}
	public void getTouchPoint( float x, float y ){
		circle_x = (int)x;
		circle_y = (int)y;
	}
}



【実行結果】
onTouchEventとMotionEventを使った入力機能例

タッチすると白い丸が移動します



次回はゲームの仕様を決めて、
ゲームアプリっぽいものを完成までやってみます( ^ω^)


関連記事

【Android】SurfaceViewを使ってゲームっぽいアプリを作ってみる(入力編)” への2件のコメント

  1. ピンバック: 【Android】SurfaceViewを使ってゲームっぽいアプリを作ってみる(ゲーム内容編) | 桜花満開

  2. ピンバック: 【Android】カメラ機能を使ってプレビューをSurfaceViewに表示する方法 | 桜花満開