3

プレイヤーが画面上に図形を描くシンプルなゲームをやっています。パスのポイントは配列に格納され、クラス GameLoop で描画されます。ほぼ完成ですが、2 人のプレイヤーが同時に図形を描画できるように、マルチタッチ入力を使用してゲームを実行する必要があったことに気付きました!

event.Action_Down最初の指と次の指に使用する必要があることはわかっていevent.Action_Pointer_Downますが、すべての形状のポイントとパスの描画をどのように処理すればよいですか? 配列を 1 つだけ使用することはできますか、それともそれぞれに配列が必要ですか。両方のパスをチェックするために、GameLoop クラスのすべてのコードを 2 倍にする必要があると思いますか? 私の質問は少しわかりにくいかもしれませんが、今の気持ちです!いくつかのアドバイスはいいでしょう!

これは、シングル タッチ イベントを処理し、すべてのポイントを配列に渡すコードです。

@Override
public boolean onTouch(View v, MotionEvent event) {

    synchronized (gameLoop) {

        switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:
            gameLoop.touchDownX = event.getX();
            gameLoop.touchDownY = event.getY();
            break;

        case MotionEvent.ACTION_MOVE:
            Point point = new Point();
            point.x = (int) event.getX();
            point.y = (int) event.getY();
            gameLoop.addPoints(point);
            gameLoop.startDrawLine = true;
            break;

        case MotionEvent.ACTION_UP:
            Point point2 = new Point();
            point2.x = (int) gameLoop.touchDownX;
            point2.y = (int) gameLoop.touchDownY;
            gameLoop.addPoints(point2); // Add last point to close shape
            gameLoop.pathOK = true;
            gameLoop.touchActionUp = true;
            break;
        }
    }
    return true; 
}

編集:これは複雑でした!少し変更したコードを見つけました。画面に図形を描き始める人ごとに arrayList を作成する必要があります。複数のプレイヤーが同時に図形を描画できるようにする必要があります。すべての Point 値は、playerarrayList 内に格納する必要があります。最後に、すべてのplayerarrayList は、 と呼ばれるメインの arrayList 内に格納する必要がありますplayers。これを解決するための助けを得ることができますか? 始め方がわかりません。

GameLoop クラスでリストを宣言しました。

        // Lists to handle multiple touch input
    players = new ArrayList<List<Point>>(); // Main arrayList
    player = new ArrayList<Point>(); // Inner arrayList

GameLoop以下のコードは MainActivity クラスにあり、 likeのオブジェクトを使用gameLoopして GameLoop メソッドと通信します。

@Override
public boolean onTouch(View v, MotionEvent event) {

    synchronized (gameLoop) {

    for(int i=0; i<event.getPointerCount(); i++) { // Numbers of pointers on screen

        int id = event.getPointerId(i);

        // Check if fingers touch screen
        if (event.getActionIndex() == i && (event.getActionMasked() == MotionEvent.ACTION_POINTER_UP || event.getActionMasked() == MotionEvent.ACTION_UP )) {


        }

        // Check if fingers leave the screen
        else if (event.getActionIndex() == i && (event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN || event.getActionMasked() == MotionEvent.ACTION_DOWN)) {


        }

        // Check movement on screen
        else {

        }   
    }
    }
    return true; 
}
4

1 に答える 1

0

すべてのポインターのモーション履歴を一度に処理するこの例を見てください。

void printSamples(MotionEvent ev) {
    final int historySize = ev.getHistorySize();
    final int pointerCount = ev.getPointerCount();
    for (int h = 0; h < historySize; h++) {
        System.out.printf("At time %d:", ev.getHistoricalEventTime(h));
        for (int p = 0; p < pointerCount; p++) {
            System.out.printf("  pointer %d: (%f,%f)",
            ev.getPointerId(p), ev.getHistoricalX(p, h), ev.getHistoricalY(p, h));
        }
    }

    System.out.printf("At time %d:", ev.getEventTime());
    for (int p = 0; p < pointerCount; p++) {
        System.out.printf("  pointer %d: (%f,%f)",
        ev.getPointerId(p), ev.getX(p), ev.getY(p));
    }
}

いくつかのポインターに対していくつかの配列を作成する必要があります。a を使用しHashMap<Integer, List<Point>>て、ポインター ID からPointそのポインターの のリストにマップできます。

MotionEvent上に投稿した例のガイドは次のとおりです。

http://developer.android.com/reference/android/view/MotionEvent.html

編集:コードをニーズに合わせようとしました:

private HashMap<Integer, List<Point>> myPoints;

private void addPoints(MotionEvent ev) {
    final int historySize = ev.getHistorySize();
    final int pointerCount = ev.getPointerCount();
    for (int h = 0; h < historySize; h++) {
        for (int p = 0; p < pointerCount; p++) {
            addPoint(ev.getPointerId(p), new Point(ev.getHistoricalX(p, h), ev.getHistoricalY(p, h)));
        }
    }

    System.out.printf("At time %d:", ev.getEventTime());
    for (int p = 0; p < pointerCount; p++) {
        addPoint(ev.getPointerId(p), new Point(ev.getHistoricalX(p, h), ev.getHistoricalY(p, h)));
    }
}

private void addPoint(Integer pointerId, Point point) {
    List<Point> points = myPointers.get(pointerId);

    if (points == null) {
        points = new LinkedList<Point>();
        myPointers.put(pointerId, points);
    }

    myPointers.get(pointerId).add(point);
}
于 2013-05-11T07:40:32.770 に答える