Nanashi-softプログラマ専用AndroidでOpenGL ES 2.0プログラミング


◇AndroidでOpenGL ES 2.0プログラミング -タッチを取得-

色々なサンプルを見かけるのですが,ここで説明する方法は API Level 8 (Android 2.2)での話です
とても簡単なタッチ取得方法があります

プロジェクトを作成した時に,最初からある Activityクラスに,onTouchEventをオーバーライドするだけです
public class testndk extends Activity {
    public void onCreate(Bundle savedInstanceState) {
~略~
	}

    public boolean onTouchEvent(MotionEvent event) {
~ここにタッチ時の処理~
	}
~略~
Activityオブジェクトには,最初からタッチ操作が届いている仕様なのです

NDKの説明ですので,C言語と連結する方法まで書いておきたいと思います

既に描画用のクラスに,↓こういう感じで定義していると思います
class testRenderer implements GLSurfaceView.Renderer{
	public native void NDKonSurfaceChanged(int w,int h);
~略~
    static {
    	System.loadLibrary("hello-jni");
    }
~略~
	public void onSurfaceChanged(GL10 gl, int w, int h) {
		NDKonSurfaceChanged(w, h);
	}
~略~
これに対する,cファイルの関数は↓こういう感じですね
~略~
void Java_jp_testndk_testndk_NDKonSizeChanged(JNIEnv* env, jobject obj, jint w, jint h)
{
~略~
これと同じように書けば良いです
ポイントは,クラス毎に,そのクラスで使用する関数名とライブラリファイル名を記述するところです
なので,↓ココに書きます
public class testndk extends Activity {
	public native void NDKonTouch(int mode2,float cx,float cy);
~略~
	static {
		System.loadLibrary("hello-jni");
	}
~略~
	public boolean onTouchEvent(MotionEvent event) {
		int mode2=-1;
		float cx=0;
		float cy=0;

		if(event.getAction() == MotionEvent.ACTION_DOWN) {
			//タッチした
			mode2=1;
			cx=event.getX();
			cy=event.getY();

			NDKonTouch(mode2, cx, cy);
			return true;
		}else if(event.getAction() == MotionEvent.ACTION_UP){
			//離した
			mode2=0;
			cx=event.getX();
			cy=event.getY();

			NDKonTouch(mode2, cx, cy);
			return true;
		}
		return false;
	}
~略~
タッチした時と,離した時の座標を送るサンプルです
どんなイベントが来るのかは,MotionEventでググればいくらでも説明ページが見つかります

onTouchEventメソッドの戻り値が重要なポイントなのですが,trueを返すとそこでメッセージが止まり,falseを返すと次のクラ スなどに飛んでいきます
OpenGLの場合は常に画面全体を描画するのであまり関係ありませんが,普段からここを意識しておいた方が後々変なバグに悩まされる確率が下が ります

これに対する,cファイルの関数は↓こういう感じです
他のクラスから呼び出す関数郡と同じファイルで構いません
void Java_jp_testndk_testndk_NDKonTouch(JNIEnv* env, jobject obj, int mode2,float cx,float cy)
{
	if(mode2 == 1){
		//タッチされた
	}else if(mode2 == 0){
		//離された
	}
}
これでタッチした内容を C言語に伝える事ができます


TOPプログラマ 専用AndroidでOpenGL ES 2.0プログラミング