0

libGDX InputProcessor の touchDown() 内で、画面タッチごとに新しい TouchPoint 長方形オブジェクトを作成する方法を開発しています。

作成可能な TouchPoint 長方形の最大数を 2 つに制限しようとしました。画面を 2 回タッチするだけで作業できます。一意の各オブジェクトは、touchDragged() 内で新しい画面タッチ位置に更新してから、touchUp() で削除する必要があります。

1回のタッチでは目的の結果を作成できましたが、複数の画面タッチでは作成できませんでした。2 回目の同時タッチでは、TouchPoint 四角形オブジェクトが最初のタッチから消え、2 番目のタッチ位置に表示されます。2 回目のタッチの touchUp() で、オブジェクトは最初のタッチのタッチ位置に再表示されます。

  1. コード ロジックのどの部分にエラーが含まれていますか?
  2. どうすれば修正できますか?

    /*experiment*/
    public Vector3 tps[] = new Vector3[2];
    /*experiment*/
    
    @Override
    public boolean touchDown(int screenX, int screenY, int pointer, int button) {
    
    /*experiment*/
    if(pointer < 2){
        if(pointer == 0) {
            Vector3 touchPosition1 = new Vector3();
            tps[pointer] = touchPosition1;
            tps[pointer].set(screenX, screenY, 0);
            gameScreen.getWorldRenderer().getCamera().unproject(tps[pointer]);
            touchPoint1 = new TouchPoint(52, 52, new Vector2(tps[pointer].x - 26, tps[pointer].y - 26));
            gameScreen.getWorld().getTouchPoints().add(touchPoint1);
    
            Gdx.app.log("TOUCH DOWN", "pointer: " + pointer + " x: " + tps[pointer].x + " y: " + tps[pointer].y);
        }
    
        if(pointer == 1) {
        Vector3 touchPosition2 = new Vector3();
        tps[pointer] = touchPosition2;
        tps[pointer].set(screenX, screenY, 0);
        gameScreen.getWorldRenderer().getCamera().unproject(tps[pointer]);
        touchPoint2 = new TouchPoint(52, 52, new Vector2(tps[pointer].x - 26, tps[pointer].y - 26));
        gameScreen.getWorld().getTouchPoints().add(touchPoint2);
    
        Gdx.app.log("TOUCH DOWN", "pointer: " + pointer + " x: " + tps[pointer].x + " y: " + tps[pointer].y);
        }
    
    }
    
    return false;
    }
    
    @Override
    public boolean touchUp(int screenX, int screenY, int pointer, int button) {
    /*experiment*/
    gameScreen.getWorld().getTouchPoints().removeIndex(pointer);
    //note: dispose of unused vector3 objects
    //note: dispose of all other unused objects
    /*experiment*/
    
    return false;
    }
    
    @Override
    public boolean touchDragged(int screenX, int screenY, int pointer) {
    /*experiment*/
    tps[pointer].set(screenX, screenY, 0);
    gameScreen.getWorldRenderer().getCamera().unproject(tps[pointer]);
    
    for(TouchPoint tp: gameScreen.getWorld().getTouchPoints()) {
        tp.moveRectangleToPosition(new Vector2(tps[pointer].x - 26, tps[pointer].y - 26));
        tp.updateRectangleBoundaries();
    }
    
    Gdx.app.log("TOUCH DRAGGING", "pointer: " + pointer + " x: " + tps[pointer].x + " y: " + tps[pointer].y);
    /*experiment*/
    
    }  
    

さらに、3 回目の画面タッチが発生すると、プログラムがクラッシュします。
LogCat:

08-27 14:08:31.808: W/dalvikvm(9988): threadid=11: thread exiting with uncaught exception (group=0x41711438)
08-27 14:08:31.808: E/AndroidRuntime(9988): FATAL EXCEPTION: GLThread 40874
08-27 14:08:31.808: E/AndroidRuntime(9988): java.lang.IndexOutOfBoundsException: 2
08-27 14:08:31.808: E/AndroidRuntime(9988):     at com.badlogic.gdx.utils.Array.removeIndex(Array.java:229)
08-27 14:08:31.808: E/AndroidRuntime(9988):     at com.manytouches.controller.InputHandler.touchUp(InputHandler.java:104)

御時間ありがとうございます。

4

1 に答える 1

0

チェックを適用する

If(ポインタ<2) .....

タッチアップとタッチドラッグでも...タッチアップイベントで例外が発生しています

また、タッチポイントにarraylistを使用しているため、タッチダウン時にタッチポイントを追加すると、リストの最後にオブジェクトが追加されるため、これが原因である可能性があります...したがって、配列リストの代わりに画面にタッチポイントの配列を作成します

if pointer==1 または ==0 を使用する代わりに、コードを汎用にすることができます。できることは、inputprocessor でタッチポイントの配列を作成し、値を Touchpoint[pointer].set(x,y,z) として割り当てることです。両方の条件で同じことをしているので、コードを読みやすくします。

于 2013-08-28T03:55:00.530 に答える