モーションイベントは多くの場合、複数の座標であるため、通常、これは発生しないはずです。たぶん、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
ので、historySize
2の場合、ループは1回だけ繰り返されます。
編集
問題は見つかりませんでしたが、解決策を見つけました。
を使用する代わりに、外出先で発生しmotionEvent history
た座標を保存します。toucheEvent
touchEvent
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で同等の名前を探してください(コードはそのまま機能するため、名前を変更しませんでした)。