1

画面上で指をドラッグするとオブジェクトが動くゲームを作ろうとしています。メイン ループでは、指の動きに基づいてオブジェクトの位置を更新します。

電話で指を一定の距離だけ移動すると、オブジェクトも同じ距離だけ移動します。これは 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;
}
4

1 に答える 1