1

我正在尝试制作一个游戏,其中当手指在屏幕上拖动时对象会移动。在主循环中,我根据手指的运动更新对象的位置。

在手机上移动手指一定距离应该移动相同距离的对象。这适用于 Nexus 7,但在 Droid X(姜饼)上,对象的移动速度不如手指快。例如,如果我将手指一直拖过屏幕,则对象仅移动该距离的一半。运动也感觉不可预测(有时它移动得更远,有时它只移动一点)。什么可能导致这种情况?

我正在使用 libgdx。在主循环中,我将 dx 和 dy 添加到对象的 x 和 y 中。

这是触摸事件(我将屏幕上的所有手指存储在一个数组中,并且只访问第一个手指)。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

2

我在浏览您的代码时遇到了一些麻烦,但是我有一些可能对您有用的东西,因为我曾经构建了一个触摸滚动系统。

Libgdx 已经有一个用于跟踪触摸移动的内置函数。

Gdx.input.getDeltaX() Gdx.input.getDeltaY()

这些函数将产生一个表示距离变化的值。因此,您可以简单地将这个值添加到您用来存储您希望滚动的位置的值中。

我希望这会有所帮助。

于 2016-02-04T02:50:02.770 回答