画面上で指をドラッグするとオブジェクトが動くゲームを作ろうとしています。メイン ループでは、指の動きに基づいてオブジェクトの位置を更新します。
電話で指を一定の距離だけ移動すると、オブジェクトも同じ距離だけ移動します。これは Nexus 7 では機能しますが、Droid X (Gingerbread) では、オブジェクトは指ほど速く動きません。たとえば、指を画面全体にドラッグしても、オブジェクトはその距離の半分しか移動しません。モーションも予測不可能に感じます (遠くに移動する場合もあれば、少ししか移動しない場合もあります)。何が原因でしょうか?
libgdx を使用しています。メイン ループでは、オブジェクトの x と y に dx と dy を追加します。
これがタッチイベントです(画面上のすべての指を配列に保存し、最初の指にのみアクセスしています)。sp は一時的なベクトルです。
@Override
public boolean touchDown(int screenX, int screenY, int pointer, int button) {
for (int i = 0; i < MAX_TOUCHPOINTS; i++) {
if (touchIDs[i] == -1) {
touchIDs[i] = pointer;
if (i == 0) {
sp.x = screenX;
sp.y = screenY;
camera.unproject(sp);
prevX = sp.x;
prevY = sp.y;
}
break;
}
}
return true;
}
@Override
public boolean touchUp(int screenX, int screenY, int pointer, int button) {
int location = -1;
for (int i = 0; i < MAX_TOUCHPOINTS; i++) {
if (touchIDs[i] == pointer) {
location = i;
break;
}
}
if (location == -1)
return false;
for (int i = location; i < MAX_TOUCHPOINTS - 1; i++) {
touchIDs[i] = touchIDs[i + 1];
}
touchIDs[MAX_TOUCHPOINTS - 1] = -1;
if (touchIDs[0] != -1) {
sp.x = Gdx.input.getX(touchIDs[0]);
sp.y = Gdx.input.getY(touchIDs[0]);
camera.unproject(sp);
prevX = sp.x;
prevY = sp.y;
}
return true;
}
@Override
public boolean touchDragged(int screenX, int screenY, int pointer) {
if (pointer == touchIDs[0]) {
sp.x = screenX;
sp.y = screenY;
camera.unproject(sp);
dx = sp.x - prevX;
dy = sp.y - prevY;
prevX = sp.x;
prevY = sp.y;
return true;
}
return false;
}