前回の記事「【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;
}
}
【実行結果】
次回はゲームの仕様を決めて、
ゲームアプリっぽいものを完成までやってみます( ^ω^)


ピンバック: 【Android】SurfaceViewを使ってゲームっぽいアプリを作ってみる(ゲーム内容編) | 桜花満開
ピンバック: 【Android】カメラ機能を使ってプレビューをSurfaceViewに表示する方法 | 桜花満開