0

簡単なブレイクアウトゲームを作成していて、これまでにボールとプレーヤーを作成しました。タッチした位置にボールが動くようにしましたが、スワイプした方向に動かしたいです。のように、プレーヤーは私の指と一緒に動きます。MainActivityにあるコードは次のとおりです。

package com.example.breakout;

import android.os.Bundle;
import android.app.Activity;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class MainActivity extends Activity implements OnTouchListener, OnGestureListener{

    BreakoutView bv;
    GestureDetector gs;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bv = new BreakoutView(this);
        setContentView(bv);
        bv.setOnTouchListener(this);


        gs = new GestureDetector(MainActivity.this, this);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);

        return true;
    }

    @Override
    public boolean onTouch(View arg0, MotionEvent arg1) {
        /*if(arg1.getY()<600){
            bv.p1.x = arg1.getX();
            bv.p1.y = 600;
        }*/
        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent me){
        return gs.onTouchEvent(me);
    }

    @Override
    public boolean onDown(MotionEvent arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        /*if(e2.getX()>e1.getX()){
            //Move right
            bv.p1.x = e2.getX();

        }*/

        return false;
    }

    @Override
    public void onLongPress(MotionEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,
            float arg3) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onShowPress(MotionEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onSingleTapUp(MotionEvent arg0) {
        // TODO Auto-generated method stub
        return false;
    }

}

したがって、私が試した2つの方法は、onTouchとonFlingの方法です。onTouchは、私が触れた場所でプレーヤーを「テレポート」しますが、これは私が望んでいることではありません。onFlingは、スワイプが完了したときにのみプレーヤーを移動するため、どちらも機能しません。私の質問は、指をスワイプするときにどうやって動かすことができるかということです。onDownを使用しますか?どんな助けでも大歓迎です。

ありがとう!

4

1 に答える 1

1

UI が一定間隔で更新されるゲーム ループが設定されているとします。

/**
 * Onclick event for Touch Screen
 */
@Override
public boolean onTouchEvent(MotionEvent input) {
    if (input.getAction() == MotionEvent.ACTION_MOVE) {
        float currX = input.getX();
        float currY = input.getY();

        if (!swiping) {
            swiping = true;
            swipeStartY = currY;
            swipeStartX = currX;
        }

        if (swiping) {          
            double newDirection = Math.atan2((currY-ball.getY()),currX-ball.getX());
            ball.setDirection(newDirection);
        }

    } else if (input.getAction() == MotionEvent.ACTION_UP) {
        if (swiping) {
            swiping = false;
        }
    }
}

このように、ボールの方向はゲーム スレッドのティックごとに更新され、指 (タッチ イベントの X/Y 位置) に向かって移動します。図面/物理学/その他をどのように設定したかわかりません。そのため、ここでは意味のある関数呼び出しを提供できません。指を離した後に直線でスワイプするように変更する必要がある場合は、最初の X/Y ポイント (この場合は swipeStartX/swipeStartY) を保存し、スワイプを停止した後にのみ新しい方向を設定します。

編集:

このコードを含む私のクラス定義は次のとおりです。

public class GameView extends SurfaceView implements SurfaceHolder.Callback {
  ....
}
于 2013-01-30T16:10:01.717 に答える