0

onTouchで描画されるパスに沿ってスプライトを移動する必要があります。そのために、PathとPathModifierを使用しています。

case MotionEvent.ACTION_UP:

        int historySize = pSceneTouchEvent.getMotionEvent().getHistorySize();
        pointX = new float[historySize];
        pointY = new float[historySize];

        for (int i = 1; i < historySize; i++) {

            pointX[i] = pSceneTouchEvent.getMotionEvent().getHistoricalX(i);
            pointY[i] = pSceneTouchEvent.getMotionEvent().getHistoricalY(i);

        }
        path = new path(pointX,pointY);
        PathModifier pathModifier = new PathModifier(2.5f, path);
        pathModifier.setRemoveWhenFinished(true);
        sprite1.clearEntityModifiers();
        sprite1.registerEntityModifier(pathModifier);

        break; 

パスには少なくとも2つのウェイポイントが必要なので、エラーが発生します。なぜそうなのか?

4

1 に答える 1

1

モーションイベントは多くの場合、複数の座標であるため、通常、これは発生しないはずです。たぶん、historySizeが本当に2より大きいかどうかをテストする必要があります。さらに、スプライトの開始座標を追加できます。そうしないと、スプライトが最初のタッチポイントに向かって「ジャンプ」します(ただし、それはあなたの質問ではありませんでした)。

これは実際には違いはありません–ただ別の可能性:

path= new Path(historySize);
for (int i = 0; i < historySize; i++) {
      float x = pSceneTouchEvent.getMotionEvent().getHistoricalX(i);
      float y = pSceneTouchEvent.getMotionEvent().getHistoricalY(i);
      path.to(x,y);
}

さらに、forループをで開始することに気づいたint i=1ので、historySize2の場合、ループは1回だけ繰り返されます。

編集

問題は見つかりませんでしたが、解決策を見つけました。
を使用する代わりに、外出先で発生しmotionEvent historyた座標を保存します。toucheEventtouchEvent

ArrayList<Float> xCoordinates; // this is where you store all x coordinates of the touchEvents
ArrayList<Float> yCoordinates; // and here will be the y coordinates.

onSceneTouchEvent(TouchEvent sceneTouchEvent){
    switch(sceneTouchEvent.getAction()){
        case (TouchEvent.ACTION_DOWN):{  
            // init the list every time a new touchDown is registered
            xCoordinates = new ArrayList<Float>();   
            yCoordinates = new ArrayList<Float>();               
            break;
        }
        case (TouchEvent.ACTION_MOVE): {
            // while moving, store all touch points in the lists
            xCoordinates.add(sceneTouchEvent.getX());  
            yCoordinates.add(sceneTouchEvent.getY());
            break;
        }
        case (TouchEvent.ACTION_UP): {
            // when the event is finished, create the path and make the sprite move
            // instead of the history size use the size of your own lists

            Path path = new Path(xCoordinates.size());  
            for (int i = 0; i < xCoordinates.size(); i++) {
                path.to(xCoordinates.get(i), yCoordinates.get(i));  // add the coordinates to the path one by one
            }

            // do the rest and make the sprite move
            PathModifier pathModifier = new PathModifier(2.5f, path);
            pathModifier.setAutoUnregisterWhenFinished(true);
            sprite1.clearEntityModifiers();
            sprite1.registerEntityModifier(pathModifier);
            break;
        }
    }

私はこれを私の電話(デバッグモードでは実行されません)でテストしましたが、正常に動作します。ただし、例外がスローされないことを確認するには、xCoordinatesリストが1より大きいかどうかを常にテストする必要があります。ただし、例外がスローされる可能性は非常に高くなります。

少なくとも元の問題を回避するのに役立つことを願っています。一部のメソッドの名前が異なることに気付きました(例:setAutoUnregisterWhenFinished(true);)AndEngine GLES1を使用していると思いますか?私はGLES2を使用しているので、コードに別の名前が含まれている場合でも、心配する必要はありません。GLES1で同等の名前を探してください(コードはそのまま機能するため、名前を変更しませんでした)。

  • クリストフ
于 2013-03-18T21:16:31.963 に答える